aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2015-01-30 17:00:24 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2015-01-30 17:00:24 -0500
commite4767514ed04e6a0bddf3f4a47f5f0b09e65e0ee (patch)
tree86cadc2137831d44fa29fd40a2964f7fb1326de4 /SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
parent26ddfe11c2b7fac52e5f57dcd9f5223a50b2a9a7 (diff)
parent016003905ca0e8e459e3dc33e786beda8ec92f45 (diff)
Merge tag 'upstream/3.0.2'
Upstream version 3.0.2 # gpg: Signature made Fri 30 Jan 2015 05:00:11 PM EST using RSA key ID EBE9BD91 # gpg: Good signature from "Unit 193 <unit193@gmail.com>" # gpg: aka "Unit 193 <unit193@ninthfloor.org>" # gpg: aka "Unit 193 <unit193@ubuntu.com>"
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp58
1 files changed, 43 insertions, 15 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
index 7555714..d064cb1 100644
--- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
@@ -44,11 +44,12 @@ void TableModifier::alterTable(SqliteCreateTablePtr newCreateTable)
sqls << newCreateTable->detokenize();
copyDataTo(newCreateTable);
+ handleFks(tempTableName);
+
// If temp table was created, it means that table name hasn't changed. In that case we need to cleanup temp table (drop it).
// Otherwise, the table name has changed, therefor there still remains the old table which we copied data from - we need to drop it here.
sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempTableName.isNull() ? originalTable : tempTableName, dialect));
- handleFks();
handleIndexes();
handleTriggers();
handleViews();
@@ -92,7 +93,7 @@ void TableModifier::copyDataTo(const QString& targetTable)
copyDataTo(targetTable, colsToCopy, colsToCopy);
}
-void TableModifier::handleFks()
+void TableModifier::handleFks(const QString& tempTableName)
{
SchemaResolver resolver(db);
@@ -108,10 +109,11 @@ void TableModifier::handleFks()
continue;
}
+ subModifier.usedTempTableNames = usedTempTableNames;
subModifier.tableColMap = tableColMap;
subModifier.existingColumns = existingColumns;
subModifier.newName = newName;
- subModifier.subHandleFks(originalTable);
+ subModifier.subHandleFks(originalTable, tempTableName);
sqls += subModifier.generateSqls();
modifiedTables << fkTable;
@@ -125,18 +127,18 @@ void TableModifier::handleFks()
}
}
-void TableModifier::subHandleFks(const QString& oldName)
+void TableModifier::subHandleFks(const QString& oldName, const QString& oldTempName)
{
bool modified = false;
foreach (SqliteCreateTable::Constraint* fk, createTable->getForeignKeysByTable(oldName))
{
- if (subHandleFks(fk->foreignKey, oldName))
+ if (subHandleFks(fk->foreignKey, oldName, oldTempName))
modified = true;
}
foreach (SqliteCreateTable::Column::Constraint* fk, createTable->getColumnForeignKeysByTable(oldName))
{
- if (subHandleFks(fk->foreignKey, oldName))
+ if (subHandleFks(fk->foreignKey, oldName, oldTempName))
modified = true;
}
@@ -151,19 +153,29 @@ void TableModifier::subHandleFks(const QString& oldName)
copyDataTo(originalTable);
+ handleFks(tempName);
+
sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempName, dialect));
simpleHandleIndexes();
simpleHandleTriggers();
}
-bool TableModifier::subHandleFks(SqliteForeignKey* fk, const QString& oldName)
+bool TableModifier::subHandleFks(SqliteForeignKey* fk, const QString& oldName, const QString& oldTempName)
{
+ // If table was not renamed (but uses temp table name), we will rename temp name into target name.
+ // If table was renamed, we will rename old name to new name.
bool modified = false;
// Table
if (handleName(oldName, fk->foreignTable))
modified = true;
+ else if (!oldTempName.isNull() && fk->foreignTable.compare(oldName, Qt::CaseInsensitive) == 0)
+ {
+ // This is the case when main table was not renamed - we will stay with the original name, but we need to mark it as modified,
+ // so the table gets recreated (the temp table is changed to the original table name in this FK).
+ modified = true;
+ }
// Columns
if (handleIndexedColumns(fk->indexedColumns))
@@ -354,9 +366,16 @@ void TableModifier::handleIndex(SqliteCreateIndexPtr index)
{
handleName(originalTable, index->table);
handleIndexedColumns(index->indexedColumns);
- index->rebuildTokens();
- sqls << index->detokenize();
- modifiedIndexes << index->index;
+ if (index->indexedColumns.size() > 0)
+ {
+ index->rebuildTokens();
+ sqls << index->detokenize();
+ modifiedIndexes << index->index;
+ }
+ else
+ {
+ warnings << QObject::tr("All columns indexed by the index %1 are gone. The index will not be recreated after table modification.").arg(index->index);
+ }
// TODO partial index needs handling expr here
}
@@ -388,9 +407,16 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger)
}
trigger->queries = newQueries;
- trigger->rebuildTokens();
- sqls << trigger->detokenize();
- modifiedTriggers << trigger->trigger;
+ if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF && trigger->event->columnNames.size() == 0)
+ {
+ warnings << QObject::tr("All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification.").arg(trigger->trigger);
+ }
+ else
+ {
+ trigger->rebuildTokens();
+ sqls << trigger->detokenize();
+ modifiedTriggers << trigger->trigger;
+ }
}
void TableModifier::handleViews()
@@ -688,8 +714,10 @@ void TableModifier::parseDdl()
this->createTable = createTable;
}
-QString TableModifier::getTempTableName() const
+QString TableModifier::getTempTableName()
{
SchemaResolver resolver(db);
- return resolver.getUniqueName("sqlitestudio_temp_table");
+ QString name = resolver.getUniqueName("sqlitestudio_temp_table", usedTempTableNames);
+ usedTempTableNames << name;
+ return name;
}