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