1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.SQL = exports.identifier = exports.literal = exports.sqlStr = undefined;
|
7 |
|
8 | var _sql = require('./sql');
|
9 |
|
10 | Object.defineProperty(exports, 'sqlStr', {
|
11 | enumerable: true,
|
12 | get: function get() {
|
13 | return _sql.sqlStr;
|
14 | }
|
15 | });
|
16 | Object.defineProperty(exports, 'literal', {
|
17 | enumerable: true,
|
18 | get: function get() {
|
19 | return _sql.literal;
|
20 | }
|
21 | });
|
22 | Object.defineProperty(exports, 'identifier', {
|
23 | enumerable: true,
|
24 | get: function get() {
|
25 | return _sql.identifier;
|
26 | }
|
27 | });
|
28 |
|
29 | var _bluebird = require('bluebird');
|
30 |
|
31 | var _bluebird2 = _interopRequireDefault(_bluebird);
|
32 |
|
33 | var _pg = require('pg');
|
34 |
|
35 | var _pg2 = _interopRequireDefault(_pg);
|
36 |
|
37 | var _debug = require('./debug');
|
38 |
|
39 | var _debug2 = _interopRequireDefault(_debug);
|
40 |
|
41 | var _makeAsyncApi = require('./makeAsyncApi');
|
42 |
|
43 | var _makeAsyncApi2 = _interopRequireDefault(_makeAsyncApi);
|
44 |
|
45 | var _sql2 = _interopRequireDefault(_sql);
|
46 |
|
47 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
48 |
|
49 | function _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 |
|
51 | const SQL = exports.SQL = _sql2.default;
|
52 |
|
53 | function checkAsyncFunction(asyncFunc) {
|
54 | if (typeof asyncFunc !== 'function') throw new TypeError('async function expected');
|
55 | }
|
56 |
|
57 | class 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 |
|
188 | }
|
189 | throw err;
|
190 | }
|
191 | });
|
192 |
|
193 | return function (_x) {
|
194 | return ref.apply(this, arguments);
|
195 | };
|
196 | })());
|
197 | })();
|
198 | }
|
199 |
|
200 | }
|
201 | exports.default = PgAsync;
|
202 | PgAsync.SQL = _sql2.default; |
\ | No newline at end of file |