/// <summary> /// Parses ADD FOREIGN KEY action. /// </summary> private static void ParseAddForeignKey(Parser parser, PgTable table) { IList <string> columnNames = new List <string>(1); parser.Expect("("); while (!parser.ExpectOptional(")")) { columnNames.Add(ParserUtils.GetObjectName(parser.ParseIdentifier())); if (parser.ExpectOptional(")")) { break; } else { parser.Expect(","); } } var constraintName = ParserUtils.GenerateName(table.Name + "_", columnNames, "_fkey"); var constraint = new PgConstraint(constraintName); table.AddConstraint(constraint); constraint.Definition = parser.Expression(); constraint.TableName = table.Name; }
/// <summary> /// Parses COMMENT ON INDEX. /// </summary> private static void ParseIndex(Parser parser, PgDatabase database) { var indexName = parser.ParseIdentifier(); var objectName = ParserUtils.GetObjectName(indexName); var schemaName = ParserUtils.GetSchemaName(indexName, database); if (database.SchemaIsIgnored(schemaName)) { return; } PgSchema schema = database.GetSchema(schemaName); PgIndex index = schema.GetIndex(objectName); if (index == null) { PgConstraint primaryKey = schema.GetPrimaryKey(objectName); parser.Expect("IS"); primaryKey.Comment = GetComment(parser); parser.Expect(";"); } else { parser.Expect("IS"); index.Comment = GetComment(parser); parser.Expect(";"); } }
private static void ParseConstraint(Parser parser, PgTable table) { var constraint = new PgConstraint(ParserUtils.GetObjectName(parser.ParseIdentifier())); table.AddConstraint(constraint); constraint.Definition = parser.GetExpression(); constraint.TableName = table.Name; }
private static void ParseAddConstraint(Parser parser, PgTable table, PgSchema schema) { var constraintName = ParserUtils.GetObjectName(parser.ParseIdentifier()); var constraint = new PgConstraint(constraintName); constraint.TableName = table.Name; table.AddConstraint(constraint); if (parser.ExpectOptional("PRIMARY", "KEY")) { schema.AddPrimaryKey(constraint); constraint.Definition = "PRIMARY KEY " + parser.GetExpression(); } else { constraint.Definition = parser.GetExpression(); } }
/// <summary> /// Parses COMMENT ON CONSTRAINT. /// </summary> private static void ParseConstraint(Parser parser, PgDatabase database) { var constraintName = ParserUtils.GetObjectName(parser.ParseIdentifier()); parser.Expect("ON"); var tableName = parser.ParseIdentifier(); var objectName = ParserUtils.GetObjectName(tableName); var schemaName = ParserUtils.GetSchemaName(constraintName, database); if (database.SchemaIsIgnored(schemaName)) { return; } PgConstraint constraint = database.GetSchema(schemaName).GetTable(objectName).GetConstraint(constraintName); parser.Expect("IS"); constraint.Comment = GetComment(parser); parser.Expect(";"); }
/// <summary> /// Outputs statements for constraint 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 (PgConstraint oldConstraint in oldTable.Constraints) { PgConstraint newConstraint = newTable.GetConstraint(oldConstraint.Name); if (newConstraint == null) { continue; } if ((oldConstraint.Comment == null && newConstraint.Comment != null) || (oldConstraint.Comment != null && newConstraint.Comment != null && !oldConstraint.Comment.Equals(newConstraint.Comment))) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON "); if (newConstraint.PrimaryKeyConstraint) { writer.Write("INDEX "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.Name)); } else { writer.Write("CONSTRAINT "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.Name)); writer.Write(" ON "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.TableName)); } writer.Write(" IS "); writer.Write(newConstraint.Comment); writer.WriteLine(';'); } else if (oldConstraint.Comment != null && newConstraint.Comment == null) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON "); if (newConstraint.PrimaryKeyConstraint) { writer.Write("INDEX "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.Name)); } else { writer.Write("CONSTRAINT "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.Name)); writer.Write(" ON "); writer.Write(PgDiffStringExtension.QuoteName(newConstraint.TableName)); } writer.WriteLine(" IS NULL;"); } } } }