aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2015-02-22 14:06:38 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2015-02-22 14:06:38 -0500
commit6d42c08a54f15ddfdd8ee73643e3ddf8907bccc2 (patch)
tree0a6554677b6a7fea5c81134c0804f0acdb00e632 /SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
parenta0cf2bb71de2b70a2b293c4ce907ecaaf24275bf (diff)
parent306d6d3ca9c9ad774d19135681a7f9805f77035f (diff)
Merge tag 'upstream/3.0.3'
Upstream version 3.0.3 # gpg: Signature made Sun 22 Feb 2015 02:06:37 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>" # gpg: aka "Unit 193 <unit193@ninthfloor.com>"
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp76
1 files changed, 62 insertions, 14 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
index d064cb1..8dc36ee 100644
--- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
@@ -111,11 +111,13 @@ void TableModifier::handleFks(const QString& tempTableName)
subModifier.usedTempTableNames = usedTempTableNames;
subModifier.tableColMap = tableColMap;
+ subModifier.triggerNameToDdlMap = triggerNameToDdlMap;
subModifier.existingColumns = existingColumns;
subModifier.newName = newName;
subModifier.subHandleFks(originalTable, tempTableName);
sqls += subModifier.generateSqls();
modifiedTables << fkTable;
+ triggerNameToDdlMap = subModifier.triggerNameToDdlMap;
modifiedTables += subModifier.getModifiedTables();
modifiedIndexes += subModifier.getModifiedIndexes();
@@ -390,10 +392,67 @@ void TableModifier::handleTriggers()
void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger)
{
- handleName(originalTable, trigger->table);
- if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF)
- handleColumnNames(trigger->event->columnNames);
+ trigger->rebuildTokens();
+ QString originalQueryString = trigger->detokenize();
+ bool forThisTable = (originalTable.compare(trigger->table, Qt::CaseInsensitive) == 0);
+ bool alreadyProcessedOnce = modifiedTriggers.contains(trigger->trigger, Qt::CaseInsensitive);
+
+ if (forThisTable)
+ {
+ // Those routines should run only for trigger targeted for originalTable.
+ handleName(originalTable, trigger->table);
+ if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF)
+ handleColumnNames(trigger->event->columnNames);
+ }
+
+ if (alreadyProcessedOnce)
+ {
+ // The trigger was already modified by handling of some referencing table.
+ QString oldDdl = triggerNameToDdlMap[trigger->trigger];
+ Parser parser(dialect);
+ trigger = parser.parse<SqliteCreateTrigger>(oldDdl);
+ if (!trigger)
+ {
+ qCritical() << "Could not parse old (already processed once) trigger. Parser error:" << parser.getErrorString() << ", Old DDL: " << oldDdl;
+ warnings << QObject::tr("There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention.")
+ .arg(trigger->trigger);
+ return;
+ }
+ }
+
+ handleTriggerQueries(trigger);
+
+ trigger->rebuildTokens();
+ QString newQueryString = trigger->detokenize();
+ if (originalQueryString == newQueryString && !forThisTable)
+ return; // No query modification was made and trigger is not deleted by this table drop.
+
+ 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);
+ return;
+ }
+
+ if (alreadyProcessedOnce)
+ {
+ // We will add new sql to list, at the end, so it's executed after all tables were altered.
+ sqls.removeOne(triggerNameToDdlMap[trigger->trigger]);
+ }
+
+ if (!forThisTable)
+ {
+ // If this is for other table, than trigger might be still existing, cause altering this table will not delete trigger.
+ sqls << QString("DROP TRIGGER IF EXISTS %1").arg(wrapObjIfNeeded(trigger->trigger, dialect));
+ }
+
+ sqls << newQueryString;
+ modifiedTriggers << trigger->trigger;
+ triggerNameToDdlMap[trigger->trigger] = newQueryString;
+}
+
+void TableModifier::handleTriggerQueries(SqliteCreateTriggerPtr trigger)
+{
SqliteQuery* newQuery = nullptr;
QList<SqliteQuery*> newQueries;
foreach (SqliteQuery* query, trigger->queries)
@@ -406,17 +465,6 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger)
errors << QObject::tr("Cannot not update trigger %1 according to table %2 modification.").arg(trigger->trigger, originalTable);
}
trigger->queries = newQueries;
-
- 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()