aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp71
1 files changed, 38 insertions, 33 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp b/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp
index 99110a0..1c206f9 100644
--- a/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/dbobjectorganizer.cpp
@@ -1,7 +1,6 @@
#include "dbobjectorganizer.h"
#include "db/db.h"
#include "common/utils_sql.h"
-#include "datatype.h"
#include "services/notifymanager.h"
#include "db/attachguard.h"
#include "common/compatibility.h"
@@ -198,7 +197,7 @@ bool DbObjectOrganizer::processAll()
// Attaching target db if needed
AttachGuard attach;
- if (!(referencedTables + srcTables).isEmpty())
+ if (srcDb->getTypeClassName() == dstDb->getTypeClassName() && !(referencedTables + srcTables).isEmpty())
{
attach = srcDb->guardedAttach(dstDb, true);
attachName = attach->getName();
@@ -431,12 +430,16 @@ bool DbObjectOrganizer::copyTableToDb(const QString& table)
bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table)
{
- QStringList srcColumns = srcResolver->getTableColumns(srcTable);
+ static_qstring(selectTpl, "SELECT %1 FROM %2");
+ static_qstring(insertTpl, "INSERT INTO %1 (%2) VALUES (%3)");
+
+ QStringList srcColumns = srcResolver->getTableColumns(srcTable, true);
+ QString srcColumnsStr = srcColumns.join(", ");
QString wrappedSrcTable = wrapObjIfNeeded(srcTable);
- SqlQueryPtr results = srcDb->prepare("SELECT * FROM " + wrappedSrcTable);
+ SqlQueryPtr results = srcDb->prepare(selectTpl.arg(srcColumnsStr, wrappedSrcTable));
if (!results->execute())
{
- notifyError(tr("Error while copying data for table %1: %2").arg(table).arg(results->getErrorText()));
+ notifyError(tr("Error while copying data for table %1: %2").arg(table, results->getErrorText()));
return false;
}
@@ -445,7 +448,7 @@ bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table)
argPlaceholderList << "?";
QString wrappedDstTable = wrapObjIfNeeded(table);
- QString sql = "INSERT INTO " + wrappedDstTable + " VALUES (" + argPlaceholderList.join(", ") + ")";
+ QString sql = insertTpl.arg(wrappedDstTable, srcColumnsStr, argPlaceholderList.join(", "));
SqlQueryPtr insertQuery = dstDb->prepare(sql);
SqlResultsRowPtr row;
@@ -455,14 +458,14 @@ bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table)
row = results->next();
if (!row)
{
- notifyError(tr("Error while copying data to table %1: %2").arg(table).arg(results->getErrorText()));
+ notifyError(tr("Error while copying data to table %1: %2").arg(table, results->getErrorText()));
return false;
}
insertQuery->setArgs(row->valueList());
if (!insertQuery->execute())
{
- notifyError(tr("Error while copying data to table %1: %2").arg(table).arg(insertQuery->getErrorText()));
+ notifyError(tr("Error while copying data to table %1: %2").arg(table, insertQuery->getErrorText()));
return false;
}
@@ -480,12 +483,16 @@ bool DbObjectOrganizer::copyDataAsMiddleware(const QString& table)
bool DbObjectOrganizer::copyDataUsingAttach(const QString& table)
{
+ static_qstring(insertTpl, "INSERT INTO %1.%2 (%3) SELECT %3 FROM %4");
+
QString wrappedSrcTable = wrapObjIfNeeded(srcTable);
QString wrappedDstTable = wrapObjIfNeeded(table);
- SqlQueryPtr results = srcDb->exec("INSERT INTO " + attachName + "." + wrappedDstTable + " SELECT * FROM " + wrappedSrcTable);
+ QStringList srcColumns = srcResolver->getTableColumns(srcTable, true);
+ QString srcColumnsStr = srcColumns.join(", ");
+ SqlQueryPtr results = srcDb->exec(insertTpl.arg(attachName, wrappedDstTable, srcColumnsStr, wrappedSrcTable));
if (results->isError())
{
- notifyError(tr("Error while copying data to table %1: %2").arg(table).arg(results->getErrorText()));
+ notifyError(tr("Error while copying data to table %1: %2").arg(table, results->getErrorText()));
return false;
}
return true;
@@ -508,46 +515,36 @@ void DbObjectOrganizer::dropObject(const QString& name, const QString& type)
if (results->isError())
{
notifyWarn(tr("Error while dropping source view %1: %2\nTables, indexes, triggers and views copied to database %3 will remain.")
- .arg(name).arg(results->getErrorText()).arg(dstDb->getName()));
+ .arg(name, results->getErrorText(), dstDb->getName()));
}
}
bool DbObjectOrganizer::copyViewToDb(const QString& view)
{
- return copySimpleObjectToDb(view, tr("Error while creating view in target database: %1"));
+ return copySimpleObjectToDb(view, tr("Error while creating view in target database: %1"), SchemaResolver::VIEW);
}
bool DbObjectOrganizer::copyIndexToDb(const QString& index)
{
- return copySimpleObjectToDb(index, tr("Error while creating index in target database: %1"));
+ return copySimpleObjectToDb(index, tr("Error while creating index in target database: %1"),SchemaResolver::INDEX);
}
bool DbObjectOrganizer::copyTriggerToDb(const QString& trigger)
{
- return copySimpleObjectToDb(trigger, tr("Error while creating trigger in target database: %1"));
+ return copySimpleObjectToDb(trigger, tr("Error while creating trigger in target database: %1"), SchemaResolver::TRIGGER);
}
-bool DbObjectOrganizer::copySimpleObjectToDb(const QString& name, const QString& errorMessage)
+bool DbObjectOrganizer::copySimpleObjectToDb(const QString& name, const QString& errorMessage, SchemaResolver::ObjectType objectType)
{
- QString ddl = srcResolver->getObjectDdl(name, SchemaResolver::ANY);
+ QString ddl = srcResolver->getObjectDdl(name, objectType);
if (ddl.trimmed() == ";") // empty query, result of ignored errors in UI
return true;
- SqlQueryPtr result;
-
- if (!attachName.isNull())
- {
- ddl = prefixSimpleObjectWithAttachName(name, ddl);
- if (ddl.isNull())
- return false;
-
- result = srcDb->exec(ddl);
- }
- else
- {
- result = dstDb->exec(ddl);
- }
+ ddl = processSimpleObjectAttachNameAndRename(name, ddl);
+ if (ddl.isNull())
+ return false;
+ SqlQueryPtr result = srcDb->exec(ddl);
if (result->isError())
{
notifyError(errorMessage.arg(result->getErrorText()));
@@ -572,7 +569,7 @@ void DbObjectOrganizer::collectReferencedTables(const QString& table, const StrH
{
QList<SqliteCreateTablePtr> parsedTables;
SqliteCreateTablePtr parsedTable;
- for (SqliteQueryPtr query : allParsedObjects.values())
+ for (SqliteQueryPtr& query : allParsedObjects.values())
{
parsedTable = query.dynamicCast<SqliteCreateTable>();
if (parsedTable)
@@ -670,8 +667,11 @@ bool DbObjectOrganizer::execConfirmFunctionInMainThread(const QStringList& table
return res;
}
-QString DbObjectOrganizer::prefixSimpleObjectWithAttachName(const QString& objName, const QString& ddl)
+QString DbObjectOrganizer::processSimpleObjectAttachNameAndRename(const QString& objName, const QString& ddl)
{
+ if (attachName.isNull() && !renamed.contains(objName))
+ return ddl;
+
Parser parser;
if (!parser.parse(ddl))
{
@@ -696,7 +696,12 @@ QString DbObjectOrganizer::prefixSimpleObjectWithAttachName(const QString& objNa
return QString();
}
- ddlWithDb->setTargetDatabase(attachName);
+ if (!attachName.isNull())
+ ddlWithDb->setTargetDatabase(attachName);
+
+ if (renamed.contains(objName))
+ ddlWithDb->setObjectName(renamed[objName]);
+
query->rebuildTokens();
return query->tokens.detokenize();
}