49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
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,
|
|
});
|
|
}
|