1
1
import * as sqlite3 from 'sqlite3' ;
2
- import { workingDirectory } from '../helpers/conf' ;
2
+ import { workingDirectory } from '../helpers/conf' ;
3
+ import { promisify } from "util" ;
4
+ import { createTimeout } from "./utils" ;
3
5
4
6
const dbPath = `${ workingDirectory } /redisinsight.db` ;
5
7
@@ -10,77 +12,114 @@ export class DatabaseScripts {
10
12
*/
11
13
static async updateColumnValueInDBTable ( dbTableParameters : DbTableParameters ) : Promise < void > {
12
14
const db = new sqlite3 . Database ( dbPath ) ;
13
- const query = `UPDATE ${ dbTableParameters . tableName } SET ${ dbTableParameters . columnName } = ? WHERE ${ dbTableParameters . conditionWhereColumnName } = ?` ;
15
+ try {
16
+ const runAsync = ( query : string , p : ( string | number | undefined ) [ ] ) => promisify ( db . run . bind ( db ) ) ; // convert db.run to a Promise-based function
17
+ const query = `UPDATE ${ dbTableParameters . tableName }
18
+ SET ${ dbTableParameters . columnName } = ?
19
+ WHERE ${ dbTableParameters . conditionWhereColumnName } = ?` ;
20
+ await runAsync ( query , [ dbTableParameters . rowValue , dbTableParameters . conditionWhereColumnValue ] ) ;
21
+ } catch ( err ) {
22
+ console . log ( `Error during changing ${ dbTableParameters . columnName } column value: ${ err } ` )
23
+ throw new Error (
24
+ `Error during changing ${ dbTableParameters . columnName } column value: ${ err } ` ,
25
+ ) ;
26
+ } finally {
27
+ console . log ( "Close DB" )
28
+ db . close ( ) ;
29
+ }
14
30
15
- return new Promise < void > ( ( resolve , reject ) => {
16
- db . run ( query , [ dbTableParameters . rowValue , dbTableParameters . conditionWhereColumnValue ] , ( err : { message : string } ) => {
17
- if ( err ) {
18
- reject ( new Error ( `Error during changing ${ dbTableParameters . columnName } column value: ${ err . message } ` ) ) ;
19
- }
20
- else {
21
- db . close ( ) ;
22
- resolve ( ) ;
23
- }
24
- } ) ;
25
- } ) ;
26
31
}
27
32
28
33
/**
29
34
* Get Column value from table in local Database
30
35
* @param dbTableParameters The sqlite database table parameters
31
36
*/
32
37
static async getColumnValueFromTableInDB ( dbTableParameters : DbTableParameters ) : Promise < any > {
33
- const db = new sqlite3 . Database ( dbPath ) ;
34
- const query = `SELECT ${ dbTableParameters . columnName } FROM ${ dbTableParameters . tableName } WHERE ${ dbTableParameters . conditionWhereColumnName } = ?` ;
35
-
36
- return new Promise < void > ( ( resolve , reject ) => {
37
- db . get ( query , [ dbTableParameters . conditionWhereColumnValue ] , ( err : { message : string } , row : any ) => {
38
- if ( err ) {
39
- reject ( new Error ( `Error during getting ${ dbTableParameters . columnName } column value: ${ err . message } ` ) ) ;
40
- }
41
- else {
42
- const columnValue = row [ dbTableParameters . columnName ! ] ;
43
- db . close ( ) ;
44
- resolve ( columnValue ) ;
38
+ // Open the database in read/write mode and fail early if it cannot be opened.
39
+ const db = await new Promise < sqlite3 . Database > ( ( resolve , reject ) => {
40
+ const database = new sqlite3 . Database (
41
+ dbPath ,
42
+ sqlite3 . OPEN_READWRITE ,
43
+ ( err : Error | null ) => {
44
+ if ( err ) {
45
+ reject ( new Error ( `Error opening DB at path ${ dbPath } : ${ err . message } ` ) ) ;
46
+ } else {
47
+ resolve ( database ) ;
48
+ }
45
49
}
46
- } ) ;
50
+ ) ;
47
51
} ) ;
52
+
53
+ const query = `SELECT ${ dbTableParameters . columnName }
54
+ FROM ${ dbTableParameters . tableName }
55
+ WHERE ${ dbTableParameters . conditionWhereColumnName } = ?` ;
56
+ try {
57
+ const getAsync = ( query : string , p : ( string | number | undefined ) [ ] ) => promisify ( db . get . bind ( db ) ) ;
58
+ const row = await Promise . race ( [
59
+ getAsync ( query , [ dbTableParameters . conditionWhereColumnValue ] ) ,
60
+ createTimeout ( 'Query timed out after 10 seconds' , 10000 )
61
+ ] ) ;
62
+ if ( ! row ) {
63
+ throw new Error ( `No row found for column ${ dbTableParameters . columnName } ` ) ;
64
+ }
65
+ return row [ dbTableParameters . columnName ! ] ;
66
+ } catch ( err : any ) {
67
+ throw new Error ( `Error during getting ${ dbTableParameters . columnName } column value: ${ err . message } ` ) ;
68
+ } finally {
69
+ db . close ( ) ;
70
+ }
48
71
}
49
72
50
73
/**
51
74
* Delete all rows from table in local DB
52
75
* @param dbTableParameters The sqlite database table parameters
53
76
*/
54
77
static async deleteRowsFromTableInDB ( dbTableParameters : DbTableParameters ) : Promise < void > {
55
- const db = new sqlite3 . Database ( dbPath ) ;
56
- const query = `DELETE FROM ${ dbTableParameters . tableName } ` ;
57
-
58
- return new Promise < void > ( ( resolve , reject ) => {
59
-
60
- db . run ( query , ( err : { message : string } ) => {
61
- if ( err ) {
62
- reject ( new Error ( `Error during ${ dbTableParameters . tableName } table rows deletion: ${ err . message } ` ) ) ;
78
+ const db = await new Promise < sqlite3 . Database > ( ( resolve , reject ) => {
79
+ const database = new sqlite3 . Database (
80
+ dbPath ,
81
+ sqlite3 . OPEN_READWRITE ,
82
+ ( err : Error | null ) => {
83
+ if ( err ) {
84
+ console . log ( `Error during deleteRowsFromTableInDB: ${ err } ` ) ;
85
+ reject ( new Error ( `Error opening DB at path ${ dbPath } : ${ err . message } ` ) ) ;
86
+ } else {
87
+ resolve ( database ) ;
88
+ }
63
89
}
64
- else {
65
- db . close ( ) ;
66
- resolve ( ) ;
67
- }
68
- } ) ;
90
+ ) ;
69
91
} ) ;
92
+
93
+ const query = `DELETE
94
+ FROM ${ dbTableParameters . tableName } ` ;
95
+
96
+ try {
97
+ const runAsync = promisify ( db . run . bind ( db ) ) ;
98
+ await Promise . race ( [
99
+ runAsync ( query ) ,
100
+ createTimeout ( 'DELETE operation timed out after 10 seconds' , 10000 )
101
+ ] ) ;
102
+ } catch ( err : any ) {
103
+ throw new Error ( `Error during ${ dbTableParameters . tableName } table rows deletion: ${ err . message } ` ) ;
104
+ } finally {
105
+ db . close ( ) ;
106
+ }
70
107
}
108
+
71
109
}
110
+
72
111
/**
73
112
* Add new database parameters
74
113
* @param tableName The name of table in DB
75
- * @param columnName The name of column in table
76
- * @param rowValue Value to update in table
77
- * @param conditionWhereColumnName The name of the column to search
78
- * @param conditionWhereColumnValue The value to match in the column
114
+ * @param columnName The name of column in table
115
+ * @param rowValue Value to update in table
116
+ * @param conditionWhereColumnName The name of the column to search
117
+ * @param conditionWhereColumnValue The value to match in the column
79
118
*/
80
119
export type DbTableParameters = {
81
120
tableName : string ,
82
121
columnName ?: string ,
83
122
rowValue ?: string | number ,
84
123
conditionWhereColumnName ?: string ,
85
124
conditionWhereColumnValue ?: string
86
- } ;
125
+ } ;
0 commit comments