xardao 1.3.2 → 1.4.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.
- package/.vscode/launch.json +1 -1
- package/lib/driver-snowflake.js +359 -0
- package/lib/xardao.js +13 -1
- package/package.json +13 -2
package/.vscode/launch.json
CHANGED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* driver_mariadb.js
|
|
3
|
+
* MariaDB xardao driver
|
|
4
|
+
*
|
|
5
|
+
* Author : Stephane Potelle
|
|
6
|
+
* Email : stephane.potelle@gmail.com
|
|
7
|
+
********************************************************************************/
|
|
8
|
+
|
|
9
|
+
var sf
|
|
10
|
+
try {
|
|
11
|
+
sf = require('snowflake-sdk');
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error("Please add module \"snowflake-sdk\" to your package.json dependencies")
|
|
14
|
+
process.exit(1)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var common = require ('./common.js');
|
|
18
|
+
var ESNext = require('./esnext');
|
|
19
|
+
|
|
20
|
+
isFunction = common.isFunction;
|
|
21
|
+
then = common.then;
|
|
22
|
+
|
|
23
|
+
class Connection {
|
|
24
|
+
constructor(connUrlInfo) {
|
|
25
|
+
this.debugMode = false;
|
|
26
|
+
this.lastInsertId = null;
|
|
27
|
+
this.lastStatementChanges = null;
|
|
28
|
+
this.timeoutMilliSeconds = 10000;
|
|
29
|
+
this.saveDatesAsUTC = true
|
|
30
|
+
this.transactionLevel = 0
|
|
31
|
+
this.connUrlInfo=connUrlInfo
|
|
32
|
+
|
|
33
|
+
this.open = ESNext(this.openCB,this)
|
|
34
|
+
this.getObjects = ESNext(this.getObjectsCB,this)
|
|
35
|
+
this.getSingleObject = ESNext(this.getSingleObjectCB ,this)
|
|
36
|
+
this.getList = ESNext(this.getListCB,this)
|
|
37
|
+
this.getKVList = ESNext(this.getKVListCB,this)
|
|
38
|
+
this.getScalar = ESNext(this.getScalarCB,this)
|
|
39
|
+
this.exec = ESNext(this.execCB,this)
|
|
40
|
+
this.execSingle = ESNext(this.execSingleCB,this)
|
|
41
|
+
this.execMultiple = ESNext(this.execMultipleCB,this)
|
|
42
|
+
//this.readTableStructure = ESNext(this.readTableStructureCB,this)
|
|
43
|
+
this.beginTrans = ESNext(this.beginTransCB, this)
|
|
44
|
+
this.commitTrans = ESNext(this.commitTransCB, this)
|
|
45
|
+
this.rollbackTrans = ESNext(this.rollbackTransCB, this)
|
|
46
|
+
this.close = ESNext(this.closeCB,this)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
open() {}
|
|
50
|
+
getObjects() {}
|
|
51
|
+
getSingleObject () {}
|
|
52
|
+
getList() {}
|
|
53
|
+
getKVList() {}
|
|
54
|
+
getScalar() {}
|
|
55
|
+
exec() {}
|
|
56
|
+
execSingle() {}
|
|
57
|
+
execMultiple() {}
|
|
58
|
+
readTableStructure() {}
|
|
59
|
+
close() {}
|
|
60
|
+
|
|
61
|
+
debug(f,s) {
|
|
62
|
+
if (this.debugMode) console.error(f + ": " + s)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
openCB(dbInfo, callback) {
|
|
66
|
+
if ( typeof(this.connUrlInfo) == 'object' ) {
|
|
67
|
+
let conninfo = {
|
|
68
|
+
account: this.connUrlInfo.options.account,
|
|
69
|
+
username: this.connUrlInfo.options.user,
|
|
70
|
+
password: this.connUrlInfo.options.password,
|
|
71
|
+
//application: application
|
|
72
|
+
database: this.connUrlInfo.options.db,
|
|
73
|
+
schema: this.connUrlInfo.options.schema,
|
|
74
|
+
warehouse: this.connUrlInfo.options.warehouse,
|
|
75
|
+
authenticator: "SNOWFLAKE"
|
|
76
|
+
}
|
|
77
|
+
this.db = new sf.createConnection( conninfo )
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
throw "Only URI-based connection is allowed"
|
|
81
|
+
}
|
|
82
|
+
this.debug('open','Opening connection for MariaDB')
|
|
83
|
+
this.db.connect( callback )
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
batch() {
|
|
87
|
+
return new common.Batch(this);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
beginTransCB(callback) {
|
|
92
|
+
callback()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
commitTransCB(callback) {
|
|
96
|
+
callback()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
rollbackTransCB(callback) {
|
|
100
|
+
callback()
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
closeCB(callback) {
|
|
104
|
+
try {
|
|
105
|
+
this.debug('close','Closing connection for MariaDB')
|
|
106
|
+
this.db.destroy();
|
|
107
|
+
then(callback);
|
|
108
|
+
} catch (e) {
|
|
109
|
+
then( function() { callback(e) } );
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
sqlDate(d) { return common.sqlDate(this,d) }
|
|
114
|
+
sqlParam(value) { return common.sqlParam(this, value) }
|
|
115
|
+
mergeParams(sql, params) { return common.mergeParams(this, sql, params) }
|
|
116
|
+
getRealSql(queryObject) { return common.getRealSql(this, queryObject) }
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
getObjectsCB(params, callback) {
|
|
120
|
+
var ts = Date.now();
|
|
121
|
+
var realSql = this.getRealSql(params);
|
|
122
|
+
var self = this;
|
|
123
|
+
var useSnakeCase = false
|
|
124
|
+
var useCamelCase = false
|
|
125
|
+
if ( params.options ) {
|
|
126
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
127
|
+
useCamelCase = params.options.useCamelCase || false
|
|
128
|
+
}
|
|
129
|
+
this.debug("getObjects",realSql);
|
|
130
|
+
|
|
131
|
+
function finish() {
|
|
132
|
+
self.debug("getObjects",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
133
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
this.db.execute( {
|
|
137
|
+
sqlText: realSql,
|
|
138
|
+
complete: function(err, stmt, rows) {
|
|
139
|
+
let ret =[]
|
|
140
|
+
|
|
141
|
+
function finish() {
|
|
142
|
+
self.debug("getObjects",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
143
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (err) {
|
|
147
|
+
self.debug("getObjects",'Error: '+err.code)
|
|
148
|
+
then( function() {callback(err)})
|
|
149
|
+
} else {
|
|
150
|
+
if (rows.length > 0 ) {
|
|
151
|
+
ret=rows
|
|
152
|
+
if (useSnakeCase) { for ( let i =0 ; i< ret.length; i++ ) { ret[i] = common.toSnakeCase(ret[i])} }
|
|
153
|
+
if (useCamelCase) { for ( let i =0 ; i< ret.length; i++ ) { ret[i] = common.toCamelCase(ret[i])} }
|
|
154
|
+
}
|
|
155
|
+
finish()
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
getSingleObjectCB(params, callback) {
|
|
162
|
+
var ts = Date.now();
|
|
163
|
+
var realSql = this.getRealSql(params);
|
|
164
|
+
var self = this;
|
|
165
|
+
var useSnakeCase = false
|
|
166
|
+
var useCamelCase = false
|
|
167
|
+
if ( params.options ) {
|
|
168
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
169
|
+
useCamelCase = params.options.useCamelCase || false
|
|
170
|
+
}
|
|
171
|
+
this.debug("getObjects",realSql);
|
|
172
|
+
|
|
173
|
+
this.db.execute( {
|
|
174
|
+
sqlText: realSql,
|
|
175
|
+
complete: function(err, stmt, rows) {
|
|
176
|
+
let ret =[]
|
|
177
|
+
|
|
178
|
+
function finish() {
|
|
179
|
+
self.debug("getSingleObject",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
180
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (err) {
|
|
184
|
+
self.debug("getSingleObject",'Error: '+err.code)
|
|
185
|
+
then( function() {callback(err)})
|
|
186
|
+
} else {
|
|
187
|
+
if (rows.length > 0 ) {
|
|
188
|
+
let ret = rows[0];
|
|
189
|
+
if (useSnakeCase) ret = common.toSnakeCase(ret)
|
|
190
|
+
if (useCamelCase) ret = common.toCamelCase(ret)
|
|
191
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
192
|
+
} else {
|
|
193
|
+
if (isFunction(callback)) then( function() { callback(undefined, undefined) } );
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
getListCB(params, callback) {
|
|
201
|
+
var ts = Date.now();
|
|
202
|
+
var realSql = this.getRealSql(params);
|
|
203
|
+
var self = this;
|
|
204
|
+
var useSnakeCase = false
|
|
205
|
+
var useCamelCase = false
|
|
206
|
+
if ( params.options ) {
|
|
207
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
208
|
+
useCamelCase = params.options.useCamelCase || false
|
|
209
|
+
}
|
|
210
|
+
this.debug("getList",realSql);
|
|
211
|
+
|
|
212
|
+
this.db.execute( {
|
|
213
|
+
sqlText: realSql,
|
|
214
|
+
complete: function(err, stmt, rows) {
|
|
215
|
+
let ret =[]
|
|
216
|
+
|
|
217
|
+
function finish() {
|
|
218
|
+
self.debug("getList",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
219
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (err) {
|
|
223
|
+
self.debug("getList",'Error: '+err.code)
|
|
224
|
+
then( function() {callback(err)})
|
|
225
|
+
} else {
|
|
226
|
+
let list = [];
|
|
227
|
+
if (rows.length > 0 ) {
|
|
228
|
+
let k = Object.keys(rows[0]);
|
|
229
|
+
let k1 = k[0];
|
|
230
|
+
for (let r = 0; r<rows.length; r++ ) {
|
|
231
|
+
list.push(rows[r][k1]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
self.debug("getList",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
235
|
+
if (isFunction(callback)) then( function() { undefined, callback(undefined,list) } );
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
})
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
getKVListCB(params, callback) {
|
|
242
|
+
var ts = Date.now();
|
|
243
|
+
var realSql = this.getRealSql(params);
|
|
244
|
+
var self = this;
|
|
245
|
+
var useSnakeCase = false
|
|
246
|
+
var useCamelCase = false
|
|
247
|
+
if ( params.options ) {
|
|
248
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
249
|
+
useCamelCase = params.options.useCamelCase || false
|
|
250
|
+
}
|
|
251
|
+
this.debug("getKVList",realSql);
|
|
252
|
+
|
|
253
|
+
this.db.execute( {
|
|
254
|
+
sqlText: realSql,
|
|
255
|
+
complete: function(err, stmt, rows) {
|
|
256
|
+
let ret =[]
|
|
257
|
+
|
|
258
|
+
function finish() {
|
|
259
|
+
self.debug("getKVList",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
260
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (err) {
|
|
264
|
+
self.debug("getKVList",'Error: '+err.code)
|
|
265
|
+
then( function() {callback(err)})
|
|
266
|
+
} else {
|
|
267
|
+
let list = [];
|
|
268
|
+
if (rows.length > 0 ) {
|
|
269
|
+
let k = Object.keys(rows[0]);
|
|
270
|
+
let k1 = k[0];
|
|
271
|
+
let k2
|
|
272
|
+
if (k.length>=2) k2 = k[1]; else k2=k[0];
|
|
273
|
+
for (let r = 0; r<rows.length; r++ ) {
|
|
274
|
+
list.push( [ rows[r][k1], rows[r][k2]]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
self.debug("getKVList",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
278
|
+
if (isFunction(callback)) then( function() { undefined, callback(undefined,list) } );
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
})
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
getScalarCB(params, callback) {
|
|
285
|
+
var ts = Date.now();
|
|
286
|
+
var realSql = this.getRealSql(params);
|
|
287
|
+
var self = this;
|
|
288
|
+
var useSnakeCase = false
|
|
289
|
+
var useCamelCase = false
|
|
290
|
+
if ( params.options ) {
|
|
291
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
292
|
+
useCamelCase = params.options.useCamelCase || false
|
|
293
|
+
}
|
|
294
|
+
this.debug("getScalar",realSql);
|
|
295
|
+
|
|
296
|
+
this.db.execute( {
|
|
297
|
+
sqlText: realSql,
|
|
298
|
+
complete: function(err, stmt, rows) {
|
|
299
|
+
let ret =[]
|
|
300
|
+
|
|
301
|
+
function finish() {
|
|
302
|
+
self.debug("getScalar",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
303
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (err) {
|
|
307
|
+
self.debug("getScalar",'Error: '+err.code)
|
|
308
|
+
then( function() {callback(err)})
|
|
309
|
+
} else {
|
|
310
|
+
if (rows.length > 0 ) {
|
|
311
|
+
let k = Object.keys(rows[0]);
|
|
312
|
+
let k1 = k[0];
|
|
313
|
+
let ret = rows[0][k1];
|
|
314
|
+
if (isFunction(callback)) then( function() { callback(undefined, ret) } );
|
|
315
|
+
} else {
|
|
316
|
+
if (isFunction(callback)) then( function() { callback(undefined, null) } );
|
|
317
|
+
}
|
|
318
|
+
self.debug("getScalar",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
})
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
execCB(params, callback) { common.exec(this, params, callback) }
|
|
326
|
+
execMultipleCB(queries, callback) { common.execMultiple(this, queries, callback) }
|
|
327
|
+
|
|
328
|
+
execSingleCB(params, callback) {
|
|
329
|
+
var ts = Date.now();
|
|
330
|
+
var realSql = this.getRealSql(params);
|
|
331
|
+
var self = this;
|
|
332
|
+
var useSnakeCase = false
|
|
333
|
+
var useCamelCase = false
|
|
334
|
+
if ( params.options ) {
|
|
335
|
+
useSnakeCase = params.options.useSnakeCase || false
|
|
336
|
+
useCamelCase = params.options.useCamelCase || false
|
|
337
|
+
}
|
|
338
|
+
this.debug("execSingle",realSql);
|
|
339
|
+
|
|
340
|
+
this.db.execute( {
|
|
341
|
+
sqlText: realSql,
|
|
342
|
+
complete: function(err, stmt, rows) {
|
|
343
|
+
let ret =[]
|
|
344
|
+
|
|
345
|
+
if (err) {
|
|
346
|
+
self.debug("execSingle",'Error: '+err.code)
|
|
347
|
+
then( function() {callback(err)})
|
|
348
|
+
} else {
|
|
349
|
+
self.debug("execSingle",'Completed in ' + (Date.now() -ts) + ' ms');
|
|
350
|
+
then( function() {callback()})
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
})
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
exports.Connection = Connection;
|
|
359
|
+
|
package/lib/xardao.js
CHANGED
|
@@ -78,7 +78,15 @@ function Connection(url) {
|
|
|
78
78
|
return modCRUDAdapter.createCRUDAdapter(this, table, pk)
|
|
79
79
|
}
|
|
80
80
|
return cn
|
|
81
|
-
|
|
81
|
+
}
|
|
82
|
+
else if (driver == 'sf' || driver == 'snowflake') {
|
|
83
|
+
if ( Conn == undefined ) Conn = require ('./driver-snowflake').Connection
|
|
84
|
+
let cn = new Conn(connInfo)
|
|
85
|
+
cn.createCRUDAdapter = function(table, pk) {
|
|
86
|
+
return modCRUDAdapter.createCRUDAdapter(this, table, pk)
|
|
87
|
+
}
|
|
88
|
+
return cn
|
|
89
|
+
}
|
|
82
90
|
else {
|
|
83
91
|
throw new Error('Invalid xardao driver name')
|
|
84
92
|
}
|
|
@@ -105,6 +113,10 @@ exports.express.usingDBConnection = function usingDBConnection(connSpec, page )
|
|
|
105
113
|
}
|
|
106
114
|
else throw "Invalid database specification"
|
|
107
115
|
|
|
116
|
+
if (typeof(connInfo) == 'string') {
|
|
117
|
+
connInfo = { driver:connInfo, dbInfo: undefined}
|
|
118
|
+
}
|
|
119
|
+
|
|
108
120
|
var db = Connection(connInfo.driver)
|
|
109
121
|
db.debugMode = connInfo.debugMode || false
|
|
110
122
|
db.openCB(connInfo.dbInfo,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xardao",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Common Relational Data Access library",
|
|
5
5
|
"main": "./lib/xardao.js",
|
|
6
6
|
"scripts": {
|
|
@@ -18,5 +18,16 @@
|
|
|
18
18
|
"type": "git",
|
|
19
19
|
"url": "https://framagit.org/stefpo/xardao.git"
|
|
20
20
|
},
|
|
21
|
-
"keywords": [
|
|
21
|
+
"keywords": [
|
|
22
|
+
"database",
|
|
23
|
+
"relational",
|
|
24
|
+
"sql",
|
|
25
|
+
"mysql",
|
|
26
|
+
"mariadb",
|
|
27
|
+
"sqlite",
|
|
28
|
+
"sqlite3",
|
|
29
|
+
"mssql",
|
|
30
|
+
"postgresql",
|
|
31
|
+
"pg"
|
|
32
|
+
]
|
|
22
33
|
}
|