예제 #1
0
        /// <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(";");
        }
예제 #3
0
        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);
            }
        }