UNPKG

5.56 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8
9var _bluebird = require('bluebird');
10
11var _bluebird2 = _interopRequireDefault(_bluebird);
12
13var _debug = require('./debug');
14
15var _debug2 = _interopRequireDefault(_debug);
16
17var _sql = require('./sql');
18
19var _sql2 = _interopRequireDefault(_sql);
20
21function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new _bluebird2.default(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return _bluebird2.default.resolve(value).then(function (value) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
24
25const makeAsyncApi = client => {
26
27 let inQuery = false;
28
29 function query(sql) {
30 for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
31 values[_key - 1] = arguments[_key];
32 }
33
34 return query.queryArgs(sql, values);
35 }
36
37 let _queryArgs = (sql, values) => {
38 if (sql instanceof _sql.SqlFragment) {
39 values = sql.values;
40 sql = sql.text;
41 }
42
43 inQuery = true;
44 return new _bluebird2.default((resolve, reject) => {
45 (0, _debug2.default)('query params: %s query: %j', JSON.stringify(values).slice(0, 60), sql);
46 client.query(sql, values, (err, result) => {
47 inQuery = false;
48 if (err) {
49 (0, _debug2.default)('%s query(%j, %j)', err, sql, values);
50 return reject(err);
51 }
52 (0, _debug2.default)('query ok: %d rows', result.rowCount);
53 return resolve(result);
54 });
55 });
56 };
57
58 query.SQL = _sql2.default;
59
60 query.query = function (sql) {
61 for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
62 values[_key2 - 1] = arguments[_key2];
63 }
64
65 return query.queryArgs(sql, values);
66 };
67 query.queryArgs = (sql, values) => {
68 if (inQuery) throw new Error('Commands on same client should be called serially. ' + 'Do you forget `await`?');
69 return _queryArgs(sql, values);
70 };
71
72 query.rows = function (sql) {
73 for (var _len3 = arguments.length, values = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
74 values[_key3 - 1] = arguments[_key3];
75 }
76
77 return query.rowsArgs(sql, values);
78 };
79 query.rowsArgs = (sql, values) => query.queryArgs(sql, values).then(r => r.rows);
80
81 query.row = function (sql) {
82 for (var _len4 = arguments.length, values = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
83 values[_key4 - 1] = arguments[_key4];
84 }
85
86 return query.rowArgs(sql, values);
87 };
88 query.rowArgs = (() => {
89 var ref = _asyncToGenerator(function* (sql, values) {
90 const result = yield query.queryArgs(sql, values);
91 if (result.rowCount !== 1) throw new Error(`SQL: Expected exactly one row result but ${ result.rowCount } returned`);
92 return result.rows[0];
93 });
94
95 return function (_x, _x2) {
96 return ref.apply(this, arguments);
97 };
98 })();
99
100 query.value = (() => {
101 var ref = _asyncToGenerator(function* (sql) {
102 for (var _len5 = arguments.length, values = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
103 values[_key5 - 1] = arguments[_key5];
104 }
105
106 return query.valueArgs(sql, values);
107 });
108
109 return function (_x3, _x4) {
110 return ref.apply(this, arguments);
111 };
112 })();
113 query.valueArgs = (() => {
114 var ref = _asyncToGenerator(function* (sql, values) {
115 let opts;
116 if (sql instanceof _sql.SqlFragment) {
117 opts = _extends({}, sql, {
118 rowMode: 'array'
119 });
120 values = sql.values;
121 } else {
122 opts = typeof sql === 'string' ? { text: sql, rowMode: 'array' } : _extends({}, sql, { rowMode: 'array' });
123 }
124
125 const result = yield query.rowArgs(opts, values);
126 if (result.length !== 1) throw new Error(`SQL: Expected exactly one column but ${ result.length } returned`);
127 return result[0];
128 });
129
130 return function (_x5, _x6) {
131 return ref.apply(this, arguments);
132 };
133 })();
134
135 query.inTransaction = false;
136
137 query.startTransaction = () => {
138 query.inTransaction = true;
139 return query.query('BEGIN');
140 };
141
142 query.commit = () => {
143 query.inTransaction = false;
144 return query.query('COMMIT');
145 };
146
147 query.rollback = () => {
148 query.inTransaction = false;
149 return _queryArgs('ROLLBACK', []);
150 };
151
152 query._end = () => {
153 const queryArgs = _queryArgs;
154 _queryArgs = () => {
155 throw new Error('Client was released.');
156 };
157 return new _bluebird2.default(resolve => {
158 if (inQuery) throw new Error('Client shutting down but query is pending. ' + 'Do you forget `await`?');
159
160 if (query.inTransaction) {
161 query.inTransaction = false;
162 queryArgs('ROLLBACK', []);
163 throw new Error('Transaction started manually but not closed. Automatic rollback');
164 }
165 resolve();
166 });
167 };
168
169 return query;
170};
171
172exports.default = makeAsyncApi;
\No newline at end of file