11import * as csv from 'csv' ;
22import getPort from 'get-port' ;
3- import { Database , Pool } from 'ibm_db' ;
3+ import { Database , Pool , SQLParam } from 'ibm_db' ;
44import { nanoid } from 'nanoid' ;
55import { Readable , Stream } from 'node:stream' ;
66import { LRUStorage } from '../../caching/lru-storage.js' ;
@@ -15,6 +15,7 @@ import { ForeignKeyDS } from '../shared/data-structures/foreign-key.ds.js';
1515import { FoundRowsDS } from '../shared/data-structures/found-rows.ds.js' ;
1616import { PrimaryKeyDS } from '../shared/data-structures/primary-key.ds.js' ;
1717import { ReferencedTableNamesAndColumnsDS } from '../shared/data-structures/referenced-table-names-columns.ds.js' ;
18+ import { RowsPaginationDS } from '../shared/data-structures/rows-pagination.ds.js' ;
1819import { TableSettingsDS } from '../shared/data-structures/table-settings.ds.js' ;
1920import { TableStructureDS } from '../shared/data-structures/table-structure.ds.js' ;
2021import { TableDS } from '../shared/data-structures/table.ds.js' ;
@@ -24,6 +25,21 @@ import { FilterCriteriaEnum } from '../../shared/enums/filter-criteria.enum.js';
2425import { IDataAccessObject } from '../../shared/interfaces/data-access-object.interface.js' ;
2526import { BasicDataAccessObject } from './basic-data-access-object.js' ;
2627
28+ interface IbmDb2Row {
29+ COLUMN_NAME : string ;
30+ DATA_TYPE : string ;
31+ CONSTRAINT_NAME ?: string ;
32+ REFERENCED_TABLE_NAME ?: string ;
33+ REFERENCED_COLUMN_NAME ?: string ;
34+ IS_NULLABLE ?: string ;
35+ COLUMN_DEFAULT ?: string ;
36+ CHARACTER_MAXIMUM_LENGTH ?: number ;
37+ TABLE_NAME ?: string ;
38+ TABLE_TYPE ?: string ;
39+ REFERENCING_TABLE_NAME ?: string ;
40+ REFERENCING_COLUMN_NAME ?: string ;
41+ }
42+
2743export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDataAccessObject {
2844 public async addRowInTable (
2945 tableName : string ,
@@ -51,7 +67,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
5167 const placeholders = Object . keys ( row )
5268 . map ( ( ) => '?' )
5369 . join ( ', ' ) ;
54- const values = Object . values ( row ) ;
70+ const values = Object . values ( row ) as SQLParam [ ] ;
5571 const query = `
5672 INSERT INTO ${ this . connection . schema . toUpperCase ( ) } .${ tableName . toUpperCase ( ) } (${ columns } )
5773 VALUES (${ placeholders } )
@@ -67,8 +83,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
6783 . map ( ( key ) => `${ key } = ?` )
6884 . join ( ' AND ' ) }
6985 ` ;
70- const result = await connectionToDb . query ( selectQuery , Object . values ( row ) ) ;
71- return result [ 0 ] ;
86+ const result = await connectionToDb . query ( selectQuery , Object . values ( row ) as SQLParam [ ] ) ;
87+ return result [ 0 ] as Record < string , unknown > ;
7288 }
7389 return row ;
7490 }
@@ -86,7 +102,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
86102 DELETE FROM ${ this . connection . schema . toUpperCase ( ) } .${ tableName . toUpperCase ( ) }
87103 WHERE ${ whereClause }
88104 ` ;
89- const params = Object . values ( primaryKey ) ;
105+ const params = Object . values ( primaryKey ) as SQLParam [ ] ;
90106 await connectionToDb . query ( query , params ) ;
91107 return primaryKey ;
92108 }
@@ -111,8 +127,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
111127 FROM ${ schemaName } .${ tableName . toUpperCase ( ) }
112128 WHERE ${ referencedFieldName } IN (${ placeholders } )
113129 ` ;
114- const result = connectionToDb . query ( query , [ ...fieldValues ] ) ;
115- return result ;
130+ const result = await connectionToDb . query ( query , [ ...fieldValues ] as SQLParam [ ] ) ;
131+ return result as Record < string , unknown > [ ] ;
116132 }
117133
118134 public async getRowByPrimaryKey (
@@ -136,9 +152,9 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
136152 FROM ${ this . connection . schema . toUpperCase ( ) } .${ tableName . toUpperCase ( ) }
137153 WHERE ${ whereClause }
138154 ` ;
139- const params = Object . values ( primaryKey ) ;
155+ const params = Object . values ( primaryKey ) as SQLParam [ ] ;
140156 const result = await connectionToDb . query ( query , params ) ;
141- return result [ 0 ] ;
157+ return result [ 0 ] as Record < string , unknown > ;
142158 }
143159
144160 public async bulkGetRowsFromTableByPrimaryKeys (
@@ -168,7 +184,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
168184 } )
169185 . join ( ' OR ' ) ;
170186
171- const flatPrimaryKeysValues = primaryKeys . flatMap ( Object . values ) ;
187+ const flatPrimaryKeysValues = primaryKeys . flatMap ( Object . values ) as SQLParam [ ] ;
172188
173189 const query = `
174190 SELECT ${ selectFields }
@@ -177,7 +193,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
177193 ` ;
178194
179195 const results = await connectionToDb . query ( query , flatPrimaryKeysValues ) ;
180- return results ;
196+ return results as Record < string , unknown > [ ] ;
181197 }
182198
183199 public async getRowsFromTable (
@@ -214,7 +230,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
214230 const lastPage = Math . ceil ( rowsCount / perPage ) ;
215231 let rowsRO : FoundRowsDS ;
216232
217- const queryParams : unknown [ ] = [ ] ;
233+ const queryParams : SQLParam [ ] = [ ] ;
218234
219235 if ( autocompleteFields ?. value && autocompleteFields . fields . length > 0 ) {
220236 const validatedAutocompleteFields = autocompleteFields . fields . filter ( ( field ) => availableFields . includes ( field ) ) ;
@@ -229,8 +245,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
229245 const rows = await connectionToDb . query ( autocompleteQuery , autocompleteParams ) ;
230246
231247 rowsRO = {
232- data : rows ,
233- pagination : { } as any ,
248+ data : rows as Record < string , unknown > [ ] ,
249+ pagination : { } as RowsPaginationDS ,
234250 large_dataset : large_dataset ,
235251 } ;
236252 return rowsRO ;
@@ -272,7 +288,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
272288 . map ( ( filterObject ) => {
273289 switch ( filterObject . criteria ) {
274290 case FilterCriteriaEnum . eq :
275- queryParams . push ( filterObject . value ) ;
291+ queryParams . push ( filterObject . value as SQLParam ) ;
276292 return `${ filterObject . field } = ?` ;
277293 case FilterCriteriaEnum . startswith :
278294 queryParams . push ( `${ filterObject . value } %` ) ;
@@ -281,16 +297,16 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
281297 queryParams . push ( `%${ filterObject . value } ` ) ;
282298 return `${ filterObject . field } LIKE ?` ;
283299 case FilterCriteriaEnum . gt :
284- queryParams . push ( filterObject . value ) ;
300+ queryParams . push ( filterObject . value as SQLParam ) ;
285301 return `${ filterObject . field } > ?` ;
286302 case FilterCriteriaEnum . lt :
287- queryParams . push ( filterObject . value ) ;
303+ queryParams . push ( filterObject . value as SQLParam ) ;
288304 return `${ filterObject . field } < ?` ;
289305 case FilterCriteriaEnum . lte :
290- queryParams . push ( filterObject . value ) ;
306+ queryParams . push ( filterObject . value as SQLParam ) ;
291307 return `${ filterObject . field } <= ?` ;
292308 case FilterCriteriaEnum . gte :
293- queryParams . push ( filterObject . value ) ;
309+ queryParams . push ( filterObject . value as SQLParam ) ;
294310 return `${ filterObject . field } >= ?` ;
295311 case FilterCriteriaEnum . contains :
296312 queryParams . push ( `%${ filterObject . value } %` ) ;
@@ -324,13 +340,13 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
324340 const rows = await connectionToDb . query ( rowsQuery , queryParams ) ;
325341
326342 rowsRO = {
327- data : rows ,
343+ data : rows as Record < string , unknown > [ ] ,
328344 pagination : {
329345 total : rowsCount ,
330346 lastPage : lastPage ,
331347 perPage : perPage ,
332348 currentPage : page ,
333- } as any ,
349+ } ,
334350 large_dataset : large_dataset ,
335351 } ;
336352 return rowsRO ;
@@ -372,7 +388,7 @@ ORDER BY
372388 this . connection . schema . toUpperCase ( ) ,
373389 ] ) ;
374390
375- const resultKeys = foreignKeys . map ( ( foreignKey : any ) => {
391+ const resultKeys = ( foreignKeys as unknown as IbmDb2Row [ ] ) . map ( ( foreignKey ) => {
376392 return {
377393 column_name : foreignKey . COLUMN_NAME ,
378394 constraint_name : foreignKey . CONSTRAINT_NAME ,
@@ -402,7 +418,7 @@ ORDER BY
402418 this . connection . schema . toUpperCase ( ) ,
403419 ] ) ;
404420
405- const resultKeys = primaryKeys . map ( ( primaryKey : any ) => {
421+ const resultKeys = ( primaryKeys as unknown as IbmDb2Row [ ] ) . map ( ( primaryKey ) => {
406422 return {
407423 column_name : primaryKey . COLUMN_NAME ,
408424 data_type : primaryKey . DATA_TYPE as string ,
@@ -422,7 +438,7 @@ ORDER BY
422438 ` ;
423439 const tables = await connectionToDb . query ( query , [ this . connection . schema . toUpperCase ( ) ] ) ;
424440
425- return tables . map ( ( table : any ) => {
441+ return ( tables as unknown as IbmDb2Row [ ] ) . map ( ( table ) => {
426442 return {
427443 tableName : table . TABLE_NAME ,
428444 isView : table . TABLE_TYPE === 'V' ,
@@ -449,7 +465,7 @@ ORDER BY
449465 this . connection . schema . toUpperCase ( ) ,
450466 ] ) ;
451467
452- return tableStructure . map ( ( column : any ) => {
468+ return ( tableStructure as unknown as IbmDb2Row [ ] ) . map ( ( column ) => {
453469 return {
454470 allow_null : column . IS_NULLABLE === 'Y' ,
455471 column_default : column . COLUMN_DEFAULT ,
@@ -518,16 +534,16 @@ ORDER BY
518534 SET ${ setClause }
519535 WHERE ${ whereClause }
520536 ` ;
521- const params = [ ...Object . values ( row ) , ...Object . values ( primaryKey ) ] ;
537+ const params = [ ...Object . values ( row ) , ...Object . values ( primaryKey ) ] as SQLParam [ ] ;
522538 await connectionToDb . query ( query , params ) ;
523539
524540 const selectQuery = `
525541 SELECT *
526542 FROM ${ this . connection . schema . toUpperCase ( ) } .${ tableName . toUpperCase ( ) }
527543 WHERE ${ whereClause }
528544 ` ;
529- const result = await connectionToDb . query ( selectQuery , Object . values ( primaryKey ) ) ;
530- return result [ 0 ] ;
545+ const result = await connectionToDb . query ( selectQuery , Object . values ( primaryKey ) as SQLParam [ ] ) ;
546+ return result [ 0 ] as Record < string , unknown > ;
531547 }
532548
533549 public async bulkUpdateRowsInTable (
@@ -588,7 +604,7 @@ ORDER BY
588604 ] ) ;
589605 results . push ( {
590606 referenced_on_column_name : primaryColumn . column_name ,
591- referenced_by : foreignKeys . map ( ( foreignKey : any ) => {
607+ referenced_by : ( foreignKeys as unknown as IbmDb2Row [ ] ) . map ( ( foreignKey ) => {
592608 return {
593609 table_name : foreignKey . REFERENCING_TABLE_NAME ,
594610 column_name : foreignKey . REFERENCING_COLUMN_NAME ,
@@ -610,7 +626,7 @@ ORDER BY
610626 this . connection . schema . toUpperCase ( ) ,
611627 tableName . toUpperCase ( ) ,
612628 ] ) ;
613- return tableData [ 0 ] . TABLE_TYPE === 'V' ;
629+ return ( tableData [ 0 ] as unknown as IbmDb2Row ) . TABLE_TYPE === 'V' ;
614630 }
615631
616632 public async getTableRowsStream (
@@ -620,12 +636,12 @@ ORDER BY
620636 perPage : number ,
621637 searchedFieldValue : string ,
622638 filteringFields : FilteringFieldsDS [ ] ,
623- ) : Promise < Stream & AsyncIterable < any > > {
639+ ) : Promise < Stream & AsyncIterable < Record < string , unknown > > > {
624640 const { large_dataset } = await this . getRowsCount ( tableName , this . connection . schema ) ;
625641 if ( large_dataset ) {
626642 throw new Error ( ERROR_MESSAGES . DATA_IS_TO_LARGE ) ;
627643 }
628- const rowsResult = ( await this . getRowsFromTable (
644+ const rowsResult = await this . getRowsFromTable (
629645 tableName ,
630646 settings ,
631647 page ,
@@ -634,8 +650,8 @@ ORDER BY
634650 filteringFields ,
635651 null ,
636652 null ,
637- ) ) as any ;
638- return rowsResult . data ;
653+ ) ;
654+ return rowsResult . data as unknown as Stream & AsyncIterable < Record < string , unknown > > ;
639655 }
640656
641657 public async getRowsCount (
@@ -666,7 +682,7 @@ ORDER BY
666682 ` ;
667683 const fastCountParams = [ tableName , tableSchema ] ;
668684 const fastCountQueryResult = await connectionToDb . query ( fastCountQuery , fastCountParams ) ;
669- const fastCount = fastCountQueryResult [ 0 ] . CARD ;
685+ const fastCount = ( fastCountQueryResult [ 0 ] as Record < string , number > ) . CARD ;
670686 return fastCount ;
671687 }
672688
@@ -676,9 +692,9 @@ ORDER BY
676692 stream . push ( null ) ;
677693
678694 const parser = stream . pipe ( csv . parse ( { columns : true } ) ) ;
679- const results : any [ ] = [ ] ;
695+ const results : Record < string , unknown > [ ] = [ ] ;
680696 for await ( const record of parser ) {
681- results . push ( record ) ;
697+ results . push ( record as Record < string , unknown > ) ;
682698 }
683699 await Promise . allSettled (
684700 results . map ( async ( row ) => {
@@ -690,10 +706,10 @@ ORDER BY
690706 public async executeRawQuery ( query : string ) : Promise < Array < Record < string , unknown > > > {
691707 const connectionToDb = await this . getConnectionToDatabase ( ) ;
692708 const result = await connectionToDb . query ( query ) ;
693- return result ;
709+ return result as Record < string , unknown > [ ] ;
694710 }
695711
696- private async getConnectionToDatabase ( ) : Promise < Database > {
712+ private getConnectionToDatabase ( ) : Promise < Database > {
697713 if ( this . connection . ssh ) {
698714 return this . createTunneledConnection ( this . connection ) ;
699715 }
@@ -718,9 +734,9 @@ ORDER BY
718734 return databaseConnection ;
719735 }
720736
721- private async createTunneledConnection ( connection : ConnectionParams ) : Promise < Database > {
737+ private createTunneledConnection ( connection : ConnectionParams ) : Promise < Database > {
722738 const connectionCopy = { ...connection } ;
723- return new Promise < Database > ( async ( resolve , reject ) : Promise < Database > => {
739+ return new Promise < Database > ( async ( resolve , reject ) => {
724740 const cachedTnl = LRUStorage . getTunnelCache ( connectionCopy ) ;
725741 if ( cachedTnl ?. database && cachedTnl . server && cachedTnl . client && cachedTnl . database . connected ) {
726742 resolve ( cachedTnl . database ) ;
0 commit comments