mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-22 06:14:14 +02:00
Write a symbol's link rows in the order it saves them, with its waiting partners
The project database's link table should say what each symbol saves: QETZ-DB-FIRST stage 2a moves link reading and writing to it. Measured over the corpus and 25 kinds of edit, its rows disagreed with the file for three reasons; this fixes the one in the database: - rows followed the order partners were built in, not the order the symbol saves them (11 symbols, mostly .qetz files where an edit built a partner's folio, with lazy folios); - the rows were written by three pieces of code with three rules: the rebuild and the flush from the built partners then the waiting ones, the save from its own list. Element::linksToSave() is now that one list: the order the symbol was saved with, then partners linked since, a partner on a folio not built included. toXml() writes it and the database's rows are written from it (projectDataBase::insertLinkRows()), with their place in a new ord column of the in-memory table (the .qetz file's own link table is not touched). A built partner the project no longer has, on a removed folio, still gets no row, as before. The other two reasons are not here: symbols sharing a uuid (PR #1522) and links saved to symbols on a removed folio (F113), which the save will stop writing once it writes from the database (stage 2a-2). QET_CHECK_LINK_ROWS=1 says at each save whether the rows are what the symbols save, without building any folio. tst_resaveunchanged linkRowsAfterLazyEdit moves a symbol of m_000 as a .qetz with lazy folios: with the previous order, 2 symbols differ. No saved byte changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XCdg2Er2vYhB8Vwa5G7fSR
This commit is contained in:
@@ -411,14 +411,15 @@ private slots:
|
||||
|
||||
// QElectroTech run in a sandbox of its own with @p args, the store
|
||||
// check on (QET_CHECK_ELEMENT_INFO_STORE); its output
|
||||
QString runChecked(const QStringList &args, bool eager = false)
|
||||
QString runChecked(const QStringList &args, bool eager = false,
|
||||
const char *check = "QET_CHECK_ELEMENT_INFO_STORE")
|
||||
{
|
||||
const QString home = m_dir.filePath(QStringLiteral("home%1").arg(m_run++));
|
||||
QDir().mkpath(home);
|
||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||
env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen"));
|
||||
env.insert(QStringLiteral("QET_ENABLE_SCRIPTING"), QStringLiteral("1"));
|
||||
env.insert(QStringLiteral("QET_CHECK_ELEMENT_INFO_STORE"), QStringLiteral("1"));
|
||||
env.insert(QString::fromLatin1(check), QStringLiteral("1"));
|
||||
if (eager) {
|
||||
env.insert(QStringLiteral("QET_EAGER_FOLIOS"), QStringLiteral("1")); //every folio built on opening
|
||||
}
|
||||
@@ -452,6 +453,31 @@ private slots:
|
||||
QVERIFY2(out.contains(QStringLiteral("wire properties store: 0 differ")), qPrintable(out.right(600)));
|
||||
}
|
||||
|
||||
// The link rows say what each symbol saves, in its order, also after
|
||||
// an edit builds a partner's folio (lazy folios): m_000 as a .qetz
|
||||
// saved with every folio built, a symbol of its middle folio moved. The rows used to follow the order
|
||||
// the partners were built in (QETZ-DB-FIRST stage 2a).
|
||||
void linkRowsAfterLazyEdit()
|
||||
{
|
||||
const QString qetz = m_dir.filePath(QStringLiteral("links%1.qetz").arg(m_run));
|
||||
QVERIFY(!runChecked({QStringLiteral("--resave"),
|
||||
QStringLiteral(QET_EXAMPLES_DIR "/m_000.qet"), qetz}, true).isEmpty());
|
||||
const QString saved = m_dir.filePath(QStringLiteral("links-moved%1.qetz").arg(m_run));
|
||||
const QString js = m_dir.filePath(QStringLiteral("links%1.js").arg(m_run));
|
||||
QFile script(js);
|
||||
QVERIFY(script.open(QIODevice::WriteOnly));
|
||||
script.write(QStringLiteral(
|
||||
"var f = Math.floor(qet.folioCount() / 2);\n"
|
||||
"var u = qet.elementUuids(f).slice().sort()[0];\n"
|
||||
"qet.log('MOVED ' + qet.moveElement(f, u, 0, 100));\n"
|
||||
"qet.save('%1');\n").arg(saved).toUtf8());
|
||||
script.close();
|
||||
const QString out = runChecked({QStringLiteral("--run"), js, qetz}, false,
|
||||
"QET_CHECK_LINK_ROWS");
|
||||
QVERIFY2(out.contains(QStringLiteral("MOVED true")), qPrintable(out.right(600)));
|
||||
QVERIFY2(out.contains(QStringLiteral("link rows: 0 differ")), qPrintable(out.right(600)));
|
||||
}
|
||||
|
||||
// The stores filled from the document before the folios are built
|
||||
// hold what building them gives, for a
|
||||
// project saved by this version (every symbol, folio and wire carries
|
||||
|
||||
Reference in New Issue
Block a user