@oino-ts/db-mssql 0.5.1 → 0.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.
@@ -242,7 +242,7 @@ class OINODbMsSql extends db_1.OINODb {
242
242
  else if (sqlValue === undefined) {
243
243
  return undefined;
244
244
  }
245
- else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof (sqlValue) == "string")) {
245
+ else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof (sqlValue) == "string") && (sqlValue != "")) {
246
246
  return new Date(sqlValue);
247
247
  }
248
248
  else {
@@ -271,6 +271,9 @@ class OINODbMsSql extends db_1.OINODb {
271
271
  if (whereCondition != "") {
272
272
  result += " WHERE " + whereCondition;
273
273
  }
274
+ if (groupByCondition != "") {
275
+ result += " GROUP BY " + groupByCondition;
276
+ }
274
277
  if (orderCondition != "") {
275
278
  result += " ORDER BY " + orderCondition;
276
279
  }
@@ -282,9 +285,6 @@ class OINODbMsSql extends db_1.OINODb {
282
285
  result += " OFFSET " + limit_parts[1] + " ROWS FETCH NEXT " + limit_parts[0] + " ROWS ONLY";
283
286
  }
284
287
  }
285
- if (groupByCondition != "") {
286
- result += " GROUP BY " + groupByCondition;
287
- }
288
288
  result += ";";
289
289
  // OINOLog.debug("OINODb.printSqlSelect", {result:result})
290
290
  return result;
@@ -306,6 +306,37 @@ class OINODbMsSql extends db_1.OINODb {
306
306
  throw new Error(db_1.OINO_ERROR_PREFIX + ": Error connecting to OINODbMsSql server: " + err);
307
307
  }
308
308
  }
309
+ /**
310
+ * Validate connection to database is working.
311
+ *
312
+ */
313
+ async validate() {
314
+ db_1.OINOBenchmark.start("OINODb", "validate");
315
+ let result = new db_1.OINOResult();
316
+ try {
317
+ const sql = this._getValidateSql(this._params.database);
318
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql:sql})
319
+ const sql_res = await this.sqlSelect(sql);
320
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql_res:sql_res})
321
+ if (sql_res.isEmpty()) {
322
+ result.setError(400, "DB returned no rows for select!", "OINODbBunSqlite.validate");
323
+ }
324
+ else if (sql_res.getRow().length == 0) {
325
+ result.setError(400, "DB returned no values for database!", "OINODbBunSqlite.validate");
326
+ }
327
+ else if (sql_res.getRow()[0] == "0") {
328
+ result.setError(400, "DB returned no schema for database!", "OINODbBunSqlite.validate");
329
+ }
330
+ else {
331
+ // connection is working
332
+ }
333
+ }
334
+ catch (e) {
335
+ result.setError(500, db_1.OINO_ERROR_PREFIX + " (validate): OINODbBunSqlite.validate exception in _db.query: " + e.message, "OINODbBunSqlite.validate");
336
+ }
337
+ db_1.OINOBenchmark.end("OINODb", "validate");
338
+ return result;
339
+ }
309
340
  /**
310
341
  * Execute a select operation.
311
342
  *
@@ -316,7 +347,7 @@ class OINODbMsSql extends db_1.OINODb {
316
347
  db_1.OINOBenchmark.start("OINODb", "sqlSelect");
317
348
  let result;
318
349
  try {
319
- // OINOLog.debug("OINODbMsSql.sqlSelect", {sql_rows:sql_rows})
350
+ // OINOLog.debug("OINODbMsSql.sqlSelect", {sql:sql})
320
351
  result = await this._query(sql);
321
352
  }
322
353
  catch (e) {
@@ -367,6 +398,21 @@ WHERE C.TABLE_CATALOG = '${dbName}' AND C.TABLE_NAME = '${tableName}'
367
398
  ORDER BY C.ORDINAL_POSITION;`;
368
399
  return sql;
369
400
  }
401
+ _getValidateSql(dbName) {
402
+ const sql = `SELECT
403
+ count(C.COLUMN_NAME) AS COLUMN_COUNT
404
+ FROM
405
+ INFORMATION_SCHEMA.COLUMNS as C LEFT JOIN
406
+ (
407
+ SELECT TC.TABLE_NAME, KU.COLUMN_NAME, STRING_AGG(TC.CONSTRAINT_TYPE, ',') as CONSTRAINT_TYPES
408
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
409
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU ON TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME
410
+ GROUP BY TC.TABLE_NAME, KU.COLUMN_NAME
411
+ ) as CONST
412
+ ON C.TABLE_NAME = CONST.TABLE_NAME AND C.COLUMN_NAME = CONST.COLUMN_NAME
413
+ WHERE C.TABLE_CATALOG = '${dbName}';`;
414
+ return sql;
415
+ }
370
416
  /**
371
417
  * Initialize a data model by getting the SQL schema and populating OINODbDataFields of
372
418
  * the model.
@@ -3,7 +3,7 @@
3
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
4
4
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import { OINODb, OINODbDataSet, OINOBooleanDataField, OINONumberDataField, OINOStringDataField, OINO_ERROR_PREFIX, OINOBenchmark, OINODatetimeDataField, OINOBlobDataField, OINO_INFO_PREFIX, OINODB_EMPTY_ROW, OINODB_EMPTY_ROWS, OINOLog } from "@oino-ts/db";
6
+ import { OINODb, OINODbDataSet, OINOBooleanDataField, OINONumberDataField, OINOStringDataField, OINO_ERROR_PREFIX, OINOBenchmark, OINODatetimeDataField, OINOBlobDataField, OINO_INFO_PREFIX, OINODB_EMPTY_ROW, OINODB_EMPTY_ROWS, OINOLog, OINOResult } from "@oino-ts/db";
7
7
  import { ConnectionPool } from "mssql";
8
8
  /**
9
9
  * Implmentation of OINODbDataSet for MariaDb.
@@ -239,7 +239,7 @@ export class OINODbMsSql extends OINODb {
239
239
  else if (sqlValue === undefined) {
240
240
  return undefined;
241
241
  }
242
- else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof (sqlValue) == "string")) {
242
+ else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof (sqlValue) == "string") && (sqlValue != "")) {
243
243
  return new Date(sqlValue);
244
244
  }
245
245
  else {
@@ -268,6 +268,9 @@ export class OINODbMsSql extends OINODb {
268
268
  if (whereCondition != "") {
269
269
  result += " WHERE " + whereCondition;
270
270
  }
271
+ if (groupByCondition != "") {
272
+ result += " GROUP BY " + groupByCondition;
273
+ }
271
274
  if (orderCondition != "") {
272
275
  result += " ORDER BY " + orderCondition;
273
276
  }
@@ -279,9 +282,6 @@ export class OINODbMsSql extends OINODb {
279
282
  result += " OFFSET " + limit_parts[1] + " ROWS FETCH NEXT " + limit_parts[0] + " ROWS ONLY";
280
283
  }
281
284
  }
282
- if (groupByCondition != "") {
283
- result += " GROUP BY " + groupByCondition;
284
- }
285
285
  result += ";";
286
286
  // OINOLog.debug("OINODb.printSqlSelect", {result:result})
287
287
  return result;
@@ -303,6 +303,37 @@ export class OINODbMsSql extends OINODb {
303
303
  throw new Error(OINO_ERROR_PREFIX + ": Error connecting to OINODbMsSql server: " + err);
304
304
  }
305
305
  }
306
+ /**
307
+ * Validate connection to database is working.
308
+ *
309
+ */
310
+ async validate() {
311
+ OINOBenchmark.start("OINODb", "validate");
312
+ let result = new OINOResult();
313
+ try {
314
+ const sql = this._getValidateSql(this._params.database);
315
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql:sql})
316
+ const sql_res = await this.sqlSelect(sql);
317
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql_res:sql_res})
318
+ if (sql_res.isEmpty()) {
319
+ result.setError(400, "DB returned no rows for select!", "OINODbBunSqlite.validate");
320
+ }
321
+ else if (sql_res.getRow().length == 0) {
322
+ result.setError(400, "DB returned no values for database!", "OINODbBunSqlite.validate");
323
+ }
324
+ else if (sql_res.getRow()[0] == "0") {
325
+ result.setError(400, "DB returned no schema for database!", "OINODbBunSqlite.validate");
326
+ }
327
+ else {
328
+ // connection is working
329
+ }
330
+ }
331
+ catch (e) {
332
+ result.setError(500, OINO_ERROR_PREFIX + " (validate): OINODbBunSqlite.validate exception in _db.query: " + e.message, "OINODbBunSqlite.validate");
333
+ }
334
+ OINOBenchmark.end("OINODb", "validate");
335
+ return result;
336
+ }
306
337
  /**
307
338
  * Execute a select operation.
308
339
  *
@@ -313,7 +344,7 @@ export class OINODbMsSql extends OINODb {
313
344
  OINOBenchmark.start("OINODb", "sqlSelect");
314
345
  let result;
315
346
  try {
316
- // OINOLog.debug("OINODbMsSql.sqlSelect", {sql_rows:sql_rows})
347
+ // OINOLog.debug("OINODbMsSql.sqlSelect", {sql:sql})
317
348
  result = await this._query(sql);
318
349
  }
319
350
  catch (e) {
@@ -364,6 +395,21 @@ WHERE C.TABLE_CATALOG = '${dbName}' AND C.TABLE_NAME = '${tableName}'
364
395
  ORDER BY C.ORDINAL_POSITION;`;
365
396
  return sql;
366
397
  }
398
+ _getValidateSql(dbName) {
399
+ const sql = `SELECT
400
+ count(C.COLUMN_NAME) AS COLUMN_COUNT
401
+ FROM
402
+ INFORMATION_SCHEMA.COLUMNS as C LEFT JOIN
403
+ (
404
+ SELECT TC.TABLE_NAME, KU.COLUMN_NAME, STRING_AGG(TC.CONSTRAINT_TYPE, ',') as CONSTRAINT_TYPES
405
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
406
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU ON TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME
407
+ GROUP BY TC.TABLE_NAME, KU.COLUMN_NAME
408
+ ) as CONST
409
+ ON C.TABLE_NAME = CONST.TABLE_NAME AND C.COLUMN_NAME = CONST.COLUMN_NAME
410
+ WHERE C.TABLE_CATALOG = '${dbName}';`;
411
+ return sql;
412
+ }
367
413
  /**
368
414
  * Initialize a data model by getting the SQL schema and populating OINODbDataFields of
369
415
  * the model.
@@ -1,4 +1,4 @@
1
- import { OINODb, OINODbParams, OINODbDataSet, OINODbApi, OINODataCell } from "@oino-ts/db";
1
+ import { OINODb, OINODbParams, OINODbDataSet, OINODbApi, OINODataCell, OINOResult } from "@oino-ts/db";
2
2
  /**
3
3
  * Implementation of MariaDb/MySql-database.
4
4
  *
@@ -68,6 +68,11 @@ export declare class OINODbMsSql extends OINODb {
68
68
  *
69
69
  */
70
70
  connect(): Promise<boolean>;
71
+ /**
72
+ * Validate connection to database is working.
73
+ *
74
+ */
75
+ validate(): Promise<OINOResult>;
71
76
  /**
72
77
  * Execute a select operation.
73
78
  *
@@ -83,6 +88,7 @@ export declare class OINODbMsSql extends OINODb {
83
88
  */
84
89
  sqlExec(sql: string): Promise<OINODbDataSet>;
85
90
  private _getSchemaSql;
91
+ private _getValidateSql;
86
92
  /**
87
93
  * Initialize a data model by getting the SQL schema and populating OINODbDataFields of
88
94
  * the model.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oino-ts/db-mssql",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "description": "OINO TS package for using Microsoft Sql databases.",
5
5
  "author": "Matias Kiviniemi (pragmatta)",
6
6
  "license": "MPL-2.0",
@@ -22,7 +22,7 @@
22
22
  "module": "./dist/esm/index.js",
23
23
  "types": "./dist/types/index.d.ts",
24
24
  "dependencies": {
25
- "@oino-ts/db": "0.5.1",
25
+ "@oino-ts/db": "0.6.0",
26
26
  "mssql": "^11.0.1"
27
27
  },
28
28
  "devDependencies": {
@@ -4,7 +4,7 @@
4
4
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
6
 
7
- import { OINODb, OINODbParams, OINODbDataSet, OINODbApi, OINOBooleanDataField, OINONumberDataField, OINOStringDataField, OINODbDataFieldParams, OINO_ERROR_PREFIX, OINODataRow, OINODataCell, OINOBenchmark, OINODatetimeDataField, OINOBlobDataField, OINO_INFO_PREFIX, OINODB_EMPTY_ROW, OINODB_EMPTY_ROWS, OINOLog } from "@oino-ts/db";
7
+ import { OINODb, OINODbParams, OINODbDataSet, OINODbApi, OINOBooleanDataField, OINONumberDataField, OINOStringDataField, OINODbDataFieldParams, OINO_ERROR_PREFIX, OINODataRow, OINODataCell, OINOBenchmark, OINODatetimeDataField, OINOBlobDataField, OINO_INFO_PREFIX, OINODB_EMPTY_ROW, OINODB_EMPTY_ROWS, OINOLog, OINOResult } from "@oino-ts/db";
8
8
 
9
9
  import {ConnectionPool, config} from "mssql";
10
10
 
@@ -256,7 +256,7 @@ export class OINODbMsSql extends OINODb {
256
256
  } else if (sqlValue === undefined) {
257
257
  return undefined
258
258
 
259
- } else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof(sqlValue) == "string")) {
259
+ } else if (((sqlType == "date") || (sqlType == "datetime") || (sqlType == "datetime2")) && (typeof(sqlValue) == "string") && (sqlValue != "")) {
260
260
  return new Date(sqlValue)
261
261
 
262
262
  } else {
@@ -287,6 +287,9 @@ export class OINODbMsSql extends OINODb {
287
287
  if (whereCondition != "") {
288
288
  result += " WHERE " + whereCondition
289
289
  }
290
+ if (groupByCondition != "") {
291
+ result += " GROUP BY " + groupByCondition
292
+ }
290
293
  if (orderCondition != "") {
291
294
  result += " ORDER BY " + orderCondition
292
295
  }
@@ -297,9 +300,6 @@ export class OINODbMsSql extends OINODb {
297
300
  result += " OFFSET " + limit_parts[1] + " ROWS FETCH NEXT " + limit_parts[0] + " ROWS ONLY"
298
301
  }
299
302
  }
300
- if (groupByCondition != "") {
301
- result += " GROUP BY " + groupByCondition
302
- }
303
303
  result += ";"
304
304
  // OINOLog.debug("OINODb.printSqlSelect", {result:result})
305
305
  return result;
@@ -322,6 +322,37 @@ export class OINODbMsSql extends OINODb {
322
322
  }
323
323
  }
324
324
 
325
+ /**
326
+ * Validate connection to database is working.
327
+ *
328
+ */
329
+ async validate(): Promise<OINOResult> {
330
+ OINOBenchmark.start("OINODb", "validate")
331
+ let result:OINOResult = new OINOResult()
332
+ try {
333
+ const sql = this._getValidateSql(this._params.database)
334
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql:sql})
335
+ const sql_res:OINODbDataSet = await this.sqlSelect(sql)
336
+ // OINOLog.debug("OINODbBunSqlite.validate", {sql_res:sql_res})
337
+ if (sql_res.isEmpty()) {
338
+ result.setError(400, "DB returned no rows for select!", "OINODbBunSqlite.validate")
339
+
340
+ } else if (sql_res.getRow().length == 0) {
341
+ result.setError(400, "DB returned no values for database!", "OINODbBunSqlite.validate")
342
+
343
+ } else if (sql_res.getRow()[0] == "0") {
344
+ result.setError(400, "DB returned no schema for database!", "OINODbBunSqlite.validate")
345
+
346
+ } else {
347
+ // connection is working
348
+ }
349
+ } catch (e:any) {
350
+ result.setError(500, OINO_ERROR_PREFIX + " (validate): OINODbBunSqlite.validate exception in _db.query: " + e.message, "OINODbBunSqlite.validate")
351
+ }
352
+ OINOBenchmark.end("OINODb", "validate")
353
+ return result
354
+ }
355
+
325
356
  /**
326
357
  * Execute a select operation.
327
358
  *
@@ -332,7 +363,7 @@ export class OINODbMsSql extends OINODb {
332
363
  OINOBenchmark.start("OINODb", "sqlSelect")
333
364
  let result:OINODbDataSet
334
365
  try {
335
- // OINOLog.debug("OINODbMsSql.sqlSelect", {sql_rows:sql_rows})
366
+ // OINOLog.debug("OINODbMsSql.sqlSelect", {sql:sql})
336
367
  result = await this._query(sql)
337
368
 
338
369
  } catch (e:any) {
@@ -386,6 +417,24 @@ WHERE C.TABLE_CATALOG = '${dbName}' AND C.TABLE_NAME = '${tableName}'
386
417
  ORDER BY C.ORDINAL_POSITION;`
387
418
  return sql
388
419
  }
420
+
421
+ private _getValidateSql(dbName:string):string {
422
+ const sql =
423
+ `SELECT
424
+ count(C.COLUMN_NAME) AS COLUMN_COUNT
425
+ FROM
426
+ INFORMATION_SCHEMA.COLUMNS as C LEFT JOIN
427
+ (
428
+ SELECT TC.TABLE_NAME, KU.COLUMN_NAME, STRING_AGG(TC.CONSTRAINT_TYPE, ',') as CONSTRAINT_TYPES
429
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
430
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU ON TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME
431
+ GROUP BY TC.TABLE_NAME, KU.COLUMN_NAME
432
+ ) as CONST
433
+ ON C.TABLE_NAME = CONST.TABLE_NAME AND C.COLUMN_NAME = CONST.COLUMN_NAME
434
+ WHERE C.TABLE_CATALOG = '${dbName}';`
435
+ return sql
436
+ }
437
+
389
438
  /**
390
439
  * Initialize a data model by getting the SQL schema and populating OINODbDataFields of
391
440
  * the model.