Files
bun-mariadb/src/lib/grab-duplicate-safe-insert-sql.ts
T

50 lines
1.3 KiB
TypeScript

type Params = {
sql: string;
table: string;
data: any | any[];
};
function quoteIdentifier(identifier: string): string {
return `\`${identifier.replace(/`/g, "``")}\``;
}
export default async function ({ sql: passedSql, table, data }: Params) {
const config = global.CONFIG;
const dbSchema = global.DB_SCHEMA;
const tableSchema = dbSchema?.tables.find(
(t: { tableName: string }) => t.tableName == table,
);
if (!tableSchema?.tableName) {
return passedSql;
}
const dataObject = Array.isArray(data) ? data[0] : data;
const dataKeys = Object.keys(dataObject || {});
if (dataKeys.length === 0) {
return passedSql;
}
const hasUniqueField =
tableSchema.fields.some(
(field: { unique?: boolean }) => field.unique,
) || Boolean(tableSchema.uniqueConstraints?.length);
if (!hasUniqueField) {
return passedSql;
}
const setSql = dataKeys
.filter((field: string) => field !== "updated_at")
.map(
(field: string) =>
`${quoteIdentifier(field)} = VALUES(${quoteIdentifier(field)})`,
);
setSql.push(`updated_at = ${Date.now()}`);
return `${passedSql} ON DUPLICATE KEY UPDATE ${setSql.join(", ")}`;
}