MOBILE-4270 db: Tweaks on sqlite
This commit is contained in:
		
							parent
							
								
									c22424c93e
								
							
						
					
					
						commit
						51bd21163a
					
				| @ -174,7 +174,8 @@ export class SQLiteDB { | ||||
|             sql = equal ? '= ?' : '<> ?'; | ||||
|             params = Array.isArray(items) ? items : [items]; | ||||
|         } else { | ||||
|             sql = (equal ? '' : 'NOT ') + 'IN (' + ',?'.repeat(items.length).substring(1) + ')'; | ||||
|             const questionMarks = ',?'.repeat(items.length).substring(1); | ||||
|             sql = (equal ? '' : 'NOT ') + `IN (${questionMarks})`; | ||||
|             params = items; | ||||
|         } | ||||
| 
 | ||||
| @ -237,7 +238,7 @@ export class SQLiteDB { | ||||
|         tableCheck?: string, | ||||
|     ): string { | ||||
|         const columnsSql: string[] = []; | ||||
|         let sql = `CREATE TABLE IF NOT EXISTS ${name} (`; | ||||
|         let tableStructureSQL = ''; | ||||
| 
 | ||||
|         // First define all the columns.
 | ||||
|         for (const index in columns) { | ||||
| @ -245,7 +246,7 @@ export class SQLiteDB { | ||||
|             let columnSql: string = column.name || ''; | ||||
| 
 | ||||
|             if (column.type) { | ||||
|                 columnSql += ' ' + column.type; | ||||
|                 columnSql += ` ${column.type}`; | ||||
|             } | ||||
| 
 | ||||
|             if (column.primaryKey) { | ||||
| @ -273,25 +274,25 @@ export class SQLiteDB { | ||||
| 
 | ||||
|             columnsSql.push(columnSql); | ||||
|         } | ||||
|         sql += columnsSql.join(', '); | ||||
|         tableStructureSQL += columnsSql.join(', '); | ||||
| 
 | ||||
|         // Now add the table constraints.
 | ||||
| 
 | ||||
|         if (primaryKeys && primaryKeys.length) { | ||||
|             sql += `, PRIMARY KEY (${primaryKeys.join(', ')})`; | ||||
|             tableStructureSQL += `, PRIMARY KEY (${primaryKeys.join(', ')})`; | ||||
|         } | ||||
| 
 | ||||
|         if (uniqueKeys && uniqueKeys.length) { | ||||
|             for (const index in uniqueKeys) { | ||||
|                 const setOfKeys = uniqueKeys[index]; | ||||
|                 if (setOfKeys && setOfKeys.length) { | ||||
|                     sql += `, UNIQUE (${setOfKeys.join(', ')})`; | ||||
|                     tableStructureSQL += `, UNIQUE (${setOfKeys.join(', ')})`; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (tableCheck) { | ||||
|             sql += `, CHECK (${tableCheck})`; | ||||
|             tableStructureSQL += `, CHECK (${tableCheck})`; | ||||
|         } | ||||
| 
 | ||||
|         for (const index in foreignKeys) { | ||||
| @ -301,18 +302,18 @@ export class SQLiteDB { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             sql += `, FOREIGN KEY (${foreignKey.columns.join(', ')}) REFERENCES ${foreignKey.table} `; | ||||
|             tableStructureSQL += `, FOREIGN KEY (${foreignKey.columns.join(', ')}) REFERENCES ${foreignKey.table} `; | ||||
| 
 | ||||
|             if (foreignKey.foreignColumns && foreignKey.foreignColumns.length) { | ||||
|                 sql += `(${foreignKey.foreignColumns.join(', ')})`; | ||||
|                 tableStructureSQL += `(${foreignKey.foreignColumns.join(', ')})`; | ||||
|             } | ||||
| 
 | ||||
|             if (foreignKey.actions) { | ||||
|                 sql += ` ${foreignKey.actions}`; | ||||
|                 tableStructureSQL += ` ${foreignKey.actions}`; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return sql + ')'; | ||||
|         return `CREATE TABLE IF NOT EXISTS ${name} (${tableStructureSQL})`; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -355,7 +356,7 @@ export class SQLiteDB { | ||||
|         countItem: string = 'COUNT(\'x\')', | ||||
|     ): Promise<number> { | ||||
|         if (select) { | ||||
|             select = 'WHERE ' + select; | ||||
|             select = `WHERE ${select}`; | ||||
|         } | ||||
| 
 | ||||
|         return this.countRecordsSql(`SELECT ${countItem} FROM ${table} ${select}`, params); | ||||
| @ -470,7 +471,7 @@ export class SQLiteDB { | ||||
|      */ | ||||
|     async deleteRecordsSelect(table: string, select: string = '', params?: SQLiteDBRecordValue[]): Promise<number> { | ||||
|         if (select) { | ||||
|             select = 'WHERE ' + select; | ||||
|             select = `WHERE ${select}`; | ||||
|         } | ||||
| 
 | ||||
|         const result = await this.execute(`DELETE FROM ${table} ${select}`, params); | ||||
| @ -529,22 +530,8 @@ export class SQLiteDB { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // Remove undefined entries and convert null to "NULL".
 | ||||
|         for (const name in data) { | ||||
|             if (data[name] === undefined) { | ||||
|                 delete data[name]; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Format the data to where params. | ||||
|      * | ||||
|      * @param data Object data. | ||||
|      * @returns List of params. | ||||
|      */ | ||||
|     protected formatDataToSQLParams(data: SQLiteDBRecordValues): SQLiteDBRecordValue[] { | ||||
|         return Object.values(data).map((value) => value as SQLiteDBRecordValue); | ||||
|         // Remove undefined entries.
 | ||||
|         Object.keys(data).forEach(key => data[key] === undefined && delete data[key]); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -587,7 +574,7 @@ export class SQLiteDB { | ||||
|         params?: SQLiteDBRecordValue[], | ||||
|     ): Promise<SQLiteDBRecordValue> { | ||||
|         if (select) { | ||||
|             select = 'WHERE ' + select; | ||||
|             select = `WHERE ${select}`; | ||||
|         } | ||||
| 
 | ||||
|         return this.getFieldSql(`SELECT ${field} FROM ${table} ${select}`, params); | ||||
| @ -648,7 +635,7 @@ export class SQLiteDB { | ||||
|         fields: string = '*', | ||||
|     ): Promise<T> { | ||||
|         if (select) { | ||||
|             select = ' WHERE ' + select; | ||||
|             select = ` WHERE ${select}`; | ||||
|         } | ||||
| 
 | ||||
|         return this.getRecordSql<T>(`SELECT ${fields} FROM ${table} ${select}`, params); | ||||
| @ -746,10 +733,10 @@ export class SQLiteDB { | ||||
|         limitNum: number = 0, | ||||
|     ): Promise<T[]> { | ||||
|         if (select) { | ||||
|             select = ' WHERE ' + select; | ||||
|             select = ` WHERE ${select}`; | ||||
|         } | ||||
|         if (sort) { | ||||
|             sort = ' ORDER BY ' + sort; | ||||
|             sort = ` ORDER BY ${sort}`; | ||||
|         } | ||||
| 
 | ||||
|         const sql = `SELECT ${fields} FROM ${table} ${select} ${sort}`; | ||||
| @ -778,7 +765,7 @@ export class SQLiteDB { | ||||
|             if (limits[1] < 1) { | ||||
|                 limits[1] = Number.MAX_VALUE; | ||||
|             } | ||||
|             sql += ' LIMIT ' + limits[0] + ', ' + limits[1]; | ||||
|             sql += ` LIMIT ${limits[0]}, ${limits[1]}`; | ||||
|         } | ||||
| 
 | ||||
|         const result = await this.execute(sql, params); | ||||
| @ -807,7 +794,7 @@ export class SQLiteDB { | ||||
| 
 | ||||
|         return { | ||||
|             sql: `INSERT OR REPLACE INTO ${table} (${fields}) VALUES (${questionMarks})`, | ||||
|             params: this.formatDataToSQLParams(data), | ||||
|             params: Object.values(data), | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
| @ -897,7 +884,7 @@ export class SQLiteDB { | ||||
|     ): Promise<void> { | ||||
|         try { | ||||
|             await this.tableExists(oldTable); | ||||
|         } catch (error) { | ||||
|         } catch { | ||||
|             // Old table does not exist, ignore.
 | ||||
|             return; | ||||
|         } | ||||
| @ -919,7 +906,7 @@ export class SQLiteDB { | ||||
| 
 | ||||
|         try { | ||||
|             await this.dropTable(oldTable); | ||||
|         } catch (error) { | ||||
|         } catch { | ||||
|             // Error deleting old table, ignore.
 | ||||
|         } | ||||
|     } | ||||
| @ -1066,7 +1053,7 @@ export class SQLiteDB { | ||||
|         } | ||||
| 
 | ||||
|         // Create the list of params using the "data" object and the params for the where clause.
 | ||||
|         let params = this.formatDataToSQLParams(data); | ||||
|         let params = Object.values(data); | ||||
|         if (where && whereParams) { | ||||
|             params = params.concat(whereParams); | ||||
|         } | ||||
| @ -1090,19 +1077,19 @@ export class SQLiteDB { | ||||
|             }; | ||||
|         } | ||||
| 
 | ||||
|         const where: string[] = []; | ||||
|         const params: SQLiteDBRecordValue[] = []; | ||||
| 
 | ||||
|         for (const key in conditions) { | ||||
|             const value = conditions[key]; | ||||
|         const where = Object.keys(conditions).map((field) => { | ||||
|             const value = conditions[field]; | ||||
| 
 | ||||
|             if (value === undefined || value === null) { | ||||
|                 where.push(key + ' IS NULL'); | ||||
|             } else { | ||||
|                 where.push(key + ' = ?'); | ||||
|                 params.push(value); | ||||
|                 return `${field} IS NULL`; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|             params.push(value); | ||||
| 
 | ||||
|             return `${field} = ?`; | ||||
|         }); | ||||
| 
 | ||||
|         return { | ||||
|             sql: where.join(' AND '), | ||||
| @ -1130,7 +1117,7 @@ export class SQLiteDB { | ||||
| 
 | ||||
|         values.forEach((value) => { | ||||
|             if (value === undefined || value === null) { | ||||
|                 sql = field + ' IS NULL'; | ||||
|                 sql = `${field} IS NULL`; | ||||
|             } else { | ||||
|                 params.push(value); | ||||
|             } | ||||
| @ -1138,14 +1125,14 @@ export class SQLiteDB { | ||||
| 
 | ||||
|         if (params && params.length) { | ||||
|             if (sql !== '') { | ||||
|                 sql = sql + ' OR '; | ||||
|                 sql += ' OR '; | ||||
|             } | ||||
| 
 | ||||
|             if (params.length == 1) { | ||||
|                 sql = sql + field + ' = ?'; | ||||
|                 sql += `${field} = ?`; | ||||
|             } else { | ||||
|                 const questionMarks = ',?'.repeat(params.length).substring(1); | ||||
|                 sql = sql + field + ' IN (' + questionMarks + ')'; | ||||
|                 sql += ` ${field} IN (${questionMarks})`; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -1232,7 +1219,7 @@ export class SQLiteDB { | ||||
| } | ||||
| 
 | ||||
| export type SQLiteDBRecordValues = { | ||||
|     [key: string]: SQLiteDBRecordValue | undefined | null; | ||||
|     [key: string]: SQLiteDBRecordValue; | ||||
| }; | ||||
| 
 | ||||
| export type SQLiteDBQueryParams = { | ||||
| @ -1240,4 +1227,4 @@ export type SQLiteDBQueryParams = { | ||||
|     params: SQLiteDBRecordValue[]; | ||||
| }; | ||||
| 
 | ||||
| export type SQLiteDBRecordValue = number | string; | ||||
| export type SQLiteDBRecordValue = number | string  | undefined | null; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user