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.
@@ -5,7 +5,7 @@
5
5
  "version": "0.2.0",
6
6
  "configurations": [
7
7
  {
8
- "type": "node",
8
+ "type": "pwa-node",
9
9
  "request": "launch",
10
10
  "name": "Launch Program",
11
11
  "skipFiles": [
@@ -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.2",
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": ["database","relational","sql","mysql","mariadb","sqlite","sqlite3","mssql","postgresql","pg"]
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
  }