UNPKG

4.48 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _bluebird = require('bluebird');
8
9var _bluebird2 = _interopRequireDefault(_bluebird);
10
11var _pg = require('pg');
12
13var _pg2 = _interopRequireDefault(_pg);
14
15var _debug = require('./debug');
16
17var _debug2 = _interopRequireDefault(_debug);
18
19var _makeAsyncApi = require('./makeAsyncApi');
20
21var _makeAsyncApi2 = _interopRequireDefault(_makeAsyncApi);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25function _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
27function checkAsyncFunction(asyncFunc) {
28 if (typeof asyncFunc !== 'function') throw new TypeError('async function expected');
29}
30
31class 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 // client disconnected?
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}
167exports.default = PgAsync;
168module.exports = exports['default'];
\No newline at end of file