diff --git a/lib/db.js b/lib/db.js index 13110d53..e5d28cbd 100644 --- a/lib/db.js +++ b/lib/db.js @@ -9,13 +9,28 @@ const extendedQueries = require('./extendedQueries') const pgp = Pgp({ pgNative: true, extend (obj, dbContext) { - obj.$any = (query, tables, variables) => extendedQueries.any(obj, dbContext, query, tables, variables) - obj.$one = (query, tables, variables) => extendedQueries.one(obj, dbContext, query, tables, variables) - obj.$oneOrNone = (query, tables, variables) => extendedQueries.oneOrNone(obj, dbContext, query, tables, variables) - obj.$many = (query, tables, variables) => extendedQueries.many(obj, dbContext, query, tables, variables) - obj.$manyOrNone = (query, tables, variables) => extendedQueries.manyOrNone(obj, dbContext, query, tables, variables) - obj.$none = (query, tables, variables) => extendedQueries.none(obj, dbContext, query, tables, variables) - obj.$result = (query, tables, variables, cb) => extendedQueries.result(obj, dbContext, query, tables, variables, cb) + obj.taskEx = function () { + const args = pgp.utils.taskArgs(arguments) + const { schema } = args.options + if ('schema' in args.options) { + delete args.options.schema + } + if (schema) { + return obj.task.call(this, args.options, t => { + return t.none('SET search_path to $1:name', [schema]) + .then(args.cb.bind(this, t)) + }) + } + return Promise.reject(new Error('No schema selected, cannot complete query')) + } + obj.$query = (query, values, qrm) => extendedQueries.query(obj, query, values, qrm) + obj.$result = (query, variables, cb, thisArg) => extendedQueries.result(obj, query, variables, cb, thisArg) + obj.$many = (query, variables) => extendedQueries.many(obj, query, variables) + obj.$manyOrNone = (query, variables) => extendedQueries.manyOrNone(obj, query, variables) + obj.$oneOrNone = (query, variables) => extendedQueries.oneOrNone(obj, query, variables) + obj.$one = (query, variables) => extendedQueries.one(obj, query, variables) + obj.$none = (query, variables) => extendedQueries.none(obj, query, variables) + obj.$any = (query, variables) => extendedQueries.any(obj, query, variables) }, error: (err, e) => { if (e.cn) logger.error('Database not reachable.') diff --git a/lib/extendedQueries.js b/lib/extendedQueries.js index bf5a8b6d..65911b09 100644 --- a/lib/extendedQueries.js +++ b/lib/extendedQueries.js @@ -1,47 +1,92 @@ -const _ = require('lodash/fp') +const getSchema = () => 'public' -const concatSchema = (qry, tables) => { - const schemaName = 'public' // fetch schema name from Async Local Storage here - let query = qry - _.forEach(tableName => { query = query.replace(tableName, `${schemaName}.${tableName}`) }, tables) - return query +const getDefaultSchema = () => 'public2' + +const any = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.any(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const any = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.any(query, variables) +const none = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.none(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const manyOrNone = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.manyOrNone(query, variables) +const one = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.one(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const none = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.none(query, variables) +const oneOrNone = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.oneOrNone(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const many = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.many(query, variables) +const manyOrNone = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.manyOrNone(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const oneOrNone = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.oneOrNone(query, variables) +const many = (obj, query, variables) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.many(query, variables).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const one = (db, dbContext, qry, tables, variables) => { - const query = concatSchema(qry, tables) - return db.one(query, variables) +const result = (obj, query, variables, cb, thisArg) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.result(query, variables, cb, thisArg).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) + }) } -const result = (db, dbContext, qry, tables, variables, cb) => { - const query = concatSchema(qry, tables) - console.log(query) - return db.result(query, variables).then(r => { - return cb ? cb(r) : r +const query = (obj, query, values, qrm) => { + const schema = getSchema() + return obj.taskEx({ schema }, t => { + return t.query(query, values, qrm).then(res => { + return t.none('set search_path to $1~', [getDefaultSchema()]).then(() => { + return res + }) + }) }) } @@ -52,5 +97,6 @@ module.exports = { many, oneOrNone, one, - result + result, + query }