- isQueue table option adds queue columns and a (status, available_at) index; BunSQLite.queue exposes add, claim, complete, fail and release_stale with atomic claims - Set busy_timeout on connections so workers in separate processes wait instead of failing with SQLITE_BUSY - Quote table and column names with backticks in generated SQL, so reserved words (to, order, group) work and unknown columns error instead of matching as string literals - Tests for queue ops, multi-process claims and reserved-word names Co-Authored-By: Claude Opus 5.5 <[email protected]>
38 lines
1.6 KiB
JavaScript
38 lines
1.6 KiB
JavaScript
import init from "../functions/init";
|
|
import { sqlName } from "../utils/sql-safe";
|
|
export default async function ({ sql: passed_sql, table, data }) {
|
|
let sql = passed_sql;
|
|
const { dbSchema } = init();
|
|
const table_schema = dbSchema.tables.find((t) => t.tableName == table);
|
|
const now = Date.now();
|
|
if (table_schema?.tableName) {
|
|
const set_sql_arr = Object.keys(Array.isArray(data) ? data[0] : data)
|
|
.filter((field) => field !== "updated_at")
|
|
.map((field) => {
|
|
const column = sqlName(field, "column name");
|
|
return `${column} = excluded.${column}`;
|
|
});
|
|
set_sql_arr.push(`updated_at = ${now}`);
|
|
const set_sql = set_sql_arr.join(", ");
|
|
const unique_fields = table_schema.fields.filter((f) => f.unique);
|
|
for (let i = 0; i < unique_fields.length; i++) {
|
|
const field = unique_fields[i];
|
|
if (!field?.fieldName)
|
|
continue;
|
|
sql += ` ON CONFLICT(${sqlName(field.fieldName, "column name")}) DO UPDATE SET ${set_sql}`;
|
|
}
|
|
if (table_schema.uniqueConstraints?.[0]) {
|
|
for (let i = 0; i < table_schema.uniqueConstraints.length; i++) {
|
|
const constraint = table_schema.uniqueConstraints[i];
|
|
const columns = constraint?.constraintTableFields
|
|
?.map((c) => sqlName(c.value, "column name"))
|
|
?.join(", ");
|
|
if (!columns)
|
|
continue;
|
|
sql += ` ON CONFLICT(${columns}) DO UPDATE SET ${set_sql}`;
|
|
}
|
|
}
|
|
}
|
|
return sql;
|
|
}
|