@oino-ts/db-mssql 0.5.2 → 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.
- package/dist/cjs/OINODbMsSql.js +50 -4
- package/dist/esm/OINODbMsSql.js +51 -5
- package/dist/types/OINODbMsSql.d.ts +7 -1
- package/package.json +2 -2
- package/src/OINODbMsSql.ts +54 -5
package/dist/cjs/OINODbMsSql.js
CHANGED
|
@@ -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", {
|
|
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.
|
package/dist/esm/OINODbMsSql.js
CHANGED
|
@@ -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.
|
|
@@ -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", {
|
|
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.
|
|
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.
|
|
25
|
+
"@oino-ts/db": "0.6.0",
|
|
26
26
|
"mssql": "^11.0.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
package/src/OINODbMsSql.ts
CHANGED
|
@@ -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
|
|
|
@@ -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", {
|
|
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.
|