mirror of
https://github.com/knex/knex.git
synced 2025-06-26 22:00:25 +00:00
85 lines
1.8 KiB
JavaScript
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,
|
|
};
|