UNPKG

5.24 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.SQL = exports.identifier = exports.literal = exports.sqlStr = undefined;
7
8var _sql = require('./sql');
9
10Object.defineProperty(exports, 'sqlStr', {
11 enumerable: true,
12 get: function get() {
13 return _sql.sqlStr;
14 }
15});
16Object.defineProperty(exports, 'literal', {
17 enumerable: true,
18 get: function get() {
19 return _sql.literal;
20 }
21});
22Object.defineProperty(exports, 'identifier', {
23 enumerable: true,
24 get: function get() {
25 return _sql.identifier;
26 }
27});
28
29var _bluebird = require('bluebird');
30
31var _bluebird2 = _interopRequireDefault(_bluebird);
32
33var _pg = require('pg');
34
35var _pg2 = _interopRequireDefault(_pg);
36
37var _debug = require('./debug');
38
39var _debug2 = _interopRequireDefault(_debug);
40
41var _makeAsyncApi = require('./makeAsyncApi');
42
43var _makeAsyncApi2 = _interopRequireDefault(_makeAsyncApi);
44
45var _sql2 = _interopRequireDefault(_sql);
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
49function _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"); }); }; }
50
51const SQL = exports.SQL = _sql2.default;
52
53function checkAsyncFunction(asyncFunc) {
54 if (typeof asyncFunc !== 'function') throw new TypeError('async function expected');
55}
56
57class PgAsync {
58 constructor(connectionOptions, driver) {
59 var _this = this;
60
61 this.SQL = _sql2.default;
62
63 this.closeConnections = () => this.getDriver().end();
64
65 this.setConnectionOptions(connectionOptions);
66 this.setDriver(driver);
67
68 const wrap = name => {
69 this[name] = function (sql) {
70 for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
71 values[_key - 1] = arguments[_key];
72 }
73
74 return _this.connect(client => client[`${ name }Args`](sql, values));
75 };
76 };
77 const wrapArgs = name => {
78 this[name] = (sql, values) => this.connect(client => client[name](sql, values));
79 };
80
81 wrap('query');
82 wrapArgs('queryArgs');
83
84 wrap('rows');
85 wrapArgs('rowsArgs');
86
87 wrap('row');
88 wrapArgs('rowArgs');
89
90 wrap('value');
91 wrapArgs('valueArgs');
92 }
93
94 setConnectionOptions(options) {
95 this._connectionOptions = options;
96 return this;
97 }
98
99 getConnectionOptions() {
100 return this._connectionOptions || this.getDriver().defaults;
101 }
102
103 getDriver() {
104 return this._driver;
105 }
106
107 setDriver(driver) {
108 if (typeof driver === 'string') switch (driver) {
109 case '':case 'pg':
110 driver = _pg2.default;
111 break;
112 case 'native':case 'pg.native':
113 driver = _pg2.default.native;
114 break;
115 default:
116 throw new Error(`Unrecognized driver name: ${ driver }`);
117 }
118 this._driver = driver || _pg2.default;
119 return this;
120 }
121
122 getClient() {
123 var _this2 = this;
124
125 return _asyncToGenerator(function* () {
126 return new _bluebird2.default(function (resolve, reject) {
127 _this2.getDriver().connect(_this2.getConnectionOptions(), function (err, client, _done) {
128 if (err) {
129 (0, _debug2.default)('%s getClient(%j)', err, _this2.getConnectionOptions());
130 if (_done) _done(err);
131 return reject(err);
132 }
133 return resolve({
134 client: client,
135 done: function done() {
136 (0, _debug2.default)('Client released');
137 _done();
138 }
139 });
140 });
141 });
142 })();
143 }
144
145 connect(asyncFunc) {
146 var _this3 = this;
147
148 return _asyncToGenerator(function* () {
149 checkAsyncFunction(asyncFunc);
150
151 var _ref = yield _this3.getClient();
152
153 const client = _ref.client;
154 const done = _ref.done;
155
156 try {
157 const api = (0, _makeAsyncApi2.default)(client);
158 const result = yield asyncFunc(api);
159 yield api._end();
160 done();
161 return result;
162 } catch (err) {
163 done(err);
164 throw err;
165 }
166 })();
167 }
168
169 transaction(asyncFunc) {
170 var _this4 = this;
171
172 return _asyncToGenerator(function* () {
173 checkAsyncFunction(asyncFunc);
174
175 return yield _this4.connect((() => {
176 var ref = _asyncToGenerator(function* (client) {
177 client.checkSerialAccess = true;
178 yield client.startTransaction();
179 try {
180 const result = yield asyncFunc(client);
181 yield client.commit();
182 return result;
183 } catch (err) {
184 try {
185 yield client.rollback();
186 } catch (_) {
187 // client disconnected?
188 }
189 throw err;
190 }
191 });
192
193 return function (_x) {
194 return ref.apply(this, arguments);
195 };
196 })());
197 })();
198 }
199
200}
201exports.default = PgAsync;
202PgAsync.SQL = _sql2.default;
\No newline at end of file