orange-orm 4.5.5 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +18 -16
  2. package/{src/client/index.mjs → dist/index.browser.mjs} +33 -12
  3. package/dist/index.mjs +20127 -0
  4. package/docs/changelog.md +3 -0
  5. package/package.json +15 -4
  6. package/src/bunPg/newDatabase.js +137 -0
  7. package/src/bunPg/newPool.js +19 -0
  8. package/src/bunPg/newTransaction.js +87 -0
  9. package/src/bunPg/pool/end.js +13 -0
  10. package/src/bunPg/pool/newPgPool.js +77 -0
  11. package/src/bunPg/wrapQuery.js +97 -0
  12. package/src/bunSqlite/newPool.js +19 -0
  13. package/src/bunSqlite/newTransaction.js +88 -0
  14. package/src/bunSqlite/pool/newGenericPool.js +55 -0
  15. package/src/bunSqlite/wrapQuery.js +23 -0
  16. package/src/d1/newTransaction.js +2 -2
  17. package/src/d1/wrapQuery.js +1 -1
  18. package/src/index.js +20 -4
  19. package/src/merge-browser.js +9 -0
  20. package/src/merge-server.js +9 -0
  21. package/src/mssql/newTransaction.js +2 -2
  22. package/src/mssql/pool/newGenericPool.js +9 -2
  23. package/src/mssql/wrapQuery.js +1 -1
  24. package/src/mySql/newTransaction.js +2 -2
  25. package/src/mySql/pool/newGenericPool.js +11 -2
  26. package/src/mySql/wrapQuery.js +1 -1
  27. package/src/nodeSqlite/decodeBinary.js +9 -0
  28. package/src/nodeSqlite/encodeBinary.js +17 -0
  29. package/src/nodeSqlite/newDatabase.js +116 -0
  30. package/src/nodeSqlite/newPool.js +19 -0
  31. package/src/nodeSqlite/newTransaction.js +88 -0
  32. package/src/nodeSqlite/pool/newGenericPool.js +50 -0
  33. package/src/nodeSqlite/wrapQuery.js +23 -0
  34. package/src/oracle/newTransaction.js +2 -2
  35. package/src/oracle/pool/newGenericPool.js +13 -5
  36. package/src/oracle/wrapQuery.js +1 -1
  37. package/src/pg/newDatabase.js +0 -5
  38. package/src/pg/newTransaction.js +2 -2
  39. package/src/pg/pool/newPgPool.js +15 -3
  40. package/src/pg/wrapQuery.js +1 -1
  41. package/src/{client/rollup.config.js → rollup.config.browser.js} +1 -1
  42. package/src/rollup.config.server.js +32 -0
  43. package/src/runtimes.js +24 -0
  44. package/src/sap/newTransaction.js +2 -2
  45. package/src/sqlite3/encodeBuffer.js +7 -0
  46. package/src/sqlite3/newDatabase.js +116 -0
  47. package/src/{sqlite → sqlite3}/newTransaction.js +10 -10
  48. package/src/sqlite3/pool/end.js +13 -0
  49. package/src/{sqlite → sqlite3}/pool/newGenericPool.js +10 -2
  50. package/src/{sqlite → sqlite3}/wrapQuery.js +1 -1
  51. package/src/table/column/binary/newDecode.js +13 -2
  52. package/src/table/column/binary/newEncode.js +16 -6
  53. package/src/table/resultToRows/newDecodeDbRow.js +1 -1
  54. package/src/tedious/newTransaction.js +2 -2
  55. package/src/tedious/pool/newGenericPool.js +8 -2
  56. package/src/tedious/wrapQuery.js +41 -18
  57. package/src/client/merge.js +0 -9
  58. /package/src/{sqlite → bunSqlite}/newDatabase.js +0 -0
  59. /package/src/{sqlite → sqlite3}/newPool.js +0 -0
package/docs/changelog.md CHANGED
@@ -1,4 +1,7 @@
1
1
  ## Changelog
2
+ __4.6.0__
3
+ Support for Deno and Bun.
4
+ Using builtin sqlite for Node22++.
2
5
  __4.5.5__
3
6
  Bugfix: Parameterized queries are case sensitive on SAP ASE . See [#123](https://github.com/alfateam/orange-orm/issues/123)
4
7
  __4.5.4__
package/package.json CHANGED
@@ -1,8 +1,16 @@
1
1
  {
2
2
  "name": "orange-orm",
3
- "version": "4.5.5",
3
+ "version": "4.6.0",
4
4
  "main": "./src/index.js",
5
- "browser": "./src/client/index.mjs",
5
+ "module": "./dist/index.mjs",
6
+ "browser": "./dist/index.browser.mjs",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./src/index.js",
10
+ "import": "./dist/index.mjs",
11
+ "browser": "./dist/index.browser.mjs"
12
+ }
13
+ },
6
14
  "bin": {
7
15
  "orange-orm": "bin/rdb.js"
8
16
  },
@@ -43,8 +51,11 @@
43
51
  "coverage": "vitest run --coverage.enabled --coverage.reporter='text-summary' --threads=false",
44
52
  "testw": "vitest --threads=false update",
45
53
  "tscheck": "tsc ./src/index.d.ts --module commonjs --target es2022 --noEmit true --strict true --esModuleInterop true",
46
- "concat": "node ./src/client/merge.js",
47
- "build": "rollup -c ./src/client/rollup.config.js && npm run concat",
54
+ "concat-server": "node ./src/merge-server.js",
55
+ "concat-browser": "node ./src/merge-browser.js",
56
+ "build": "npm run build-server && npm run build-browser",
57
+ "build-server": "rollup -c ./src/rollup.config.server.js && npm run concat-server",
58
+ "build-browser": "rollup -c ./src/rollup.config.browser.js && npm run concat-browser",
48
59
  "lint": "eslint ./",
49
60
  "fix": "eslint ./ --fix",
50
61
  "owasp": "owasp-dependency-check --project \"MY_PROJECT\" --scan \"package-lock.json\" --exclude \"dependency-check-bin\" --out \"owasp\" --format HTML",
@@ -0,0 +1,137 @@
1
+ let createDomain = require('../createDomain');
2
+ let newTransaction = require('./newTransaction');
3
+ let _begin = require('../table/begin');
4
+ let commit = require('../table/commit');
5
+ let rollback = require('../table/rollback');
6
+ let newPool = require('./newPool');
7
+ let lock = require('../lock');
8
+ let executeSchema = require('../pg/schema');
9
+ let express = require('../hostExpress');
10
+ let hostLocal = require('../hostLocal');
11
+ let doQuery = require('../query');
12
+ let releaseDbClient = require('../table/releaseDbClient');
13
+ let setSessionSingleton = require('../table/setSessionSingleton');
14
+
15
+ function newDatabase(connectionString, poolOptions) {
16
+ if (!connectionString)
17
+ throw new Error('Connection string cannot be empty');
18
+ var pool;
19
+ if (!poolOptions)
20
+ pool = newPool.bind(null, connectionString, poolOptions);
21
+ else
22
+ pool = newPool(connectionString, poolOptions);
23
+
24
+ let c = { poolFactory: pool, hostLocal, express };
25
+
26
+ c.transaction = function(options, fn) {
27
+ if ((arguments.length === 1) && (typeof options === 'function')) {
28
+ fn = options;
29
+ options = undefined;
30
+ }
31
+ let domain = createDomain();
32
+
33
+ if (fn)
34
+ return domain.run(runInTransaction);
35
+ else
36
+ return domain.run(run);
37
+
38
+ async function runInTransaction() {
39
+ let result;
40
+ let transaction = newTransaction(domain, pool, options);
41
+ await new Promise(transaction)
42
+ .then(begin)
43
+ .then(negotiateSchema)
44
+ .then(() => fn(domain))
45
+ .then((res) => result = res)
46
+ .then(() => commit(domain))
47
+ .then(null, (e) => rollback(domain,e));
48
+ return result;
49
+ }
50
+
51
+ function begin() {
52
+ return _begin(domain, options);
53
+ }
54
+
55
+ function run() {
56
+ let p;
57
+ let transaction = newTransaction(domain, pool, options);
58
+ p = new Promise(transaction);
59
+
60
+ return p.then(begin)
61
+ .then(negotiateSchema);
62
+ }
63
+
64
+ function negotiateSchema(previous) {
65
+ let schema = options && options.schema;
66
+ if (!schema)
67
+ return previous;
68
+ return executeSchema(domain, schema);
69
+ }
70
+ };
71
+
72
+ c.createTransaction = function(options) {
73
+ let domain = createDomain();
74
+ let transaction = newTransaction(domain, pool, options);
75
+ let p = domain.run(() => new Promise(transaction)
76
+ .then(begin).then(negotiateSchema));
77
+
78
+ function run(fn) {
79
+ return p.then(domain.run.bind(domain, fn));
80
+ }
81
+
82
+ function begin() {
83
+ return _begin(domain, options);
84
+ }
85
+
86
+ function negotiateSchema(previous) {
87
+ let schema = options && options.schema;
88
+ if (!schema)
89
+ return previous;
90
+ return executeSchema(domain,schema);
91
+ }
92
+
93
+ run.rollback = rollback.bind(null, domain);
94
+ run.commit = commit.bind(null, domain);
95
+
96
+ return run;
97
+ };
98
+
99
+ c.query = function(query) {
100
+ let domain = createDomain();
101
+ let transaction = newTransaction(domain, pool);
102
+ let p = domain.run(() => new Promise(transaction)
103
+ .then(() => setSessionSingleton(domain, 'changes', []))
104
+ .then(() => doQuery(domain, query).then(onResult, onError)));
105
+ return p;
106
+
107
+ function onResult(result) {
108
+ releaseDbClient(domain);
109
+ return result;
110
+ }
111
+
112
+ function onError(e) {
113
+ releaseDbClient(domain);
114
+ throw e;
115
+ }
116
+ };
117
+
118
+ c.rollback = rollback;
119
+ c.commit = commit;
120
+ c.lock = lock;
121
+ c.schema = executeSchema;
122
+
123
+ c.end = function() {
124
+ if (poolOptions)
125
+ return pool.end();
126
+ else
127
+ return Promise.resolve();
128
+ };
129
+
130
+ c.accept = function(caller) {
131
+ caller.visitPg();
132
+ };
133
+
134
+ return c;
135
+ }
136
+
137
+ module.exports = newDatabase;
@@ -0,0 +1,19 @@
1
+ const promisify = require('../promisify');
2
+ const pools = require('../pools');
3
+ const end = require('./pool/end');
4
+ const newPgPool = require('./pool/newPgPool');
5
+ const newId = require('../newId');
6
+
7
+ function newPool(connectionString, poolOptions) {
8
+ let pool = newPgPool(connectionString, poolOptions);
9
+ let id = newId();
10
+ let boundEnd = end.bind(null, pool, id);
11
+ let c = {};
12
+
13
+ c.connect = pool.connect;
14
+ c.end = promisify(boundEnd);
15
+ pools[id] = c;
16
+ return c;
17
+ }
18
+
19
+ module.exports = newPool;
@@ -0,0 +1,87 @@
1
+ var wrapQuery = require('./wrapQuery');
2
+ var encodeDate = require('../pg/encodeDate');
3
+ var encodeBoolean = require('../pg/encodeBoolean');
4
+ const encodeBinary = require('../nodeSqlite/encodeBinary');
5
+ const decodeBinary = require('../nodeSqlite/decodeBinary');
6
+ var deleteFromSql = require('../pg/deleteFromSql');
7
+ var selectForUpdateSql = require('../pg/selectForUpdateSql');
8
+ var limitAndOffset = require('../pg/limitAndOffset');
9
+ var formatDateOut = require('../pg/formatDateOut');
10
+ var encodeJSON = require('../pg/encodeJSON');
11
+ var insertSql = require('../pg/insertSql');
12
+ var insert = require('../pg/insert');
13
+ var quote = require('../pg/quote');
14
+
15
+ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
16
+ var rdb = { poolFactory: pool };
17
+ if (!pool.connect) {
18
+ pool = pool();
19
+ rdb.pool = pool;
20
+ }
21
+
22
+ rdb.engine = 'pg';
23
+ rdb.encodeBoolean = encodeBoolean;
24
+ rdb.encodeDate = encodeDate;
25
+ rdb.encodeBinary = encodeBinary;
26
+ rdb.decodeBinary = decodeBinary;
27
+ rdb.encodeJSON = encodeJSON;
28
+ rdb.formatDateOut = formatDateOut;
29
+ rdb.deleteFromSql = deleteFromSql;
30
+ rdb.selectForUpdateSql = selectForUpdateSql;
31
+ rdb.lastInsertedIsSeparate = false;
32
+ rdb.insertSql = insertSql;
33
+ rdb.insert = insert;
34
+ rdb.multipleStatements = true;
35
+ rdb.limitAndOffset = limitAndOffset;
36
+ rdb.accept = function(caller) {
37
+ caller.visitPg();
38
+ };
39
+ rdb.aggregateCount = 0;
40
+ rdb.quote = quote;
41
+ rdb.cache = {};
42
+
43
+ if (readonly) {
44
+ rdb.dbClient = {
45
+ executeQuery: function(query, callback) {
46
+ pool.connect((err, client, done) => {
47
+ if (err) {
48
+ return callback(err);
49
+ }
50
+ try {
51
+ wrapQuery(domain, client)(query, (err, res) => {
52
+ done();
53
+ callback(err, res);
54
+ });
55
+ } catch (e) {
56
+ done();
57
+ callback(e);
58
+ }
59
+ });
60
+ }
61
+ };
62
+ domain.rdb = rdb;
63
+ return (onSuccess) => onSuccess();
64
+ }
65
+
66
+ return function(onSuccess, onError) {
67
+ pool.connect(onConnected);
68
+
69
+ function onConnected(err, client, done) {
70
+ try {
71
+ if (err) {
72
+ onError(err);
73
+ return;
74
+ }
75
+ client.executeQuery = wrapQuery(domain, client);
76
+ rdb.dbClient = client;
77
+ rdb.dbClientDone = done;
78
+ domain.rdb = rdb;
79
+ onSuccess();
80
+ } catch (e) {
81
+ onError(e);
82
+ }
83
+ }
84
+ };
85
+ }
86
+
87
+ module.exports = newResolveTransaction;
@@ -0,0 +1,13 @@
1
+ var pools = require('../../pools');
2
+
3
+ function endPool(pgPool, id, done) {
4
+ pgPool.drain(onDrained);
5
+
6
+ function onDrained() {
7
+ pgPool.destroyAllNow();
8
+ delete pools[id];
9
+ done();
10
+ }
11
+ }
12
+
13
+ module.exports = endPool;
@@ -0,0 +1,77 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ // Simplified pool creator using URL API and handling search_path param
3
+
4
+ const log = require('../../table/log');
5
+ const defaults = require('../../poolDefaults');
6
+ const genericPool = require('../../generic-pool');
7
+ const { URL } = require('url');
8
+ let SQL;
9
+
10
+ function newPgPool(connectionString, poolOptions = {}) {
11
+ let searchPath;
12
+ let connStr = connectionString;
13
+
14
+ try {
15
+ const url = new URL(connectionString);
16
+ const paramName = url.searchParams.has('search_path')
17
+ ? 'search_path'
18
+ : url.searchParams.has('searchPath')
19
+ ? 'searchPath'
20
+ : null;
21
+ if (paramName) {
22
+ searchPath = url.searchParams.get(paramName);
23
+ url.searchParams.delete(paramName);
24
+ connStr = url.toString();
25
+ }
26
+ } catch {
27
+ // Non-URL string; leave as-is
28
+ }
29
+
30
+ //@ts-ignore
31
+ const pool = genericPool.Pool({
32
+ max: poolOptions.size || poolOptions.poolSize || defaults.poolSize,
33
+ idleTimeoutMillis: poolOptions.idleTimeout || defaults.poolIdleTimeout,
34
+ reapIntervalMillis: poolOptions.reapIntervalMillis || defaults.reapIntervalMillis,
35
+ log: poolOptions.log,
36
+
37
+ create: async (cb) => {
38
+ try {
39
+ if (!SQL) ({ SQL } = await import('bun'));
40
+ const client = new SQL(connStr);
41
+ client.poolCount = 0;
42
+ await applySearchPath(client, searchPath);
43
+ cb(null, client);
44
+ } catch (err) {
45
+ cb(err, null);
46
+ }
47
+ },
48
+
49
+ destroy: (client) => {
50
+ client._destroying = true;
51
+ client.poolCount = undefined;
52
+ client.end();
53
+ },
54
+ });
55
+
56
+ pool.connect = (cb) => {
57
+ pool.acquire((err, client) => {
58
+ if (err) return cb(err, null, () => {});
59
+ client.poolCount++;
60
+ cb(null, client, (releaseErr) => {
61
+ releaseErr ? pool.destroy(client) : pool.release(client);
62
+ });
63
+ });
64
+ };
65
+
66
+ return pool;
67
+ }
68
+
69
+ async function applySearchPath(client, searchPath) {
70
+ if (searchPath) {
71
+ const sql = `SET search_path TO ${searchPath}`;
72
+ log.emitQuery({ sql, parameters: [] });
73
+ await client.unsafe(sql);
74
+ }
75
+ }
76
+
77
+ module.exports = newPgPool;
@@ -0,0 +1,97 @@
1
+ const log = require('../table/log');
2
+ const replaceParamChar = require('../pg/replaceParamChar');
3
+ const tryGetSessionContext = require('../table/tryGetSessionContext');
4
+
5
+ function wrapQuery(context, connection) {
6
+ return runQuery;
7
+
8
+ async function runQuery(query, onCompleted) {
9
+ try {
10
+
11
+ const sql = replaceParamChar(query, query.parameters);
12
+ let rdb = tryGetSessionContext(context);
13
+ let transactionHandler = rdb.transactionHandler;
14
+ log.emitQuery({ sql, parameters: query.parameters });
15
+
16
+ if (sql.length < 18 && query.parameters.length === 0) {
17
+ if (sql === 'BEGIN TRANSACTION' || sql === 'BEGIN') {
18
+ if (transactionHandler)
19
+ return onCompleted(new Error('Already inside a transaction'), []);
20
+ beginTransaction(connection).then(_transactionHandler => {
21
+ rdb.transactionHandler = _transactionHandler;
22
+ onCompleted(null, []);
23
+ }, onCompleted);
24
+ return;
25
+ }
26
+ else if (sql === 'COMMIT') {
27
+ if (!transactionHandler)
28
+ return onCompleted(new Error('Cannot commit outside transaction'), []);
29
+ transactionHandler.resolve();
30
+ transactionHandler.promise.then(() => onCompleted(null, []), err => onCompleted(err, []));
31
+ return;
32
+ }
33
+ else if (sql === 'ROLLBACK') {
34
+ if (!transactionHandler)
35
+ return onCompleted(new Error('Cannot rollback outside transaction'), []);
36
+ transactionHandler.reject(new Error('__rollback__'));
37
+ transactionHandler.promise.then(null, (err) => {
38
+ if (err.message === '__rollback__')
39
+ onCompleted(null, []);
40
+ else
41
+ onCompleted(err, []);
42
+ });
43
+ return;
44
+ }
45
+ }
46
+
47
+ let result;
48
+ const _connection = transactionHandler?.tx || connection;
49
+ if (query.parameters.length === 0)
50
+ result = await _connection.unsafe(sql);
51
+ else
52
+ result = await _connection.unsafe(sql, query.parameters);
53
+ onCompleted(null, result);
54
+ }
55
+ catch (e) {
56
+ onCompleted(e);
57
+ }
58
+ }
59
+
60
+ }
61
+
62
+ function beginTransaction(connection) {
63
+
64
+ let beginIsResolved = false;
65
+ let resolve;
66
+ let reject;
67
+ let resolveBegin;
68
+ let rejectBegin;
69
+
70
+ let sqlPromise = new Promise((res, rej) => {
71
+ resolve = res;
72
+ reject = rej;
73
+ });
74
+ let beginPromise = new Promise((res,rej) => {
75
+ resolveBegin = res;
76
+ rejectBegin = rej;
77
+ });
78
+ connection.begin(async (tx) => {
79
+ beginIsResolved = true;
80
+ resolveBegin({
81
+ tx,
82
+ resolve,
83
+ reject,
84
+ promise: sqlPromise,
85
+ });
86
+ return sqlPromise;
87
+ }).then(null,
88
+ e => {
89
+ if (!beginIsResolved)
90
+ rejectBegin(e);
91
+ if (e?.message !== '__rollback__')
92
+ throw e;
93
+ });
94
+ return beginPromise;
95
+ }
96
+
97
+ module.exports = wrapQuery;
@@ -0,0 +1,19 @@
1
+ const promisify = require('../promisify');
2
+ const pools = require('../pools');
3
+ const end = require('../sqlite/pool/end');
4
+ const newGenericPool = require('./pool/newGenericPool');
5
+ const newId = require('../newId');
6
+
7
+ function newPool(connectionString, poolOptions) {
8
+ let pool = newGenericPool(connectionString, poolOptions);
9
+ let id = newId();
10
+ let boundEnd = end.bind(null, pool, id);
11
+ let c = {};
12
+
13
+ c.connect = pool.connect;
14
+ c.end = promisify(boundEnd);
15
+ pools[id] = c;
16
+ return c;
17
+ }
18
+
19
+ module.exports = newPool;
@@ -0,0 +1,88 @@
1
+ const wrapQuery = require('./wrapQuery');
2
+ const encodeBoolean = require('../sqlite/encodeBoolean');
3
+ const encodeBinary = require('../nodeSqlite/encodeBinary');
4
+ const decodeBinary = require('../nodeSqlite/decodeBinary');
5
+ const deleteFromSql = require('../sqlite/deleteFromSql');
6
+ const selectForUpdateSql = require('../sqlite/selectForUpdateSql');
7
+ const lastInsertedSql = require('../sqlite/lastInsertedSql');
8
+ const limitAndOffset = require('../sqlite/limitAndOffset');
9
+ const insertSql = require('../sqlite/insertSql');
10
+ const insert = require('../sqlite/insert');
11
+ const quote = require('../sqlite/quote');
12
+
13
+ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
14
+ var rdb = {poolFactory: pool};
15
+ if (!pool.connect) {
16
+ pool = pool();
17
+ rdb.pool = pool;
18
+ }
19
+ rdb.engine = 'sqlite';
20
+ rdb.encodeBoolean = encodeBoolean;
21
+ rdb.encodeBinary = encodeBinary;
22
+ rdb.decodeBinary = decodeBinary;
23
+ rdb.decodeJSON = decodeJSON;
24
+ rdb.encodeJSON = JSON.stringify;
25
+ rdb.deleteFromSql = deleteFromSql;
26
+ rdb.selectForUpdateSql = selectForUpdateSql;
27
+ rdb.lastInsertedSql = lastInsertedSql;
28
+ rdb.insertSql = insertSql;
29
+ rdb.insert = insert;
30
+ rdb.lastInsertedIsSeparate = true;
31
+ rdb.multipleStatements = false;
32
+ rdb.limitAndOffset = limitAndOffset;
33
+ rdb.accept = function(caller) {
34
+ caller.visitSqlite();
35
+ };
36
+ rdb.aggregateCount = 0;
37
+ rdb.quote = quote;
38
+ rdb.cache = {};
39
+
40
+ if (readonly) {
41
+ rdb.dbClient = {
42
+ executeQuery: function(query, callback) {
43
+ pool.connect((err, client, done) => {
44
+ if (err) {
45
+ return callback(err);
46
+ }
47
+ try {
48
+ wrapQuery(domain, client)(query, (err, res) => {
49
+ done();
50
+ callback(err, res);
51
+ });
52
+ } catch (e) {
53
+ done();
54
+ callback(e);
55
+ }
56
+ });
57
+ }
58
+ };
59
+ domain.rdb = rdb;
60
+ return (onSuccess) => onSuccess();
61
+ }
62
+
63
+ return function(onSuccess, onError) {
64
+ pool.connect(onConnected);
65
+
66
+ function onConnected(err, client, done) {
67
+ try {
68
+ if (err) {
69
+ onError(err);
70
+ return;
71
+ }
72
+ client.executeQuery = wrapQuery(domain, client);
73
+ rdb.dbClient = client;
74
+ rdb.dbClientDone = done;
75
+ domain.rdb = rdb;
76
+ onSuccess();
77
+ } catch (e) {
78
+ onError(e);
79
+ }
80
+ }
81
+ };
82
+ }
83
+
84
+ function decodeJSON(value) {
85
+ return JSON.parse(value);
86
+ }
87
+
88
+ module.exports = newResolveTransaction;
@@ -0,0 +1,55 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ var defaults = require('../../poolDefaults');
3
+
4
+ var genericPool = require('../../generic-pool');
5
+ var Database;
6
+
7
+ function newGenericPool(connectionString, poolOptions) {
8
+ poolOptions = poolOptions || {};
9
+ var pool = genericPool.Pool({
10
+ max: poolOptions.size || poolOptions.poolSize || defaults.poolSize,
11
+ idleTimeoutMillis: poolOptions.idleTimeout || defaults.poolIdleTimeout,
12
+ reapIntervalMillis: poolOptions.reapIntervalMillis || defaults.reapIntervalMillis,
13
+ log: poolOptions.log || defaults.poolLog,
14
+ create: async function(cb) {
15
+ try {
16
+ try {
17
+ if (!Database)
18
+ ({ Database } = await import('bun:Database'));
19
+ }
20
+ catch (err) {
21
+ return cb(err, null);
22
+ }
23
+
24
+ var client = new Database(connectionString);
25
+ client.poolCount = 0;
26
+ cb(null, client);
27
+ }
28
+ catch(err) {
29
+ return cb(err, null);
30
+ }
31
+ },
32
+
33
+ destroy: function(client) {
34
+ client.poolCount = undefined;
35
+ client.close();
36
+ }
37
+ });
38
+ //monkey-patch with connect method
39
+ pool.connect = function(cb) {
40
+ pool.acquire(function(err, client) {
41
+ if(err) return cb(err, null, function() {/*NOOP*/});
42
+ client.poolCount++;
43
+ cb(null, client, function(err) {
44
+ if(err) {
45
+ pool.destroy(client);
46
+ } else {
47
+ pool.release(client);
48
+ }
49
+ });
50
+ });
51
+ };
52
+ return pool;
53
+ }
54
+
55
+ module.exports = newGenericPool;
@@ -0,0 +1,23 @@
1
+ var log = require('../table/log');
2
+
3
+ function wrapQuery(_context, connection) {
4
+ return runQuery;
5
+
6
+ function runQuery(query, onCompleted) {
7
+ try {
8
+ var params = query.parameters;
9
+ var sql = query.sql();
10
+ log.emitQuery({ sql, parameters: params });
11
+
12
+ var statement = connection.query(sql);
13
+ const rows = statement.all.apply(statement, params);
14
+ onCompleted(null, rows);
15
+ }
16
+ catch (e) {
17
+ onCompleted(e);
18
+ }
19
+ }
20
+
21
+ }
22
+
23
+ module.exports = wrapQuery;
@@ -41,7 +41,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
41
41
  return callback(err);
42
42
  }
43
43
  try {
44
- wrapQuery(client)(query, (err, res) => {
44
+ wrapQuery(domain, client)(query, (err, res) => {
45
45
  done();
46
46
  callback(err, res);
47
47
  });
@@ -65,7 +65,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
65
65
  onError(err);
66
66
  return;
67
67
  }
68
- client.executeQuery = wrapQuery(client);
68
+ client.executeQuery = wrapQuery(domain, client);
69
69
  rdb.dbClient = client;
70
70
  rdb.dbClientDone = done;
71
71
  domain.rdb = rdb;
@@ -1,6 +1,6 @@
1
1
  var log = require('../table/log');
2
2
 
3
- function wrapQuery(client) {
3
+ function wrapQuery(_context, client) {
4
4
 
5
5
  return runQuery;
6
6