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; }