orange-orm 4.3.0-beta.0 → 4.3.0-beta.1
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.
- package/package.json +3 -8
- package/src/mssql/newDatabase.js +2 -2
- package/src/mssql/newTransaction.js +52 -28
- package/src/mySql/newDatabase.js +2 -2
- package/src/mySql/newTransaction.js +44 -21
- package/src/oracle/newDatabase.js +2 -2
- package/src/oracle/newTransaction.js +47 -21
- package/src/pg/encodeBoolean.js +1 -1
- package/src/pg/encodeDate.js +2 -2
- package/src/pg/encodeJSON.js +10 -11
- package/src/pg/newDatabase.js +2 -2
- package/src/pg/newTransaction.js +44 -22
- package/src/pg/pool/newPgPool.js +30 -4
- package/src/pg/wrapQuery.js +11 -8
- package/src/sap/newDatabase.js +2 -2
- package/src/sap/newTransaction.js +52 -28
- package/src/sqlite/newDatabase.js +2 -2
- package/src/sqlite/newTransaction.js +41 -18
- package/src/tedious/newDatabase.js +2 -2
- package/src/tedious/newTransaction.js +53 -30
- package/src/getManyDto2.js +0 -301
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orange-orm",
|
|
3
|
-
"version": "4.3.0-beta.
|
|
3
|
+
"version": "4.3.0-beta.1",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"browser": "./src/client/index.mjs",
|
|
6
6
|
"bin": {
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"build": "rollup -c ./src/client/rollup.config.js && npm run concat",
|
|
48
48
|
"lint": "eslint ./",
|
|
49
49
|
"fix": "eslint ./ --fix",
|
|
50
|
-
"owasp": "owasp-dependency-check --project \"MY_PROJECT\" --scan \"package-lock.json\" --exclude \"dependency-check-bin\" --out \"owasp\" --format HTML"
|
|
50
|
+
"owasp": "owasp-dependency-check --project \"MY_PROJECT\" --scan \"package-lock.json\" --exclude \"dependency-check-bin\" --out \"owasp\" --format HTML",
|
|
51
|
+
"beta": "publish --tag beta"
|
|
51
52
|
},
|
|
52
53
|
"dependencies": {
|
|
53
54
|
"@lroal/on-change": "^4.0.2",
|
|
@@ -63,7 +64,6 @@
|
|
|
63
64
|
"glob": "^10.3.4",
|
|
64
65
|
"module-definition": "^4.0.0",
|
|
65
66
|
"node-cls": "^1.0.5",
|
|
66
|
-
"postgres": "^3.4.4",
|
|
67
67
|
"promise": "^8.0.3",
|
|
68
68
|
"rfdc": "^1.2.0",
|
|
69
69
|
"uuid": "^8.3.2"
|
|
@@ -72,7 +72,6 @@
|
|
|
72
72
|
"msnodesqlv8": "^4.1.0",
|
|
73
73
|
"mysql2": "^2.2.5 || ^3.9.4",
|
|
74
74
|
"oracledb": "^6.3.0",
|
|
75
|
-
"postgres": "^3.4.4",
|
|
76
75
|
"pg": "^8.5.1",
|
|
77
76
|
"pg-native": "^3.0.0",
|
|
78
77
|
"pg-query-stream": "^3.3.2",
|
|
@@ -80,9 +79,6 @@
|
|
|
80
79
|
"tedious": "^15.1.2 || ^16.0.0 || ^18.1.0"
|
|
81
80
|
},
|
|
82
81
|
"peerDependenciesMeta": {
|
|
83
|
-
"postgres": {
|
|
84
|
-
"optional": true
|
|
85
|
-
},
|
|
86
82
|
"pg": {
|
|
87
83
|
"optional": true
|
|
88
84
|
},
|
|
@@ -119,7 +115,6 @@
|
|
|
119
115
|
"mysql2": "^3.9.4",
|
|
120
116
|
"oracledb": "^6.3.0",
|
|
121
117
|
"owasp-dependency-check": "^0.0.21",
|
|
122
|
-
"postgres": "^3.4.4",
|
|
123
118
|
"pg": "^8.5.1",
|
|
124
119
|
"pg-query-stream": "^3.3.2",
|
|
125
120
|
"rollup": "^2.52.7",
|
package/src/mssql/newDatabase.js
CHANGED
|
@@ -43,7 +43,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
43
43
|
|
|
44
44
|
async function runInTransaction() {
|
|
45
45
|
let result;
|
|
46
|
-
let transaction = newTransaction(domain, pool);
|
|
46
|
+
let transaction = newTransaction(domain, pool, options);
|
|
47
47
|
await new Promise(transaction)
|
|
48
48
|
.then(begin)
|
|
49
49
|
.then(fn)
|
|
@@ -59,7 +59,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
59
59
|
|
|
60
60
|
function run() {
|
|
61
61
|
let p;
|
|
62
|
-
let transaction = newTransaction(domain, pool);
|
|
62
|
+
let transaction = newTransaction(domain, pool, options);
|
|
63
63
|
if (useHook())
|
|
64
64
|
p = new Promise(transaction);
|
|
65
65
|
else
|
|
@@ -8,12 +8,63 @@ const formatDateOut = require('../tedious/formatDateOut');
|
|
|
8
8
|
const insertSql = require('../tedious/insertSql');
|
|
9
9
|
const insert = require('../tedious/insert');
|
|
10
10
|
|
|
11
|
-
function newResolveTransaction(domain, pool) {
|
|
11
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
12
12
|
var rdb = {poolFactory: pool};
|
|
13
13
|
if (!pool.connect) {
|
|
14
14
|
pool = pool();
|
|
15
15
|
rdb.pool = pool;
|
|
16
16
|
}
|
|
17
|
+
rdb.engine = 'mssqlNative';
|
|
18
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
19
|
+
rdb.decodeJSON = decodeJSON;
|
|
20
|
+
rdb.encodeJSON = JSON.stringify;
|
|
21
|
+
rdb.formatDateOut = formatDateOut;
|
|
22
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
23
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
24
|
+
rdb.outputInsertedSql = outputInsertedSql;
|
|
25
|
+
rdb.insertSql = insertSql;
|
|
26
|
+
rdb.insert = insert;
|
|
27
|
+
rdb.lastInsertedIsSeparate = false;
|
|
28
|
+
rdb.multipleStatements = true;
|
|
29
|
+
rdb.begin = 'BEGIN TRANSACTION';
|
|
30
|
+
rdb.limit = (span) => {
|
|
31
|
+
if (span.offset)
|
|
32
|
+
return '';
|
|
33
|
+
else if (span.limit || span.limit === 0)
|
|
34
|
+
return 'TOP ' + span.limit;
|
|
35
|
+
else
|
|
36
|
+
return '';
|
|
37
|
+
};
|
|
38
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
39
|
+
rdb.accept = function(caller) {
|
|
40
|
+
caller.visitSqlite();
|
|
41
|
+
};
|
|
42
|
+
rdb.aggregateCount = 0;
|
|
43
|
+
rdb.quote = (name) => `[${name}]`;
|
|
44
|
+
|
|
45
|
+
if (readonly) {
|
|
46
|
+
rdb.dbClient = {
|
|
47
|
+
executeQuery: function(query, callback) {
|
|
48
|
+
pool.connect((err, client, done) => {
|
|
49
|
+
if (err) {
|
|
50
|
+
return callback(err);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
client.setUseUTC(false);
|
|
54
|
+
wrapQuery(client)(query, (err, res) => {
|
|
55
|
+
done();
|
|
56
|
+
callback(err, res);
|
|
57
|
+
});
|
|
58
|
+
} catch (e) {
|
|
59
|
+
done();
|
|
60
|
+
callback(e);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
domain.rdb = rdb;
|
|
66
|
+
return (onSuccess) => onSuccess();
|
|
67
|
+
}
|
|
17
68
|
|
|
18
69
|
return function(onSuccess, onError) {
|
|
19
70
|
pool.connect(onConnected);
|
|
@@ -26,35 +77,8 @@ function newResolveTransaction(domain, pool) {
|
|
|
26
77
|
}
|
|
27
78
|
client.setUseUTC(false);
|
|
28
79
|
client.executeQuery = wrapQuery(client);
|
|
29
|
-
rdb.engine = 'mssqlNative';
|
|
30
80
|
rdb.dbClient = client;
|
|
31
81
|
rdb.dbClientDone = done;
|
|
32
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
33
|
-
rdb.decodeJSON = decodeJSON;
|
|
34
|
-
rdb.encodeJSON = JSON.stringify;
|
|
35
|
-
rdb.formatDateOut = formatDateOut;
|
|
36
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
37
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
38
|
-
rdb.outputInsertedSql = outputInsertedSql;
|
|
39
|
-
rdb.insertSql = insertSql;
|
|
40
|
-
rdb.insert = insert;
|
|
41
|
-
rdb.lastInsertedIsSeparate = false;
|
|
42
|
-
rdb.multipleStatements = true;
|
|
43
|
-
rdb.begin = 'BEGIN TRANSACTION';
|
|
44
|
-
rdb.limit = (span) => {
|
|
45
|
-
if (span.offset)
|
|
46
|
-
return '';
|
|
47
|
-
else if (span.limit || span.limit === 0)
|
|
48
|
-
return 'TOP ' + span.limit;
|
|
49
|
-
else
|
|
50
|
-
return '';
|
|
51
|
-
};
|
|
52
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
53
|
-
rdb.accept = function(caller) {
|
|
54
|
-
caller.visitSqlite();
|
|
55
|
-
};
|
|
56
|
-
rdb.aggregateCount = 0;
|
|
57
|
-
rdb.quote = (name) => `[${name}]`;
|
|
58
82
|
domain.rdb = rdb;
|
|
59
83
|
onSuccess();
|
|
60
84
|
} catch (e) {
|
package/src/mySql/newDatabase.js
CHANGED
|
@@ -42,7 +42,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
42
42
|
|
|
43
43
|
async function runInTransaction() {
|
|
44
44
|
let result;
|
|
45
|
-
let transaction = newTransaction(domain, pool);
|
|
45
|
+
let transaction = newTransaction(domain, pool, options);
|
|
46
46
|
await new Promise(transaction)
|
|
47
47
|
.then(begin)
|
|
48
48
|
.then(fn)
|
|
@@ -58,7 +58,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
58
58
|
|
|
59
59
|
function run() {
|
|
60
60
|
let p;
|
|
61
|
-
let transaction = newTransaction(domain, pool);
|
|
61
|
+
let transaction = newTransaction(domain, pool, options);
|
|
62
62
|
if (useHook())
|
|
63
63
|
p = new Promise(transaction);
|
|
64
64
|
else
|
|
@@ -7,42 +7,65 @@ const limitAndOffset = require('./limitAndOffset');
|
|
|
7
7
|
const insertSql = require('./insertSql');
|
|
8
8
|
const insert = require('./insert');
|
|
9
9
|
|
|
10
|
-
function newResolveTransaction(domain, pool) {
|
|
10
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
11
11
|
var rdb = {poolFactory: pool};
|
|
12
12
|
if (!pool.connect) {
|
|
13
13
|
pool = pool();
|
|
14
14
|
rdb.pool = pool;
|
|
15
15
|
}
|
|
16
|
+
rdb.engine = 'mysql';
|
|
17
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
18
|
+
rdb.encodeJSON = JSON.stringify;
|
|
19
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
20
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
21
|
+
rdb.lastInsertedIsSeparate = true;
|
|
22
|
+
rdb.lastInsertedSql = lastInsertedSql;
|
|
23
|
+
rdb.insertSql = insertSql;
|
|
24
|
+
rdb.insert = insert;
|
|
25
|
+
rdb.multipleStatements = false;
|
|
26
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
27
|
+
rdb.accept = function(caller) {
|
|
28
|
+
caller.visitMySql();
|
|
29
|
+
};
|
|
30
|
+
rdb.aggregateCount = 0;
|
|
31
|
+
rdb.quote = (name) => `\`${name}\``;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
if (readonly) {
|
|
35
|
+
rdb.dbClient = {
|
|
36
|
+
executeQuery: function(query, callback) {
|
|
37
|
+
pool.connect((err, client, done) => {
|
|
38
|
+
if (err) {
|
|
39
|
+
return callback(err);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
wrapQuery(client)(query, (err, res) => {
|
|
43
|
+
done();
|
|
44
|
+
callback(err, res);
|
|
45
|
+
});
|
|
46
|
+
} catch (e) {
|
|
47
|
+
done();
|
|
48
|
+
callback(e);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
domain.rdb = rdb;
|
|
54
|
+
return (onSuccess) => onSuccess();
|
|
55
|
+
}
|
|
16
56
|
|
|
17
57
|
return function(onSuccess, onError) {
|
|
18
58
|
pool.connect(onConnected);
|
|
19
59
|
|
|
20
|
-
function onConnected(err,
|
|
60
|
+
function onConnected(err, client, done) {
|
|
21
61
|
try {
|
|
22
62
|
if (err) {
|
|
23
63
|
onError(err);
|
|
24
64
|
return;
|
|
25
65
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
rdb.engine = 'mysql';
|
|
29
|
-
rdb.dbClient = connection;
|
|
66
|
+
client.executeQuery = wrapQuery(client);
|
|
67
|
+
rdb.dbClient = client;
|
|
30
68
|
rdb.dbClientDone = done;
|
|
31
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
32
|
-
rdb.encodeJSON = JSON.stringify;
|
|
33
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
34
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
35
|
-
rdb.lastInsertedIsSeparate = true;
|
|
36
|
-
rdb.lastInsertedSql = lastInsertedSql;
|
|
37
|
-
rdb.insertSql = insertSql;
|
|
38
|
-
rdb.insert = insert;
|
|
39
|
-
rdb.multipleStatements = false;
|
|
40
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
41
|
-
rdb.accept = function(caller) {
|
|
42
|
-
caller.visitMySql();
|
|
43
|
-
};
|
|
44
|
-
rdb.aggregateCount = 0;
|
|
45
|
-
rdb.quote = (name) => `\`${name}\``;
|
|
46
69
|
domain.rdb = rdb;
|
|
47
70
|
onSuccess();
|
|
48
71
|
} catch (e) {
|
|
@@ -47,7 +47,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
47
47
|
|
|
48
48
|
async function runInTransaction() {
|
|
49
49
|
let result;
|
|
50
|
-
let transaction = newTransaction(domain, pool);
|
|
50
|
+
let transaction = newTransaction(domain, pool, options);
|
|
51
51
|
await new Promise(transaction)
|
|
52
52
|
.then(begin)
|
|
53
53
|
.then(fn)
|
|
@@ -59,7 +59,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
59
59
|
|
|
60
60
|
function run() {
|
|
61
61
|
let p;
|
|
62
|
-
let transaction = newTransaction(domain, pool);
|
|
62
|
+
let transaction = newTransaction(domain, pool, options);
|
|
63
63
|
if (useHook())
|
|
64
64
|
p = new Promise(transaction);
|
|
65
65
|
else
|
|
@@ -9,13 +9,58 @@ const insert = require('./insert');
|
|
|
9
9
|
const formatDateOut = require('./formatDateOut');
|
|
10
10
|
const formatDateIn = require('./formatDateIn');
|
|
11
11
|
|
|
12
|
-
function newResolveTransaction(domain, pool) {
|
|
12
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
13
13
|
var rdb = {poolFactory: pool};
|
|
14
14
|
if (!pool.connect) {
|
|
15
15
|
pool = pool();
|
|
16
16
|
rdb.pool = pool;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
rdb.begin = 'SET TRANSACTION ISOLATION LEVEL READ COMMITTED';
|
|
20
|
+
rdb.engine = 'oracle';
|
|
21
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
22
|
+
rdb.decodeJSON = decodeJSON;
|
|
23
|
+
rdb.encodeJSON = JSON.stringify;
|
|
24
|
+
rdb.formatDateOut = formatDateOut;
|
|
25
|
+
rdb.formatDateIn = formatDateIn;
|
|
26
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
27
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
28
|
+
rdb.lastInsertedSql = lastInsertedSql;
|
|
29
|
+
rdb.insertSql = insertSql;
|
|
30
|
+
rdb.insert = insert;
|
|
31
|
+
rdb.lastInsertedIsSeparate = true;
|
|
32
|
+
rdb.multipleStatements = false;
|
|
33
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
34
|
+
rdb.accept = function(caller) {
|
|
35
|
+
caller.visitSqlite();
|
|
36
|
+
};
|
|
37
|
+
rdb.aggregateCount = 0;
|
|
38
|
+
rdb.quote = (name) => `"${name}"`;
|
|
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(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
|
+
|
|
19
64
|
return function(onSuccess, onError) {
|
|
20
65
|
pool.connect(onConnected);
|
|
21
66
|
|
|
@@ -26,29 +71,10 @@ function newResolveTransaction(domain, pool) {
|
|
|
26
71
|
return;
|
|
27
72
|
}
|
|
28
73
|
client.executeQuery = wrapQuery(client);
|
|
29
|
-
rdb.begin = 'SET TRANSACTION ISOLATION LEVEL READ COMMITTED';
|
|
30
|
-
rdb.engine = 'oracle';
|
|
31
74
|
rdb.dbClient = client;
|
|
32
75
|
rdb.dbClientDone = done;
|
|
33
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
34
|
-
rdb.decodeJSON = decodeJSON;
|
|
35
|
-
rdb.encodeJSON = JSON.stringify;
|
|
36
|
-
rdb.formatDateOut = formatDateOut;
|
|
37
|
-
rdb.formatDateIn = formatDateIn;
|
|
38
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
39
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
40
|
-
rdb.lastInsertedSql = lastInsertedSql;
|
|
41
|
-
rdb.insertSql = insertSql;
|
|
42
|
-
rdb.insert = insert;
|
|
43
|
-
rdb.lastInsertedIsSeparate = true;
|
|
44
|
-
rdb.multipleStatements = false;
|
|
45
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
46
|
-
rdb.accept = function(caller) {
|
|
47
|
-
caller.visitSqlite();
|
|
48
|
-
};
|
|
49
|
-
rdb.aggregateCount = 0;
|
|
50
|
-
rdb.quote = (name) => `"${name}"`;
|
|
51
76
|
domain.rdb = rdb;
|
|
77
|
+
|
|
52
78
|
onSuccess();
|
|
53
79
|
} catch (e) {
|
|
54
80
|
onError(e);
|
package/src/pg/encodeBoolean.js
CHANGED
package/src/pg/encodeDate.js
CHANGED
package/src/pg/encodeJSON.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
function encode(arg) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
if (Array.isArray(arg))
|
|
3
|
+
return new JsonBArrayParam(arg);
|
|
4
|
+
else
|
|
5
|
+
return arg;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
// }
|
|
8
|
+
class JsonBArrayParam {
|
|
9
|
+
constructor(actualArray) { this.actualArray = actualArray; }
|
|
10
|
+
toPostgres() {
|
|
11
|
+
return JSON.stringify(this.actualArray);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
15
14
|
|
|
16
15
|
module.exports = encode;
|
package/src/pg/newDatabase.js
CHANGED
|
@@ -52,7 +52,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
52
52
|
|
|
53
53
|
async function runInTransaction() {
|
|
54
54
|
let result;
|
|
55
|
-
let transaction = newTransaction(domain, pool);
|
|
55
|
+
let transaction = newTransaction(domain, pool, options);
|
|
56
56
|
await new Promise(transaction)
|
|
57
57
|
.then(begin)
|
|
58
58
|
.then(negotiateSchema)
|
|
@@ -69,7 +69,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
69
69
|
|
|
70
70
|
function run() {
|
|
71
71
|
let p;
|
|
72
|
-
let transaction = newTransaction(domain, pool);
|
|
72
|
+
let transaction = newTransaction(domain, pool, options);
|
|
73
73
|
if (useHook())
|
|
74
74
|
p = new Promise(transaction);
|
|
75
75
|
else
|
package/src/pg/newTransaction.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
var wrapQuery = require('./wrapQuery');
|
|
2
|
-
var wrapQueryStream = require('./wrapQueryStream');
|
|
3
2
|
var encodeDate = require('./encodeDate');
|
|
4
3
|
var encodeBoolean = require('./encodeBoolean');
|
|
5
4
|
var deleteFromSql = require('./deleteFromSql');
|
|
@@ -10,13 +9,54 @@ var encodeJSON = require('./encodeJSON');
|
|
|
10
9
|
var insertSql = require('./insertSql');
|
|
11
10
|
var insert = require('./insert');
|
|
12
11
|
|
|
13
|
-
function newResolveTransaction(domain, pool) {
|
|
14
|
-
var rdb = {poolFactory: pool};
|
|
12
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
13
|
+
var rdb = { poolFactory: pool };
|
|
15
14
|
if (!pool.connect) {
|
|
16
15
|
pool = pool();
|
|
17
16
|
rdb.pool = pool;
|
|
18
17
|
}
|
|
19
18
|
|
|
19
|
+
rdb.engine = 'pg';
|
|
20
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
21
|
+
rdb.encodeDate = encodeDate;
|
|
22
|
+
rdb.encodeJSON = encodeJSON;
|
|
23
|
+
rdb.formatDateOut = formatDateOut;
|
|
24
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
25
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
26
|
+
rdb.lastInsertedIsSeparate = false;
|
|
27
|
+
rdb.insertSql = insertSql;
|
|
28
|
+
rdb.insert = insert;
|
|
29
|
+
rdb.multipleStatements = true;
|
|
30
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
31
|
+
rdb.accept = function(caller) {
|
|
32
|
+
caller.visitPg();
|
|
33
|
+
};
|
|
34
|
+
rdb.aggregateCount = 0;
|
|
35
|
+
rdb.quote = (name) => `"${name}"`;
|
|
36
|
+
|
|
37
|
+
if (readonly) {
|
|
38
|
+
rdb.dbClient = {
|
|
39
|
+
executeQuery: function(query, callback) {
|
|
40
|
+
pool.connect((err, client, done) => {
|
|
41
|
+
if (err) {
|
|
42
|
+
return callback(err);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
wrapQuery(client)(query, (err, res) => {
|
|
46
|
+
done();
|
|
47
|
+
callback(err, res);
|
|
48
|
+
});
|
|
49
|
+
} catch (e) {
|
|
50
|
+
done();
|
|
51
|
+
callback(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
domain.rdb = rdb;
|
|
57
|
+
return (onSuccess) => onSuccess();
|
|
58
|
+
}
|
|
59
|
+
|
|
20
60
|
return function(onSuccess, onError) {
|
|
21
61
|
pool.connect(onConnected);
|
|
22
62
|
|
|
@@ -27,26 +67,8 @@ function newResolveTransaction(domain, pool) {
|
|
|
27
67
|
return;
|
|
28
68
|
}
|
|
29
69
|
client.executeQuery = wrapQuery(client);
|
|
30
|
-
client.streamQuery = wrapQueryStream(client);
|
|
31
|
-
rdb.engine = 'pg';
|
|
32
70
|
rdb.dbClient = client;
|
|
33
71
|
rdb.dbClientDone = done;
|
|
34
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
35
|
-
rdb.encodeDate = encodeDate;
|
|
36
|
-
rdb.encodeJSON = encodeJSON;
|
|
37
|
-
rdb.formatDateOut = formatDateOut;
|
|
38
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
39
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
40
|
-
rdb.lastInsertedIsSeparate = false;
|
|
41
|
-
rdb.insertSql = insertSql;
|
|
42
|
-
rdb.insert = insert;
|
|
43
|
-
rdb.multipleStatements = true;
|
|
44
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
45
|
-
rdb.accept = function(caller) {
|
|
46
|
-
caller.visitPg();
|
|
47
|
-
};
|
|
48
|
-
rdb.aggregateCount = 0;
|
|
49
|
-
rdb.quote = (name) => `"${name}"`;
|
|
50
72
|
domain.rdb = rdb;
|
|
51
73
|
onSuccess();
|
|
52
74
|
} catch (e) {
|
|
@@ -56,4 +78,4 @@ function newResolveTransaction(domain, pool) {
|
|
|
56
78
|
};
|
|
57
79
|
}
|
|
58
80
|
|
|
59
|
-
module.exports = newResolveTransaction;
|
|
81
|
+
module.exports = newResolveTransaction;
|
package/src/pg/pool/newPgPool.js
CHANGED
|
@@ -4,19 +4,45 @@ var EventEmitter = require('events').EventEmitter;
|
|
|
4
4
|
|
|
5
5
|
var defaults = require('./defaults');
|
|
6
6
|
var genericPool = require('../../generic-pool');
|
|
7
|
-
var
|
|
7
|
+
var _pg = require('pg');
|
|
8
8
|
|
|
9
9
|
function newPgPool(connectionString, poolOptions) {
|
|
10
10
|
poolOptions = poolOptions || {};
|
|
11
|
+
let pg = poolOptions.native ? _pg.native : _pg;
|
|
11
12
|
var pool = genericPool.Pool({
|
|
12
13
|
max: poolOptions.size || poolOptions.poolSize || defaults.poolSize,
|
|
13
14
|
idleTimeoutMillis: poolOptions.idleTimeout || defaults.poolIdleTimeout,
|
|
14
15
|
reapIntervalMillis: poolOptions.reapIntervalMillis || defaults.reapIntervalMillis,
|
|
15
16
|
log: poolOptions.log || defaults.poolLog,
|
|
16
17
|
create: function(cb) {
|
|
17
|
-
var client = pg(connectionString
|
|
18
|
-
client.
|
|
19
|
-
|
|
18
|
+
var client = new pg.Client(connectionString);
|
|
19
|
+
client.connect(function(err) {
|
|
20
|
+
if (err) return cb(err, null);
|
|
21
|
+
|
|
22
|
+
//handle connected client background errors by emitting event
|
|
23
|
+
//via the pg object and then removing errored client from the pool
|
|
24
|
+
client.on('error', function(e) {
|
|
25
|
+
pool.emit('error', e, client);
|
|
26
|
+
|
|
27
|
+
// If the client is already being destroyed, the error
|
|
28
|
+
// occurred during stream ending. Do not attempt to destroy
|
|
29
|
+
// the client again.
|
|
30
|
+
if (!client._destroying) {
|
|
31
|
+
pool.destroy(client);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Remove connection from pool on disconnect
|
|
36
|
+
client.on('end', function(_e) {
|
|
37
|
+
// Do not enter infinite loop between pool.destroy
|
|
38
|
+
// and client 'end' event...
|
|
39
|
+
if (!client._destroying) {
|
|
40
|
+
pool.destroy(client);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
client.poolCount = 0;
|
|
44
|
+
return cb(null, client);
|
|
45
|
+
});
|
|
20
46
|
},
|
|
21
47
|
destroy: function(client) {
|
|
22
48
|
client._destroying = true;
|
package/src/pg/wrapQuery.js
CHANGED
|
@@ -2,7 +2,7 @@ var log = require('../table/log');
|
|
|
2
2
|
var replaceParamChar = require('./replaceParamChar');
|
|
3
3
|
|
|
4
4
|
function wrapQuery(connection) {
|
|
5
|
-
|
|
5
|
+
var runOriginalQuery = connection.query;
|
|
6
6
|
return runQuery;
|
|
7
7
|
|
|
8
8
|
function runQuery(query, onCompleted) {
|
|
@@ -13,15 +13,18 @@ function wrapQuery(connection) {
|
|
|
13
13
|
values: params,
|
|
14
14
|
types: query.types
|
|
15
15
|
};
|
|
16
|
-
log.emitQuery({
|
|
16
|
+
log.emitQuery({sql, parameters: params});
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
// runOriginalQuery.call(connection, query, onInnerCompleted);
|
|
18
|
+
runOriginalQuery.call(connection, query, onInnerCompleted);
|
|
20
19
|
|
|
21
|
-
function onInnerCompleted(result) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
function onInnerCompleted(err, result) {
|
|
21
|
+
if (err)
|
|
22
|
+
onCompleted(err);
|
|
23
|
+
else {
|
|
24
|
+
if (Array.isArray(result))
|
|
25
|
+
result = result[result.length-1];
|
|
26
|
+
onCompleted(null, result.rows);
|
|
27
|
+
}
|
|
25
28
|
}
|
|
26
29
|
}
|
|
27
30
|
|
package/src/sap/newDatabase.js
CHANGED
|
@@ -47,7 +47,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
47
47
|
|
|
48
48
|
async function runInTransaction() {
|
|
49
49
|
let result;
|
|
50
|
-
let transaction = newTransaction(domain, pool);
|
|
50
|
+
let transaction = newTransaction(domain, pool, options);
|
|
51
51
|
await new Promise(transaction)
|
|
52
52
|
.then(begin)
|
|
53
53
|
.then(fn)
|
|
@@ -59,7 +59,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
59
59
|
|
|
60
60
|
function run() {
|
|
61
61
|
let p;
|
|
62
|
-
let transaction = newTransaction(domain, pool);
|
|
62
|
+
let transaction = newTransaction(domain, pool, options);
|
|
63
63
|
if (useHook())
|
|
64
64
|
p = new Promise(transaction);
|
|
65
65
|
else
|
|
@@ -8,12 +8,63 @@ const insertSql = require('./insertSql');
|
|
|
8
8
|
const insert = require('./insert');
|
|
9
9
|
const limitAndOffset = require('./limitAndOffset');
|
|
10
10
|
|
|
11
|
-
function newResolveTransaction(domain, pool) {
|
|
11
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
12
12
|
var rdb = {poolFactory: pool};
|
|
13
13
|
if (!pool.connect) {
|
|
14
14
|
pool = pool();
|
|
15
15
|
rdb.pool = pool;
|
|
16
16
|
}
|
|
17
|
+
rdb.engine = 'sap';
|
|
18
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
19
|
+
rdb.decodeJSON = decodeJSON;
|
|
20
|
+
rdb.encodeJSON = JSON.stringify;
|
|
21
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
22
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
23
|
+
rdb.formatDateOut = formatDateOut;
|
|
24
|
+
rdb.lastInsertedSql = lastInsertedSql;
|
|
25
|
+
rdb.insertSql = insertSql;
|
|
26
|
+
rdb.insert = insert;
|
|
27
|
+
rdb.lastInsertedIsSeparate = true;
|
|
28
|
+
rdb.multipleStatements = false;
|
|
29
|
+
rdb.begin = 'BEGIN TRANSACTION';
|
|
30
|
+
rdb.limit = (span) => {
|
|
31
|
+
if (span.offset)
|
|
32
|
+
return '';
|
|
33
|
+
else if (span.limit || span.limit === 0)
|
|
34
|
+
return 'TOP ' + span.limit;
|
|
35
|
+
else
|
|
36
|
+
return '';
|
|
37
|
+
};
|
|
38
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
39
|
+
rdb.accept = function(caller) {
|
|
40
|
+
caller.visitSap();
|
|
41
|
+
};
|
|
42
|
+
rdb.aggregateCount = 0;
|
|
43
|
+
rdb.quote = (name) => `[${name}]`;
|
|
44
|
+
|
|
45
|
+
if (readonly) {
|
|
46
|
+
rdb.dbClient = {
|
|
47
|
+
executeQuery: function(query, callback) {
|
|
48
|
+
pool.connect((err, client, done) => {
|
|
49
|
+
if (err) {
|
|
50
|
+
return callback(err);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
wrapQuery(client)(query, (err, res) => {
|
|
54
|
+
done();
|
|
55
|
+
callback(err, res);
|
|
56
|
+
});
|
|
57
|
+
} catch (e) {
|
|
58
|
+
done();
|
|
59
|
+
callback(e);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
domain.rdb = rdb;
|
|
65
|
+
return (onSuccess) => onSuccess();
|
|
66
|
+
}
|
|
67
|
+
|
|
17
68
|
|
|
18
69
|
return function(onSuccess, onError) {
|
|
19
70
|
pool.connect(onConnected);
|
|
@@ -25,35 +76,8 @@ function newResolveTransaction(domain, pool) {
|
|
|
25
76
|
return;
|
|
26
77
|
}
|
|
27
78
|
client.executeQuery = wrapQuery(client);
|
|
28
|
-
rdb.engine = 'sap';
|
|
29
79
|
rdb.dbClient = client;
|
|
30
80
|
rdb.dbClientDone = done;
|
|
31
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
32
|
-
rdb.decodeJSON = decodeJSON;
|
|
33
|
-
rdb.encodeJSON = JSON.stringify;
|
|
34
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
35
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
36
|
-
rdb.formatDateOut = formatDateOut;
|
|
37
|
-
rdb.lastInsertedSql = lastInsertedSql;
|
|
38
|
-
rdb.insertSql = insertSql;
|
|
39
|
-
rdb.insert = insert;
|
|
40
|
-
rdb.lastInsertedIsSeparate = true;
|
|
41
|
-
rdb.multipleStatements = false;
|
|
42
|
-
rdb.begin = 'BEGIN TRANSACTION';
|
|
43
|
-
rdb.limit = (span) => {
|
|
44
|
-
if (span.offset)
|
|
45
|
-
return '';
|
|
46
|
-
else if (span.limit || span.limit === 0)
|
|
47
|
-
return 'TOP ' + span.limit;
|
|
48
|
-
else
|
|
49
|
-
return '';
|
|
50
|
-
};
|
|
51
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
52
|
-
rdb.accept = function(caller) {
|
|
53
|
-
caller.visitSap();
|
|
54
|
-
};
|
|
55
|
-
rdb.aggregateCount = 0;
|
|
56
|
-
rdb.quote = (name) => `[${name}]`;
|
|
57
81
|
domain.rdb = rdb;
|
|
58
82
|
onSuccess();
|
|
59
83
|
} catch (e) {
|
|
@@ -47,7 +47,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
47
47
|
|
|
48
48
|
async function runInTransaction() {
|
|
49
49
|
let result;
|
|
50
|
-
let transaction = newTransaction(domain, pool);
|
|
50
|
+
let transaction = newTransaction(domain, pool, options);
|
|
51
51
|
await new Promise(transaction)
|
|
52
52
|
.then(begin)
|
|
53
53
|
.then(fn)
|
|
@@ -59,7 +59,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
59
59
|
|
|
60
60
|
function run() {
|
|
61
61
|
let p;
|
|
62
|
-
let transaction = newTransaction(domain, pool);
|
|
62
|
+
let transaction = newTransaction(domain, pool, options);
|
|
63
63
|
if (useHook())
|
|
64
64
|
p = new Promise(transaction);
|
|
65
65
|
else
|
|
@@ -7,12 +7,52 @@ const limitAndOffset = require('./limitAndOffset');
|
|
|
7
7
|
const insertSql = require('./insertSql');
|
|
8
8
|
const insert = require('./insert');
|
|
9
9
|
|
|
10
|
-
function newResolveTransaction(domain, pool
|
|
10
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
11
11
|
var rdb = {poolFactory: pool};
|
|
12
12
|
if (!pool.connect) {
|
|
13
13
|
pool = pool();
|
|
14
14
|
rdb.pool = pool;
|
|
15
15
|
}
|
|
16
|
+
rdb.engine = 'sqlite';
|
|
17
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
18
|
+
rdb.decodeJSON = decodeJSON;
|
|
19
|
+
rdb.encodeJSON = JSON.stringify;
|
|
20
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
21
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
22
|
+
rdb.lastInsertedSql = lastInsertedSql;
|
|
23
|
+
rdb.insertSql = insertSql;
|
|
24
|
+
rdb.insert = insert;
|
|
25
|
+
rdb.lastInsertedIsSeparate = true;
|
|
26
|
+
rdb.multipleStatements = false;
|
|
27
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
28
|
+
rdb.accept = function(caller) {
|
|
29
|
+
caller.visitSqlite();
|
|
30
|
+
};
|
|
31
|
+
rdb.aggregateCount = 0;
|
|
32
|
+
rdb.quote = (name) => `"${name}"`;
|
|
33
|
+
|
|
34
|
+
if (readonly) {
|
|
35
|
+
rdb.dbClient = {
|
|
36
|
+
executeQuery: function(query, callback) {
|
|
37
|
+
pool.connect((err, client, done) => {
|
|
38
|
+
if (err) {
|
|
39
|
+
return callback(err);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
wrapQuery(client)(query, (err, res) => {
|
|
43
|
+
done();
|
|
44
|
+
callback(err, res);
|
|
45
|
+
});
|
|
46
|
+
} catch (e) {
|
|
47
|
+
done();
|
|
48
|
+
callback(e);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
domain.rdb = rdb;
|
|
54
|
+
return (onSuccess) => onSuccess();
|
|
55
|
+
}
|
|
16
56
|
|
|
17
57
|
return function(onSuccess, onError) {
|
|
18
58
|
pool.connect(onConnected);
|
|
@@ -24,25 +64,8 @@ function newResolveTransaction(domain, pool) {
|
|
|
24
64
|
return;
|
|
25
65
|
}
|
|
26
66
|
client.executeQuery = wrapQuery(client);
|
|
27
|
-
rdb.engine = 'sqlite';
|
|
28
67
|
rdb.dbClient = client;
|
|
29
68
|
rdb.dbClientDone = done;
|
|
30
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
31
|
-
rdb.decodeJSON = decodeJSON;
|
|
32
|
-
rdb.encodeJSON = JSON.stringify;
|
|
33
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
34
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
35
|
-
rdb.lastInsertedSql = lastInsertedSql;
|
|
36
|
-
rdb.insertSql = insertSql;
|
|
37
|
-
rdb.insert = insert;
|
|
38
|
-
rdb.lastInsertedIsSeparate = true;
|
|
39
|
-
rdb.multipleStatements = false;
|
|
40
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
41
|
-
rdb.accept = function(caller) {
|
|
42
|
-
caller.visitSqlite();
|
|
43
|
-
};
|
|
44
|
-
rdb.aggregateCount = 0;
|
|
45
|
-
rdb.quote = (name) => `"${name}"`;
|
|
46
69
|
domain.rdb = rdb;
|
|
47
70
|
onSuccess();
|
|
48
71
|
} catch (e) {
|
|
@@ -47,7 +47,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
47
47
|
|
|
48
48
|
async function runInTransaction() {
|
|
49
49
|
let result;
|
|
50
|
-
let transaction = newTransaction(domain, pool);
|
|
50
|
+
let transaction = newTransaction(domain, pool, options);
|
|
51
51
|
await new Promise(transaction)
|
|
52
52
|
.then(begin)
|
|
53
53
|
.then(fn)
|
|
@@ -60,7 +60,7 @@ function newDatabase(connectionString, poolOptions) {
|
|
|
60
60
|
|
|
61
61
|
function run() {
|
|
62
62
|
let p;
|
|
63
|
-
let transaction = newTransaction(domain, pool);
|
|
63
|
+
let transaction = newTransaction(domain, pool, options);
|
|
64
64
|
if (useHook())
|
|
65
65
|
p = new Promise(transaction);
|
|
66
66
|
else
|
|
@@ -10,12 +10,64 @@ const formatJSONOut = require('./formatJSONOut');
|
|
|
10
10
|
const insertSql = require('./insertSql');
|
|
11
11
|
const insert = require('./insert');
|
|
12
12
|
|
|
13
|
-
function newResolveTransaction(domain, pool) {
|
|
13
|
+
function newResolveTransaction(domain, pool, { readonly } = {}) {
|
|
14
14
|
var rdb = {poolFactory: pool};
|
|
15
15
|
if (!pool.connect) {
|
|
16
16
|
pool = pool();
|
|
17
17
|
rdb.pool = pool;
|
|
18
18
|
}
|
|
19
|
+
rdb.engine = 'mssql';
|
|
20
|
+
rdb.getManyDto = getManyDto;
|
|
21
|
+
rdb.encodeBoolean = encodeBoolean;
|
|
22
|
+
rdb.decodeJSON = decodeJSON;
|
|
23
|
+
rdb.encodeJSON = JSON.stringify;
|
|
24
|
+
rdb.deleteFromSql = deleteFromSql;
|
|
25
|
+
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
26
|
+
rdb.outputInsertedSql = outputInsertedSql;
|
|
27
|
+
rdb.lastInsertedIsSeparate = false;
|
|
28
|
+
rdb.insertSql = insertSql;
|
|
29
|
+
rdb.insert = insert;
|
|
30
|
+
rdb.formatDateOut = formatDateOut;
|
|
31
|
+
rdb.formatJSONOut = formatJSONOut;
|
|
32
|
+
rdb.multipleStatements = true;
|
|
33
|
+
rdb.begin = 'BEGIN TRANSACTION';
|
|
34
|
+
rdb.limit = (span) => {
|
|
35
|
+
if (span.offset)
|
|
36
|
+
return '';
|
|
37
|
+
else if (span.limit || span.limit === 0)
|
|
38
|
+
return 'TOP ' + span.limit;
|
|
39
|
+
else
|
|
40
|
+
return '';
|
|
41
|
+
};
|
|
42
|
+
rdb.limitAndOffset = limitAndOffset;
|
|
43
|
+
rdb.accept = function(caller) {
|
|
44
|
+
caller.visitSqlite();
|
|
45
|
+
};
|
|
46
|
+
rdb.aggregateCount = 0;
|
|
47
|
+
rdb.quote = (name) => `[${name}]`;
|
|
48
|
+
|
|
49
|
+
if (readonly) {
|
|
50
|
+
rdb.dbClient = {
|
|
51
|
+
executeQuery: function(query, callback) {
|
|
52
|
+
pool.connect((err, client, done) => {
|
|
53
|
+
if (err) {
|
|
54
|
+
return callback(err);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
wrapQuery(client)(query, (err, res) => {
|
|
58
|
+
done();
|
|
59
|
+
callback(err, res);
|
|
60
|
+
});
|
|
61
|
+
} catch (e) {
|
|
62
|
+
done();
|
|
63
|
+
callback(e);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
domain.rdb = rdb;
|
|
69
|
+
return (onSuccess) => onSuccess();
|
|
70
|
+
}
|
|
19
71
|
|
|
20
72
|
return function(onSuccess, onError) {
|
|
21
73
|
pool.connect(onConnected);
|
|
@@ -27,37 +79,8 @@ function newResolveTransaction(domain, pool) {
|
|
|
27
79
|
return;
|
|
28
80
|
}
|
|
29
81
|
client.executeQuery = wrapQuery(client);
|
|
30
|
-
rdb.engine = 'mssql';
|
|
31
|
-
rdb.getManyDto = getManyDto;
|
|
32
82
|
rdb.dbClient = client;
|
|
33
83
|
rdb.dbClientDone = done;
|
|
34
|
-
rdb.encodeBoolean = encodeBoolean;
|
|
35
|
-
rdb.decodeJSON = decodeJSON;
|
|
36
|
-
rdb.encodeJSON = JSON.stringify;
|
|
37
|
-
rdb.deleteFromSql = deleteFromSql;
|
|
38
|
-
rdb.selectForUpdateSql = selectForUpdateSql;
|
|
39
|
-
rdb.outputInsertedSql = outputInsertedSql;
|
|
40
|
-
rdb.lastInsertedIsSeparate = false;
|
|
41
|
-
rdb.insertSql = insertSql;
|
|
42
|
-
rdb.insert = insert;
|
|
43
|
-
rdb.formatDateOut = formatDateOut;
|
|
44
|
-
rdb.formatJSONOut = formatJSONOut;
|
|
45
|
-
rdb.multipleStatements = true;
|
|
46
|
-
rdb.begin = 'BEGIN TRANSACTION';
|
|
47
|
-
rdb.limit = (span) => {
|
|
48
|
-
if (span.offset)
|
|
49
|
-
return '';
|
|
50
|
-
else if (span.limit || span.limit === 0)
|
|
51
|
-
return 'TOP ' + span.limit;
|
|
52
|
-
else
|
|
53
|
-
return '';
|
|
54
|
-
};
|
|
55
|
-
rdb.limitAndOffset = limitAndOffset;
|
|
56
|
-
rdb.accept = function(caller) {
|
|
57
|
-
caller.visitSqlite();
|
|
58
|
-
};
|
|
59
|
-
rdb.aggregateCount = 0;
|
|
60
|
-
rdb.quote = (name) => `[${name}]`;
|
|
61
84
|
domain.rdb = rdb;
|
|
62
85
|
onSuccess();
|
|
63
86
|
} catch (e) {
|
package/src/getManyDto2.js
DELETED
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
const emptyFilter = require('./emptyFilter');
|
|
2
|
-
const newQuery = require('./getManyDto/newQuery');
|
|
3
|
-
const negotiateRawSqlFilter = require('./table/column/negotiateRawSqlFilter');
|
|
4
|
-
const strategyToSpan = require('./table/strategyToSpan');
|
|
5
|
-
const executeQueries = require('./table/executeQueries');
|
|
6
|
-
|
|
7
|
-
async function getManyDto(table, filter, strategy, spanFromParent) {
|
|
8
|
-
filter = negotiateRawSqlFilter(filter, table);
|
|
9
|
-
if (strategy && strategy.where) {
|
|
10
|
-
let arg = typeof strategy.where === 'function' ? strategy.where(table) : strategy.where;
|
|
11
|
-
filter = filter.and(arg);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
let span = spanFromParent || strategyToSpan(table, strategy);
|
|
15
|
-
let alias = table._dbName;
|
|
16
|
-
|
|
17
|
-
const query = newQuery(table, filter, span, alias);
|
|
18
|
-
const res = await executeQueries([query]);
|
|
19
|
-
return decode(strategy, span, await res[0]);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function newCreateRow(span) {
|
|
23
|
-
let columnsMap = span.columns;
|
|
24
|
-
const columns = span.table._columns.filter(column => !columnsMap || columnsMap.get(column));
|
|
25
|
-
const protoRow = createProto(columns, span);
|
|
26
|
-
const manyNames = [];
|
|
27
|
-
|
|
28
|
-
const c = {};
|
|
29
|
-
c.visitJoin = () => { };
|
|
30
|
-
c.visitOne = () => { };
|
|
31
|
-
c.visitMany = function(leg) {
|
|
32
|
-
manyNames.push(leg.name);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
span.legs.forEach(onEachLeg);
|
|
36
|
-
return createRow;
|
|
37
|
-
|
|
38
|
-
function onEachLeg(leg) {
|
|
39
|
-
leg.accept(c);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function createRow() {
|
|
43
|
-
const obj = Object.create(protoRow);
|
|
44
|
-
for (let i = 0; i < manyNames.length; i++) {
|
|
45
|
-
obj[manyNames[i]] = [];
|
|
46
|
-
}
|
|
47
|
-
return obj;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function createProto(columns, span) {
|
|
52
|
-
let obj = {};
|
|
53
|
-
for (let i = 0; i < columns.length; i++) {
|
|
54
|
-
obj[columns[i].alias] = null;
|
|
55
|
-
}
|
|
56
|
-
for (let key in span.aggregates) {
|
|
57
|
-
obj[key] = null;
|
|
58
|
-
}
|
|
59
|
-
const c = {};
|
|
60
|
-
|
|
61
|
-
c.visitJoin = function(leg) {
|
|
62
|
-
obj[leg.name] = null;
|
|
63
|
-
};
|
|
64
|
-
c.visitOne = c.visitJoin;
|
|
65
|
-
c.visitMany = function(leg) {
|
|
66
|
-
obj[leg.name] = null;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
span.legs.forEach(onEachLeg);
|
|
70
|
-
|
|
71
|
-
function onEachLeg(leg) {
|
|
72
|
-
leg.accept(c);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return obj;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function hasManyRelations(span) {
|
|
79
|
-
let result;
|
|
80
|
-
const c = {};
|
|
81
|
-
c.visitJoin = () => { };
|
|
82
|
-
c.visitOne = c.visitJoin;
|
|
83
|
-
c.visitMany = function() {
|
|
84
|
-
result = true;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
span.legs.forEach(onEachLeg);
|
|
88
|
-
return result;
|
|
89
|
-
|
|
90
|
-
function onEachLeg(leg) {
|
|
91
|
-
leg.accept(c);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys(rows[0]) : []) {
|
|
96
|
-
const table = span.table;
|
|
97
|
-
let columnsMap = span.columns;
|
|
98
|
-
const columns = table._columns.filter(column => !columnsMap || columnsMap.get(column));
|
|
99
|
-
const rowsLength = rows.length;
|
|
100
|
-
const columnsLength = columns.length;
|
|
101
|
-
const primaryColumns = table._primaryColumns;
|
|
102
|
-
const primaryColumnsLength = primaryColumns.length;
|
|
103
|
-
const rowsMap = new Map();
|
|
104
|
-
const fkIds = new Array(rows.length);
|
|
105
|
-
const getIds = createGetIds();
|
|
106
|
-
const aggregateKeys = Object.keys(span.aggregates);
|
|
107
|
-
|
|
108
|
-
const outRows = new Array(rowsLength);
|
|
109
|
-
const createRow = newCreateRow(span);
|
|
110
|
-
const shouldCreateMap = hasManyRelations(span);
|
|
111
|
-
for (let i = 0; i < rowsLength; i++) {
|
|
112
|
-
const row = rows[i];
|
|
113
|
-
let outRow = createRow();
|
|
114
|
-
let pkWithNullCount = 0;
|
|
115
|
-
for (let j = 0; j < primaryColumnsLength; j++) {
|
|
116
|
-
if (row[keys[j]] === null)
|
|
117
|
-
pkWithNullCount++;
|
|
118
|
-
if (pkWithNullCount === primaryColumnsLength) {
|
|
119
|
-
outRow = null;
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
const column = columns[j];
|
|
123
|
-
outRow[column.alias] = column.decode(row[keys[j]]);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
outRows[i] = outRow;
|
|
127
|
-
if (shouldCreateMap) {
|
|
128
|
-
fkIds[i] = getIds(outRow);
|
|
129
|
-
addToMap(rowsMap, primaryColumns, outRow);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
span._rowsMap = rowsMap;
|
|
133
|
-
span._ids = fkIds;
|
|
134
|
-
const manyPromise = decodeManyRelations(strategy, span, rows, outRows, keys);
|
|
135
|
-
|
|
136
|
-
for (let i = 0; i < rowsLength; i++) {
|
|
137
|
-
const row = rows[i];
|
|
138
|
-
let outRow = outRows[i];
|
|
139
|
-
if (outRow === null)
|
|
140
|
-
continue;
|
|
141
|
-
for (let j = primaryColumnsLength; j < columnsLength; j++) {
|
|
142
|
-
const column = columns[j];
|
|
143
|
-
outRow[column.alias] = column.decode(row[keys[j]]);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
for (let j = 0; j < aggregateKeys.length; j++) {
|
|
147
|
-
const key = aggregateKeys[j];
|
|
148
|
-
const parse = span.aggregates[key].column?.decode || Number.parseFloat;
|
|
149
|
-
outRow[key] = parse(row[keys[j+columnsLength]]);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
keys.splice(0, columnsLength + aggregateKeys.length);
|
|
155
|
-
|
|
156
|
-
await decodeRelations(strategy, span, rows, outRows, keys);
|
|
157
|
-
await manyPromise;
|
|
158
|
-
return outRows;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
function createGetIds() {
|
|
162
|
-
const primaryColumns = table._primaryColumns;
|
|
163
|
-
const length = primaryColumns.length;
|
|
164
|
-
if (length === 1) {
|
|
165
|
-
const alias = table._primaryColumns[0].alias;
|
|
166
|
-
return (row) => row[alias];
|
|
167
|
-
}
|
|
168
|
-
else
|
|
169
|
-
return (row) => {
|
|
170
|
-
const result = new Array(length);
|
|
171
|
-
for (let i = 0; i < length; i++) {
|
|
172
|
-
result[i] = row[primaryColumns[i].alias];
|
|
173
|
-
}
|
|
174
|
-
return result;
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async function decodeManyRelations(strategy, span, rawRows, resultRows, keys) {
|
|
181
|
-
const promises = [];
|
|
182
|
-
const c = {};
|
|
183
|
-
c.visitJoin = () => {};
|
|
184
|
-
c.visitOne = c.visitJoin;
|
|
185
|
-
|
|
186
|
-
c.visitMany = function(leg) {
|
|
187
|
-
const name = leg.name;
|
|
188
|
-
const table = span.table;
|
|
189
|
-
const relation = table._relations[name];
|
|
190
|
-
const filter = createOneFilter(relation, span._ids);
|
|
191
|
-
const rowsMap = span._rowsMap;
|
|
192
|
-
const p = getManyDto(relation.childTable, filter, strategy[name], leg.span).then(subRows => {
|
|
193
|
-
for (let i = 0; i < subRows.length; i++) {
|
|
194
|
-
const key = leg.columns.map(column => subRows[i][column.alias]);
|
|
195
|
-
const parentRow = getFromMap(rowsMap, table._primaryColumns, key);
|
|
196
|
-
parentRow[name].push(subRows[i]);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
promises.push(p);
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
span.legs.forEach(onEachLeg);
|
|
203
|
-
|
|
204
|
-
function onEachLeg(leg) {
|
|
205
|
-
leg.accept(c);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
await Promise.all(promises);
|
|
209
|
-
}
|
|
210
|
-
async function decodeRelations(strategy, span, rawRows, resultRows, keys) {
|
|
211
|
-
const promises = [];
|
|
212
|
-
const c = {};
|
|
213
|
-
c.visitJoin = function(leg) {
|
|
214
|
-
const name = leg.name;
|
|
215
|
-
const p = decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
216
|
-
for (let i = 0; i < rows.length; i++) {
|
|
217
|
-
resultRows[i][name] = rows[i];
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
promises.push(p);
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
c.visitOne = c.visitJoin;
|
|
224
|
-
|
|
225
|
-
c.visitMany = () => {};
|
|
226
|
-
// function(leg) {
|
|
227
|
-
// const name = leg.name;
|
|
228
|
-
// const table = span.table;
|
|
229
|
-
// const relation = table._relations[name];
|
|
230
|
-
// const filter = createOneFilter(relation, span._ids);
|
|
231
|
-
// const rowsMap = span._rowsMap;
|
|
232
|
-
// const p = getManyDto(relation.childTable, filter, strategy[name], leg.span).then(subRows => {
|
|
233
|
-
// for (let i = 0; i < subRows.length; i++) {
|
|
234
|
-
// const key = leg.columns.map(column => subRows[i][column.alias]);
|
|
235
|
-
// const parentRow = getFromMap(rowsMap, table._primaryColumns, key);
|
|
236
|
-
// parentRow[name].push(subRows[i]);
|
|
237
|
-
// }
|
|
238
|
-
// });
|
|
239
|
-
// promises.push(p);
|
|
240
|
-
// };
|
|
241
|
-
|
|
242
|
-
span.legs.forEach(onEachLeg);
|
|
243
|
-
|
|
244
|
-
function onEachLeg(leg) {
|
|
245
|
-
leg.accept(c);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
await Promise.all(promises);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function createOneFilter(relation, ids) {
|
|
252
|
-
const columns = relation.joinRelation.columns;
|
|
253
|
-
|
|
254
|
-
if (columns.length === 1)
|
|
255
|
-
return columns[0].in(ids);
|
|
256
|
-
|
|
257
|
-
else
|
|
258
|
-
return createCompositeFilter();
|
|
259
|
-
|
|
260
|
-
function createCompositeFilter() {
|
|
261
|
-
let filter = emptyFilter;
|
|
262
|
-
for(let id of ids) {
|
|
263
|
-
let nextFilter;
|
|
264
|
-
for (let i = 0; i < columns.length; i++) {
|
|
265
|
-
if (nextFilter)
|
|
266
|
-
nextFilter = nextFilter.and(columns[i].eq(id[i]));
|
|
267
|
-
else
|
|
268
|
-
nextFilter = columns[i].eq(id[i]);
|
|
269
|
-
}
|
|
270
|
-
filter = filter.or(nextFilter);
|
|
271
|
-
}
|
|
272
|
-
return filter;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
function addToMap(map, primaryColumns, row) {
|
|
277
|
-
|
|
278
|
-
const lastIndex = primaryColumns.length - 1;
|
|
279
|
-
for (let i = 0; i < lastIndex; i++) {
|
|
280
|
-
const id = row[primaryColumns[i].alias];
|
|
281
|
-
if (map.has(id))
|
|
282
|
-
map = map.get(id);
|
|
283
|
-
else {
|
|
284
|
-
const next = new Map();
|
|
285
|
-
map.set(id, next);
|
|
286
|
-
map = next;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
map.set(row[primaryColumns[lastIndex].alias], row);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function getFromMap(map, primaryColumns, values) {
|
|
293
|
-
const length = primaryColumns.length;
|
|
294
|
-
for (let i = 0; i < length; i++) {
|
|
295
|
-
map = map.get(values[i]);
|
|
296
|
-
}
|
|
297
|
-
return map;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
module.exports = getManyDto;
|