diff options
| author | 2021-12-17 07:06:30 -0500 | |
|---|---|---|
| committer | 2021-12-17 07:06:30 -0500 | |
| commit | 1fdc150116cad39aae5c5da407c3312b47a59e3a (patch) | |
| tree | 123c79a4d7ad2d45781ba03ce939f7539fb428d8 /SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp | |
| parent | feda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (diff) | |
New upstream version 3.3.3+dfsg1.upstream/3.3.3+dfsg1
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp | 138 |
1 files changed, 22 insertions, 116 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp b/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp index 542668b..99110a0 100644 --- a/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp @@ -4,7 +4,7 @@ #include "datatype.h" #include "services/notifymanager.h" #include "db/attachguard.h" -#include "dbversionconverter.h" +#include "common/compatibility.h" #include <QDebug> #include <QThreadPool> @@ -30,23 +30,21 @@ DbObjectOrganizer::~DbObjectOrganizer() { safe_delete(srcResolver); safe_delete(dstResolver); - safe_delete(versionConverter); } void DbObjectOrganizer::init() { - versionConverter = new DbVersionConverter(); connect(this, SIGNAL(preparetionFinished()), this, SLOT(processPreparationFinished())); } void DbObjectOrganizer::copyObjectsToDb(Db* srcDb, const QStringList& objNames, Db* dstDb, bool includeData, bool includeIndexes, bool includeTriggers) { - copyOrMoveObjectsToDb(srcDb, objNames.toSet(), dstDb, includeData, includeIndexes, includeTriggers, false); + copyOrMoveObjectsToDb(srcDb, toSet(objNames), dstDb, includeData, includeIndexes, includeTriggers, false); } void DbObjectOrganizer::moveObjectsToDb(Db* srcDb, const QStringList& objNames, Db* dstDb, bool includeData, bool includeIndexes, bool includeTriggers) { - copyOrMoveObjectsToDb(srcDb, objNames.toSet(), dstDb, includeData, includeIndexes, includeTriggers, true); + copyOrMoveObjectsToDb(srcDb, toSet(objNames), dstDb, includeData, includeIndexes, includeTriggers, true); } void DbObjectOrganizer::interrupt() @@ -94,7 +92,7 @@ void DbObjectOrganizer::reset() srcTriggers.clear(); srcViews.clear(); renamed.clear(); - srcTable = QString::null; + srcTable = QString(); includeData = false; includeIndexes = false; includeTriggers = false; @@ -102,7 +100,6 @@ void DbObjectOrganizer::reset() referencedTables.clear(); diffListToConfirm.clear(); errorsToConfirm.clear(); - binaryColumns.clear(); safe_delete(srcResolver); safe_delete(dstResolver); interrupted = false; @@ -155,7 +152,6 @@ void DbObjectOrganizer::processPreparation() { case SchemaResolver::TABLE: srcTables << srcName; - findBinaryColumns(srcName, allParsedObjects); collectReferencedTables(srcName, allParsedObjects); collectReferencedIndexes(srcName); collectReferencedTriggersForTable(srcName); @@ -174,7 +170,7 @@ void DbObjectOrganizer::processPreparation() } } - if (referencedTables.size() > 0 && !execConfirmFunctionInMainThread(referencedTables.toList())) + if (referencedTables.size() > 0 && !execConfirmFunctionInMainThread(referencedTables.values())) referencedTables.clear(); for (const QString& srcTable : referencedTables) @@ -183,8 +179,6 @@ void DbObjectOrganizer::processPreparation() collectReferencedTriggersForTable(srcTable); } - collectDiffs(details); - emit preparetionFinished(); } @@ -396,7 +390,6 @@ bool DbObjectOrganizer::copyTableToDb(const QString& table) ddl = srcResolver->getObjectDdl(table, SchemaResolver::TABLE); } - ddl = convertDdlToDstVersion(ddl); if (ddl.trimmed() == ";") // empty query, result of ignored errors in UI return true; @@ -439,9 +432,8 @@ bool DbObjectOrganizer::copyTableToDb(const QString& table) bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table) { QStringList srcColumns = srcResolver->getTableColumns(srcTable); - QString wrappedSrcTable = wrapObjIfNeeded(srcTable, srcDb->getDialect()); + QString wrappedSrcTable = wrapObjIfNeeded(srcTable); SqlQueryPtr results = srcDb->prepare("SELECT * FROM " + wrappedSrcTable); - setupSqlite2Helper(results, table, srcColumns); if (!results->execute()) { notifyError(tr("Error while copying data for table %1: %2").arg(table).arg(results->getErrorText())); @@ -452,7 +444,7 @@ bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table) for (int i = 0, total = srcColumns.size(); i < total; ++i) argPlaceholderList << "?"; - QString wrappedDstTable = wrapObjIfNeeded(table, dstDb->getDialect()); + QString wrappedDstTable = wrapObjIfNeeded(table); QString sql = "INSERT INTO " + wrappedDstTable + " VALUES (" + argPlaceholderList.join(", ") + ")"; SqlQueryPtr insertQuery = dstDb->prepare(sql); @@ -488,8 +480,8 @@ bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table) bool DbObjectOrganizer::copyDataUsingAttach(const QString& table) { - QString wrappedSrcTable = wrapObjIfNeeded(srcTable, srcDb->getDialect()); - QString wrappedDstTable = wrapObjIfNeeded(table, srcDb->getDialect()); + QString wrappedSrcTable = wrapObjIfNeeded(srcTable); + QString wrappedDstTable = wrapObjIfNeeded(table); SqlQueryPtr results = srcDb->exec("INSERT INTO " + attachName + "." + wrappedDstTable + " SELECT * FROM " + wrappedSrcTable); if (results->isError()) { @@ -499,23 +491,6 @@ bool DbObjectOrganizer::copyDataUsingAttach(const QString& table) return true; } -void DbObjectOrganizer::setupSqlite2Helper(SqlQueryPtr query, const QString& table, const QStringList& colNames) -{ - Sqlite2ColumnDataTypeHelper* sqlite2Helper = dynamic_cast<Sqlite2ColumnDataTypeHelper*>(query.data()); - if (sqlite2Helper && binaryColumns.contains(table)) - { - int i = 0; - QStringList binCols = binaryColumns[table]; - for (const QString& colName : colNames) - { - if (binCols.contains(colName)) - sqlite2Helper->setBinaryType(i); - - i++; - } - } -} - void DbObjectOrganizer::dropTable(const QString& table) { dropObject(table, "TABLE"); @@ -528,7 +503,7 @@ void DbObjectOrganizer::dropView(const QString& view) void DbObjectOrganizer::dropObject(const QString& name, const QString& type) { - QString wrappedSrcObj = wrapObjIfNeeded(name, srcDb->getDialect()); + QString wrappedSrcObj = wrapObjIfNeeded(name); SqlQueryPtr results = srcDb->exec("DROP " + type + " " + wrappedSrcObj); if (results->isError()) { @@ -555,29 +530,28 @@ bool DbObjectOrganizer::copyTriggerToDb(const QString& trigger) bool DbObjectOrganizer::copySimpleObjectToDb(const QString& name, const QString& errorMessage) { QString ddl = srcResolver->getObjectDdl(name, SchemaResolver::ANY); - QString convertedDdl = convertDdlToDstVersion(ddl); - if (convertedDdl.trimmed() == ";") // empty query, result of ignored errors in UI + if (ddl.trimmed() == ";") // empty query, result of ignored errors in UI return true; SqlQueryPtr result; if (!attachName.isNull()) { - convertedDdl = prefixSimpleObjectWithAttachName(name, convertedDdl); - if (convertedDdl.isNull()) + ddl = prefixSimpleObjectWithAttachName(name, ddl); + if (ddl.isNull()) return false; - result = srcDb->exec(convertedDdl); + result = srcDb->exec(ddl); } else { - result = dstDb->exec(convertedDdl); + result = dstDb->exec(ddl); } if (result->isError()) { notifyError(errorMessage.arg(result->getErrorText())); - qDebug() << "DDL that caused error in DbObjectOrganizer::copySimpleObjectToDb():" << ddl << "\nAfter converting:" << convertedDdl; + qDebug() << "DDL that caused error in DbObjectOrganizer::copySimpleObjectToDb():" << ddl; return false; } @@ -586,53 +560,14 @@ bool DbObjectOrganizer::copySimpleObjectToDb(const QString& name, const QString& QSet<QString> DbObjectOrganizer::resolveReferencedTables(const QString& table, const QList<SqliteCreateTablePtr>& parsedTables) { - QSet<QString> tables = SchemaResolver::getFkReferencingTables(table, parsedTables).toSet(); + QSet<QString> tables = toSet(SchemaResolver::getFkReferencingTables(table, parsedTables)); for (const QString& fkTable : tables) - tables += SchemaResolver::getFkReferencingTables(fkTable, parsedTables).toSet(); + tables += toSet(SchemaResolver::getFkReferencingTables(fkTable, parsedTables)); tables.remove(table); // if it appeared somewhere in the references - we still don't need it here, it's the table we asked by in the first place return tables; } -void DbObjectOrganizer::collectDiffs(const StrHash<SchemaResolver::ObjectDetails>& details) -{ - if (srcDb->getVersion() == dstDb->getVersion()) - return; - - - int dstVersion = dstDb->getVersion(); - QSet<QString> names = srcTables + srcViews + referencedTables + srcIndexes + srcTriggers; - for (const QString& name : names) - { - if (!details.contains(name)) - { - qCritical() << "Object named" << name << "not found in details when trying to prepare Diff for copying or moving object."; - continue; - } - - versionConverter->reset(); - if (dstVersion == 3) - versionConverter->convert2To3(details[name].ddl); - else - versionConverter->convert3To2(details[name].ddl); - - diffListToConfirm += versionConverter->getDiffList(); - if (!versionConverter->getErrors().isEmpty()) - errorsToConfirm[name] = versionConverter->getErrors(); - } -} - -QString DbObjectOrganizer::convertDdlToDstVersion(const QString& ddl) -{ - if (srcDb->getVersion() == dstDb->getVersion()) - return ddl; - - if (dstDb->getVersion() == 3) - return versionConverter->convert2To3(ddl); - else - return versionConverter->convert3To2(ddl); -} - void DbObjectOrganizer::collectReferencedTables(const QString& table, const StrHash<SqliteQueryPtr>& allParsedObjects) { QList<SqliteCreateTablePtr> parsedTables; @@ -654,50 +589,21 @@ void DbObjectOrganizer::collectReferencedTables(const QString& table, const StrH void DbObjectOrganizer::collectReferencedIndexes(const QString& table) { - srcIndexes += srcResolver->getIndexesForTable(table).toSet(); + srcIndexes += toSet(srcResolver->getIndexesForTable(table)); } void DbObjectOrganizer::collectReferencedTriggersForTable(const QString& table) { - srcTriggers += srcResolver->getTriggersForTable(table).toSet(); + srcTriggers += toSet(srcResolver->getTriggersForTable(table)); } void DbObjectOrganizer::collectReferencedTriggersForView(const QString& view) { - srcTriggers += srcResolver->getTriggersForView(view).toSet(); -} - -void DbObjectOrganizer::findBinaryColumns(const QString& table, const StrHash<SqliteQueryPtr>& allParsedObjects) -{ - if (!allParsedObjects.contains(table)) - { - qWarning() << "Parsed objects don't have table" << table << "in DbObjectOrganizer::findBinaryColumns()"; - return; - } - - SqliteQueryPtr query = allParsedObjects[table]; - SqliteCreateTablePtr createTable = query.dynamicCast<SqliteCreateTable>(); - if (!createTable) - { - qWarning() << "Not CreateTable in DbObjectOrganizer::findBinaryColumns()"; - return; - } - - for (SqliteCreateTable::Column* column : createTable->columns) - { - if (!column->type) - continue; - - if (DataType::isBinary(column->type->name)) - binaryColumns[table] << column->name; - } + srcTriggers += toSet(srcResolver->getTriggersForView(view)); } bool DbObjectOrganizer::setFkEnabled(bool enabled) { - if (dstDb->getVersion() == 2) - return true; - SqlQueryPtr result = dstDb->exec(QString("PRAGMA foreign_keys = %1").arg(enabled ? "on" : "off")); if (result->isError()) { @@ -766,7 +672,7 @@ bool DbObjectOrganizer::execConfirmFunctionInMainThread(const QStringList& table QString DbObjectOrganizer::prefixSimpleObjectWithAttachName(const QString& objName, const QString& ddl) { - Parser parser(srcDb->getDialect()); + Parser parser; if (!parser.parse(ddl)) { qDebug() << "Parsing error while copying or moving object:" << objName << ", details:" << parser.getErrorString(); |
