UNPKG

mysql-all-in-one

Version:

A package that allows you to have a complete interaction with a MYSQL database, allowing to connect to the database, retrieve data and create queries.

90 lines (89 loc) 3.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const generate_query_from_prepared_statement_1 = require("../generate_query_from_prepared_statement"); const types_1 = require("../types"); const utils_1 = require("../utils"); const types_2 = require("./types"); const buildRow = (keys, insertRow) => { const sqlValues = []; const insertValues = keys.reduce((acc, cur) => { acc[cur] = insertRow[cur]; return acc; }, {}); return { statement: `(${Object.values(insertValues) .map((v) => { if ((0, types_1.isSqlExpressionPreparedStatement)(v)) { v = (0, utils_1.placeAliasInSqlExpression)(v, null); sqlValues.push(...v.values); return (0, utils_1.putBrackets)(v.statement); } sqlValues.push(v); return "?"; }) .join(",")})`, values: sqlValues, __is_prep_statement: true, }; }; const buildInsertRows = (rows, columns) => { if ((0, types_2.isInsertRows)(rows)) { const keys = (0, types_1.isArrayOfStrings)(columns) ? columns : Array.isArray(rows) ? Object.keys(rows[0]) : Object.keys(rows); const prepStatement = Array.isArray(rows) ? rows .map((insertRow) => buildRow(keys, insertRow)) .reduce((acc, cur) => { acc.statement.push(cur.statement); acc.values.push(...cur.values); return acc; }, { statement: [], values: [] }) : buildRow(keys, rows); if (Array.isArray(prepStatement.statement)) prepStatement.statement = prepStatement.statement.join(","); return { statement: prepStatement.statement, values: prepStatement.values, __is_prep_statement: true, }; } throw `Invalid rows format for insert object, insert rows must be one or many objects with valid SQL values String | Date | null | boolean | number (undefined is also accepted, but ignored); Insert row object received: ${rows}`; }; const buildColumns = (rows, columns) => { if (!(0, types_2.isInsertRows)(rows)) return ""; return `(${((0, types_1.isArrayOfStrings)(columns) ? columns : Array.isArray(rows) ? Object.keys(rows[0]) : Object.keys(rows)) .map(utils_1.putBackticks) .join(",")})`; }; /** * * @param table Table to insert * @param rows An array of Objects or a single object (keys are the column names) * @param opts Extra insert options like `ignore` * @returns INSERT INTO SQL Query * @example insert('table', [{id:1, name: "John"}, {id:2, name: "Anne"}], {ignore:true}); * >>> "INSERT IGNORE INTO `table` (`id`,`name`) VALUES (1,'John'),(2,'Anne');" */ const insert = (table, rows, opts) => { const { ignore, columns, returnPreparedStatement } = Object.assign(Object.assign({}, types_2.defaultInsertOptions), opts); const insertRowsPrepStatement = buildInsertRows(rows, columns); const values = insertRowsPrepStatement.values; const statement = `INSERT ${ignore === true ? "IGNORE " : ""}INTO ${(0, utils_1.putBackticks)(table)} ${buildColumns(rows, columns)} VALUES ${insertRowsPrepStatement.statement};`; const prepStatement = { statement, values, __is_prep_statement: true, }; return returnPreparedStatement === true ? prepStatement : (0, generate_query_from_prepared_statement_1.generateQueryFromPreparedStatement)(prepStatement); }; exports.default = insert;