Files
bun-sqlite/dist/utils/sql-insert-generator.js
T

57 lines
1.7 KiB
JavaScript

import { sqlIdent } from "./sql-safe";
/**
* # SQL Insert Generator
*/
export default function sqlInsertGenerator({ tableName, data, dbFullName, }) {
const finalDbName = dbFullName
? `${sqlIdent(dbFullName, "database name")}.`
: "";
if (Array.isArray(data) && data?.[0]) {
let insertKeys = [];
data.forEach((dt) => {
const kys = Object.keys(dt);
kys.forEach((ky) => {
if (!insertKeys.includes(ky)) {
insertKeys.push(sqlIdent(ky, "column name"));
}
});
});
let queryBatches = [];
let queryValues = [];
data.forEach((item) => {
queryBatches.push(`(${insertKeys
.map((ky) => {
const value = item[ky];
if (typeof value == "function") {
const fnValue = value();
queryValues.push(fnValue.value ?? null);
return fnValue.placeholder;
}
queryValues.push(sqlValue(value));
return "?";
})
.join(",")})`);
});
let query = `INSERT INTO ${finalDbName}${sqlIdent(tableName, "table name")} (${insertKeys.join(",")}) VALUES ${queryBatches.join(",")}`;
return {
query: query,
values: queryValues,
};
}
else {
return undefined;
}
}
/**
* # Normalize a JS value for binding
* @description Keeps `0`, `""` and `false` (as `0`) instead of turning them
* into `NULL`
*/
export function sqlValue(value) {
if (value === undefined || value === null)
return null;
if (typeof value == "boolean")
return value ? 1 : 0;
return value;
}