import { Injectable } from '@angular/core'; import { Platform } from 'ionic-angular'; import { AppConf } from '../app-conf/app-conf'; import { SQLite } from '@ionic-native/sqlite'; import { DB_CONFIG } from '../../app/app.constant'; import { SQLitePorter } from '@ionic-native/sqlite-porter'; const win: any = window; @Injectable() export class DbSvc { private dbConfig = new DB_CONFIG(); constructor(private sqlite: SQLite, public appConf: AppConf, public platform: Platform, public sqlitePorter: SQLitePorter) { } private dbInstance = null; private SQLError = { 'UNKNOWN_ERR': 0, 'DATABASE_ERR': 1, 'VERSION_ERR': 2, 'TOO_LARGE_ERR': 3, 'QUOTA_ERR': 4, 'SYNTAX_ERR': 5, 'CONSTRAINT_ERR': 6, 'TIMEOUT_ERR': 7 }; public errorHandler(res) { let msg = ""; switch (res.code) { case this.SQLError.DATABASE_ERR: msg = "Database Error"; break; case this.SQLError.VERSION_ERR: msg = "Version Error"; break; case this.SQLError.TOO_LARGE_ERR: msg = "Too Large Error"; break; case this.SQLError.QUOTA_ERR: msg = "Quota Error"; break; case this.SQLError.SYNTAX_ERR: msg = "Syntax Error"; break; case this.SQLError.CONSTRAINT_ERR: msg = "Constraint Error"; break; default: msg = "Unknown Error"; break; } return msg; } init() { if (this.platform.is('cordova')) { this.platform.ready().then(() => { this.dbInstance = this.sqlite.create({ name: this.appConf.getDBName() + ".db", location: 'default' }); }); } else { this.dbInstance = win.openDatabase(this.appConf.getDBName(), "1.0", "database", 1); //default db name :- DriverAPP } let promArray = []; this.dbConfig.tables.forEach(tablesql => { let promise = new Promise((resolve, reject) => { this.query(tablesql).then((res) => { resolve(res); }, (err) => { reject(err); }); }); promArray.push(promise); }); return Promise.all(promArray); }; public fetchAll(result) { let output = []; for (let i = 0; i < result.rows.length; i++) { output.push(result.rows.item(i)); } return output; }; public fetch(result) { return result.rows.item(0); }; public query(query, bindings?) { if (this.dbInstance == null) { this.init(); } bindings = typeof bindings !== 'undefined' ? bindings : []; let promise = new Promise((resolve, reject) => { this.dbInstance.transaction((transaction) => { transaction.executeSql(query, bindings, (transaction, result) => { resolve(result); }, (transaction, error) => { error.Error = this.errorHandler(error); reject(error); }); }); }); return promise; }; public isDataExist(tableName, value) { let promise = new Promise((resolve, reject) => { if (value) { let selectsql = "SELECT " + tableName + "_uu FROM " + tableName + " WHERE " + tableName + "_uu = ?"; this.query(selectsql, [value]).then((rs) => { if (rs['rows'].length > 0) resolve(true); else resolve(false); }); } else { resolve(false); } }); return promise; }; public removeRecordByTableID(tableName, value) { if (value) { let selectsql = "Delete * from " + tableName + " WHERE " + tableName + "_uu = ?"; return this.query(selectsql, [value]); } }; public addTableRow(tableName, row, isServerPull) { let initUpdateTime = Date.now(); let params = [], paramStr = [], paramKeys = []; let keys = Object.keys(row); keys.forEach(key => { if (key === "$$hashKey" || key.toLowerCase() === "app_updated" || key.toLowerCase() === "app_synced") { } else { params.push(row[key]); paramStr.push("?"); paramKeys.push(key); } }); let sql = "Insert into " + tableName + " (" + paramKeys.join(',') + ") Values (" + paramStr.join(',') + ")"; let exec = this.query(sql, params); if (arguments.length === 3 && isServerPull === true) { sql = "Update " + tableName + " SET app_updated = " + initUpdateTime + ", app_synced = " + initUpdateTime + " where " + tableName.toLowerCase() + "_uu = ?"; var UU = row[tableName.toLowerCase() + "_uu"]; this.query(sql, [UU]); } else { // Generic Logic for set Record Updated Time sql = "Update " + tableName + " Set app_updated = " + initUpdateTime + " where " + tableName.toLowerCase() + "_uu = ?"; let UU = row[tableName.toLowerCase() + "_uu"]; this.query(sql, [UU]); } return exec; }; public addTableRowByColumn(tableName, columns, row) { let initUpdateTime = Date.now(); let params = [], paramStr = [], paramKeys = []; let keys = Object.keys(row); keys.forEach(key => { if (key === "$$hashKey" || columns.indexOf(key) < 0 || key.toLowerCase() === "app_updated" || key.toLowerCase() === "app_synced") { // Skip to add } else { params.push(row[key]); paramStr.push("?"); paramKeys.push(key); } }); let sql = "Insert into " + tableName + " (" + paramKeys.join(',') + ") Values (" + paramStr.join(',') + ")"; let exec = this.query(sql, params); // Generic Logic for set Record Updated Time sql = "Update " + tableName + " Set app_updated = " + initUpdateTime + " where " + tableName.toLowerCase() + "_uu = ?"; let UU = row[tableName.toLowerCase() + "_uu"]; this.query(sql, [UU]); return exec; }; public updateTableRow(tableName, row) { let initUpdateTime = Date.now(); let paramStr = []; let idColumn = tableName + "_uu"; let param = []; let keys = Object.keys(row); keys.forEach(key => { if (key === "$$hashKey" || key.toLowerCase() === "app_updated" || key.toLowerCase() === "app_synced") { } else { paramStr.push(key + "= ? "); param.push(row[key]); } }); param.push(row[idColumn]); let sql = "Update " + tableName + " set " + paramStr.join(',') + " WHERE " + idColumn + " = ? "; let exec = this.query(sql, param); // Generic Logic for set Record Updated Time sql = "Update " + tableName + " Set app_updated = " + initUpdateTime + " where " + tableName.toLowerCase() + "_uu = ?"; let UU = row[tableName.toLowerCase() + "_uu"]; this.query(sql, [UU]); return exec; }; public getCount(tableName, whereClause) { let sql = "SELECT Count(" + tableName + "_uu) FROM " + tableName; if (whereClause !== 'undefined' || whereClause != null) sql = sql + " WHERE " + whereClause; return this.query(sql, 'undefined'); } //need to test working or not exportDBToFile() { let promise = new Promise((resolve, reject) => { if (!this.dbInstance) this.init(); var successFn = function (sql, count) { resolve(sql); alert("Exported SQL contains " + count + " statements"); }; if (this.platform.is('android')) { this.sqlitePorter.exportDbToSql(this.dbInstance).then(successFn => { resolve(successFn); //TO DO task: return what? and what send as promises }).catch(err => { reject(err); }) // window.cordova.plugins.sqlitePorter.exportDbToSql(this.dbInstance, { // successFn: successFn // }); } }); return promise; } }