import { DSQL_DatabaseSchemaType, DSQL_TableSchemaType } from "../../../types"; import triggerSQLGen, { TriggerSQLGenParams } from "./trigger-sql-gen"; type Params = TriggerSQLGenParams & { dstDbSchema: DSQL_DatabaseSchemaType; dstTableSchema: DSQL_TableSchemaType; }; export default function tableReplicationTriggerSQLGen({ type, dstDbSchema, dstTableSchema, srcDbSchema, srcTableSchema, userId, paradigm, }: Params) { let sql = `CREATE TRIGGER`; const srcColumns = srcTableSchema.fields .map((fld) => fld.fieldName) .filter((fld) => typeof fld == "string"); const dstColumns = dstTableSchema.fields .map((fld) => fld.fieldName) .filter((fld) => typeof fld == "string"); if (type.name == "after_insert") { sql += ` INSERT INTO ${dstDbSchema.dbFullName}.${dstTableSchema.tableName}`; sql += ` (${dstColumns.join(",")})`; sql += ` VALUES (${dstColumns.map((c) => `NEW.${c}`).join(",")})`; } else if (type.name == "after_update") { sql += ` UPDATE ${dstDbSchema.dbFullName}.${dstTableSchema.tableName}`; sql += ` SET ${dstColumns.map((c) => `${c}=NEW.${c}`).join(",")}`; sql += ` WHERE id = NEW.id`; } else if (type.name == "after_delete") { sql += ` DELETE FROM ${dstDbSchema.dbFullName}.${dstTableSchema.tableName}`; sql += ` WHERE id = OLD.id`; } return triggerSQLGen({ content: sql, srcDbSchema, srcTableSchema, type, paradigm, userId, }); }