/// <summary> /// Outputs statements for trigger comments that have changed. /// </summary> public static void AlterComments(StreamWriter writer, [NullGuard.AllowNull] PgSchema oldSchema, PgSchema newSchema, SearchPathHelper searchPathHelper) { if (oldSchema == null) { return; } foreach (PgTable oldTable in oldSchema.Tables) { PgTable newTable = newSchema.GetTable(oldTable.Name); if (newTable == null) { continue; } foreach (PgTrigger oldTrigger in oldTable.Triggers) { PgTrigger newTrigger = newTable.GetTrigger(oldTrigger.Name); if (newTrigger == null) { continue; } if ((oldTrigger.Comment == null && newTrigger.Comment != null) || (oldTrigger.Comment != null && newTrigger.Comment != null && !oldTrigger.Comment.Equals(newTrigger.Comment))) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON TRIGGER "); writer.Write(PgDiffStringExtension.QuoteName(newTrigger.Name)); writer.Write(" ON "); writer.Write(PgDiffStringExtension.QuoteName(newTrigger.TableName)); writer.Write(" IS "); writer.Write(newTrigger.Comment); writer.WriteLine(';'); } else if (oldTrigger.Comment != null && newTrigger.Comment == null) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON TRIGGER "); writer.Write(PgDiffStringExtension.QuoteName(newTrigger.Name)); writer.Write(" ON "); writer.Write(PgDiffStringExtension.QuoteName(newTrigger.TableName)); writer.WriteLine(" IS NULL;"); } } } }
/// <summary> /// Parses COMMENT ON TRIGGER. /// </summary> private static void ParseTrigger(Parser parser, PgDatabase database) { var triggerName = ParserUtils.GetObjectName(parser.ParseIdentifier()); parser.Expect("ON"); var tableName = parser.ParseIdentifier(); var objectName = ParserUtils.GetObjectName(tableName); var schemaName = ParserUtils.GetSchemaName(triggerName, database); if (database.SchemaIsIgnored(schemaName)) { return; } PgTrigger trigger = database.GetSchema(schemaName).GetTable(objectName).GetTrigger(triggerName); parser.Expect("IS"); trigger.Comment = GetComment(parser); parser.Expect(";"); }
public static void Parse(PgDatabase database, string statement, bool ignoreSlonyTriggers) { var parser = new Parser(statement); parser.Expect("CREATE", "TRIGGER"); var triggerName = parser.ParseIdentifier(); var objectName = ParserUtils.GetObjectName(triggerName); var trigger = new PgTrigger(); trigger.Name = objectName; if (parser.ExpectOptional("BEFORE")) { trigger.Before = true; } else if (parser.ExpectOptional("AFTER")) { trigger.Before = false; } var first = true; while (true) { if (!first && !parser.ExpectOptional("OR")) { break; } if (parser.ExpectOptional("INSERT")) { trigger.OnInsert = true; } else if (parser.ExpectOptional("UPDATE")) { trigger.OnUpdate = true; if (parser.ExpectOptional("OF")) { do { trigger.AddUpdateColumn(parser.ParseIdentifier()); }while (parser.ExpectOptional(",")); } } else if (parser.ExpectOptional("DELETE")) { trigger.OnDelete = true; } else if (parser.ExpectOptional("TRUNCATE")) { trigger.OnTruncate = true; } else if (first) { break; } else { parser.ThrowUnsupportedCommand(); } first = false; } parser.Expect("ON"); var tableName = parser.ParseIdentifier(); trigger.TableName = ParserUtils.GetObjectName(tableName); if (parser.ExpectOptional("FOR")) { parser.ExpectOptional("EACH"); if (parser.ExpectOptional("ROW")) { trigger.ForEachRow = true; } else if (parser.ExpectOptional("STATEMENT")) { trigger.ForEachRow = false; } else { parser.ThrowUnsupportedCommand(); } } if (parser.ExpectOptional("WHEN")) { parser.Expect("("); trigger.When = parser.GetExpression(); parser.Expect(")"); } parser.Expect("EXECUTE", "PROCEDURE"); trigger.Function = parser.GetRest(); var ignoreSlonyTrigger = ignoreSlonyTriggers && ("_slony_logtrigger".Equals(trigger.Name) || "_slony_denyaccess".Equals(trigger.Name)); if (!ignoreSlonyTrigger) { var tableSchema = database.GetSchema(ParserUtils.GetSchemaName(tableName, database)); tableSchema.GetTable(trigger.TableName).AddTrigger(trigger); } }