knex/lib/formatter/rawFormatter.js
2021-02-04 15:54:26 +02:00

85 lines
1.8 KiB
JavaScript

const { columnize } = require('./wrappingFormatter');
function replaceRawArrBindings(raw, client) {
const bindingsHolder = {
bindings: [],
};
const builder = raw;
const expectedBindings = raw.bindings.length;
const values = raw.bindings;
let index = 0;
const sql = raw.sql.replace(/\\?\?\??/g, function (match) {
if (match === '\\?') {
return match;
}
const value = values[index++];
if (match === '??') {
return columnize(value, builder, client, bindingsHolder);
}
return client.parameter(value, builder, bindingsHolder);
});
if (expectedBindings !== index) {
throw new Error(`Expected ${expectedBindings} bindings, saw ${index}`);
}
return {
method: 'raw',
sql,
bindings: bindingsHolder.bindings,
};
}
function replaceKeyBindings(raw, client) {
const bindingsHolder = {
bindings: [],
};
const builder = raw;
const values = raw.bindings;
const regex = /\\?(:(\w+):(?=::)|:(\w+):(?!:)|:(\w+))/g;
const sql = raw.sql.replace(regex, function (match, p1, p2, p3, p4) {
if (match !== p1) {
return p1;
}
const part = p2 || p3 || p4;
const key = match.trim();
const isIdentifier = key[key.length - 1] === ':';
const value = values[part];
if (value === undefined) {
if (Object.prototype.hasOwnProperty.call(values, part)) {
bindingsHolder.bindings.push(value);
}
return match;
}
if (isIdentifier) {
return match.replace(
p1,
columnize(value, builder, client, bindingsHolder)
);
}
return match.replace(p1, client.parameter(value, builder, bindingsHolder));
});
return {
method: 'raw',
sql,
bindings: bindingsHolder.bindings,
};
}
module.exports = {
replaceKeyBindings,
replaceRawArrBindings,
};