57 lines
1.7 KiB
JavaScript
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;
|
|
}
|