Fix bug + add quote methods

master
Vitaliy Filippov 2019-05-15 16:01:40 +03:00
parent b4dd25148f
commit 50744ac6f8
1 changed files with 28 additions and 6 deletions

View File

@ -1,6 +1,6 @@
// Простенький "селект билдер" по мотивам MediaWiki-овского, успешно юзаю подобный в PHP уже лет 8 // Простенький "селект билдер" по мотивам MediaWiki-овского, успешно юзаю подобный в PHP уже лет 8
// (c) Виталий Филиппов, 2019 // (c) Виталий Филиппов, 2019
// Версия 2019-05-09 // Версия 2019-05-14
// В PHP, правда, прикольнее - там в массиве можно смешивать строковые и численные ключи, // В PHP, правда, прикольнее - там в массиве можно смешивать строковые и численные ключи,
// благодаря чему можно писать $where = [ 't1.a=t2.a', 't2.b' => [ 1, 2, 3 ] ] // благодаря чему можно писать $where = [ 't1.a=t2.a', 't2.b' => [ 1, 2, 3 ] ]
@ -73,9 +73,9 @@ function select_builder(tables, fields, where, options)
} }
if (options.OFFSET || options.offset) if (options.OFFSET || options.offset)
{ {
sql += ' LIMIT '+((options.OFFSET || options.offset) | 0); sql += ' OFFSET '+((options.OFFSET || options.offset) | 0);
} }
return { sql, bind }; return new Text(sql, bind);
} }
function tables_builder(tables) function tables_builder(tables)
@ -302,7 +302,8 @@ function split_using(tables)
function _positional(sql) function _positional(sql)
{ {
let i = 0; let i = 0;
sql = sql.replace(/\?/g, () => '$'+(++i)); sql = sql.replace(/'(?:[^\']*|\'\')*'|"(?:[^\"]*|\"\")*"|(\?)/g, (m, m1) => (m1 ? '$'+(++i) : m));
console.log('> '+sql);
return sql; return sql;
} }
@ -313,7 +314,7 @@ function _inline(sql, bind)
pg_escape = require('pg-escape'); pg_escape = require('pg-escape');
} }
let i = 0; let i = 0;
sql = sql.replace(/\?/g, () => '\''+pg_escape.string(bind[i++])+'\''); sql = sql.replace(/'(?:[^\']*|\'\')*'|"(?:[^\"]*|\"\")*"|(\?)/g, (m, m1) => (m1 ? '\''+pg_escape.string(bind[i++])+'\'' : m));
return sql; return sql;
} }
@ -321,7 +322,6 @@ function _inline(sql, bind)
async function select(dbh, tables, fields, where, options, format) async function select(dbh, tables, fields, where, options, format)
{ {
let { sql, bind } = select_builder(tables, fields, where, options); let { sql, bind } = select_builder(tables, fields, where, options);
//console.log(_inline(sql, bind));
let data = await dbh.query(_positional(sql), bind); let data = await dbh.query(_positional(sql), bind);
if ((format & MS_LIST) || (format & MS_COL)) if ((format & MS_LIST) || (format & MS_COL))
data = data.rows.map(r => Object.values(r)); data = data.rows.map(r => Object.values(r));
@ -422,14 +422,36 @@ class Pg_Values
} }
} }
class Text
{
constructor(sql, bind)
{
this.sql = sql;
this.bind = bind || [];
}
toString()
{
return _inline(this.sql, this.bind);
}
concat(text)
{
return new Text(this.sql+text.sql, [ ...this.bind, ...text.bind ]);
}
}
module.exports = { module.exports = {
select_builder, select_builder,
where_builder, where_builder,
quote_into: _inline,
quote_positional: _positional,
select, select,
insert, insert,
delete: _delete, delete: _delete,
update, update,
values, values,
Text,
MS_HASH, MS_HASH,
MS_LIST, MS_LIST,
MS_ROW, MS_ROW,