Skip to content

Commit

Permalink
Fixed bug where sql queries are executed before tables have been crea…
Browse files Browse the repository at this point in the history
…ted.
  • Loading branch information
nero120 committed Mar 31, 2022
1 parent aa1a9dd commit 52d6219
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 83 deletions.
3 changes: 0 additions & 3 deletions src/modules/android/android-app/android-app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,6 @@ export class AndroidAppComponent extends AppMainComponent implements OnInit {
}

handleDeviceReady(success: () => any, failure: (err: any) => any): ng.IPromise<any> {
// Prime cache for faster startup
this.$q.all([this.bookmarkHelperSvc.getCachedBookmarks(), this.settingsSvc.all()]).catch(() => {});

// Load i18n strings
return (
this.platformSvc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { NativeStorageError, Table, TraceLogColumn } from './android-store.enum'
@Injectable('StoreService')
export class AndroidStoreService extends StoreService {
appRowId = 1;
db: any;
dbName = 'xbs.db';
idCol = 'id';
nativeStorageKeys: string[] = [
Expand All @@ -34,45 +33,55 @@ export class AndroidStoreService extends StoreService {

static $inject = ['$q'];

private _db: any;
private get db() {
if (!this._db) {
try {
this._db = window.sqlitePlugin.openDatabase({
androidDatabaseProvider: 'system',
location: 'default',
name: this.dbName
});
} catch (err) {
throw new FailedLocalStorageError(err.message);
}
}
return this._db;
}

protected addTraceLog(log: TraceLogItem): ng.IPromise<void> {
return this.$q<void>((resolve, reject) => {
this.openDatabase().then((db) => {
db.executeSql(
`INSERT INTO ${Table.TraceLog} (
${TraceLogColumn.Timestamp},
${TraceLogColumn.Level},
${TraceLogColumn.Message}
) VALUES (?, ?, ?)`,
[log.timestamp, log.level, log.message],
() => resolve(),
reject
);
});
this.db.executeSql(
`INSERT INTO ${Table.TraceLog} (
${TraceLogColumn.Timestamp},
${TraceLogColumn.Level},
${TraceLogColumn.Message}
) VALUES (?, ?, ?)`,
[log.timestamp, log.level, log.message],
() => resolve(),
reject
);
}).catch((err) => this.handleSqlError(err));
}

protected clear(): ng.IPromise<void> {
return this.$q
.all([
this.$q((resolve, reject) => window.NativeStorage.clear(resolve, reject)),
this.openDatabase()
.then((db) => this.createTables(db))
.catch((err) => this.handleSqlError(err))
this.createTables().catch((err) => this.handleSqlError(err))
])
.then(() => {});
}

protected clearTraceLog(): ng.IPromise<void> {
return this.$q<void>((resolve, reject) => {
this.openDatabase().then((db) => {
db.executeSql(`DELETE FROM ${Table.TraceLog}`, [], () => resolve(), reject);
});
this.db.executeSql(`DELETE FROM ${Table.TraceLog}`, [], () => resolve(), reject);
}).catch((err) => this.handleSqlError(err));
}

protected createTables(db: any): ng.IPromise<any> {
protected createTables(): ng.IPromise<any> {
return this.$q((resolve, reject) => {
db.transaction(
this.db.transaction(
(tx: any) => {
tx.executeSql(`DROP TABLE IF EXISTS ${Table.App}`);
tx.executeSql(`CREATE TABLE ${Table.App} (
Expand Down Expand Up @@ -125,26 +134,24 @@ export class AndroidStoreService extends StoreService {

protected getAllTraceLogs(): ng.IPromise<TraceLogItem[]> {
return this.$q<TraceLogItem[]>((resolve, reject) => {
this.openDatabase().then((db) => {
db.executeSql(
`SELECT * FROM ${Table.TraceLog} ORDER BY ${TraceLogColumn.Timestamp}`,
[],
(result: any) => {
// Convert results to array of TraceLogItem
const logItems: TraceLogItem[] = [];
for (let x = 0; x < result.rows.length; x += 1) {
const logItem: TraceLogItem = {
level: result.rows.item(x).level,
message: result.rows.item(x).message,
timestamp: result.rows.item(x).timestamp
};
logItems.push(logItem);
}
resolve(logItems);
},
reject
);
});
this.db.executeSql(
`SELECT * FROM ${Table.TraceLog} ORDER BY ${TraceLogColumn.Timestamp}`,
[],
(result: any) => {
// Convert results to array of TraceLogItem
const logItems: TraceLogItem[] = [];
for (let x = 0; x < result.rows.length; x += 1) {
const logItem: TraceLogItem = {
level: result.rows.item(x).level,
message: result.rows.item(x).message,
timestamp: result.rows.item(x).timestamp
};
logItems.push(logItem);
}
resolve(logItems);
},
reject
);
}).catch((err) => this.handleSqlError(err));
}

Expand All @@ -165,26 +172,27 @@ export class AndroidStoreService extends StoreService {
}

protected getFromSql<T = StoreContent>(keys: string[] = []): ng.IPromise<T[]> {
if (keys.length === 0) {
return this.$q.resolve([]);
}
const values = new Array(keys.length);
return this.$q<T[]>((resolve, reject) => {
// Get non-trace log values
const keysWithoutTraceLog = keys.filter((key) => key !== StoreKey.TraceLog);
if (keysWithoutTraceLog.length === 0) {
return resolve([]);
}
this.openDatabase().then((db) => {
db.executeSql(
`SELECT ${keysWithoutTraceLog.join(', ')} FROM ${Table.App} WHERE ${this.idCol} = ?`,
[this.appRowId],
(result: any) => {
keysWithoutTraceLog.forEach((key) => {
values[keys.indexOf(key)] = result.rows.item(0)[key as string];
});
resolve();
},
reject
);
});
this.db.executeSql(
`SELECT ${keysWithoutTraceLog.join(', ')} FROM ${Table.App} WHERE ${this.idCol} = ?`,
[this.appRowId],
(result: any) => {
keysWithoutTraceLog.forEach((key) => {
values[keys.indexOf(key)] = result.rows.item(0)[key as string];
});
resolve();
},
reject
);
})
.then(() => {
// Get trace log if requested
Expand All @@ -209,24 +217,6 @@ export class AndroidStoreService extends StoreService {
});
}

protected openDatabase(): ng.IPromise<any> {
if (!angular.isUndefined(this.db ?? undefined)) {
return this.$q.resolve(this.db);
}
return this.$q((resolve, reject) => {
try {
this.db = window.sqlitePlugin.openDatabase({
androidDatabaseProvider: 'system',
location: 'default',
name: this.dbName
});
resolve(this.db);
} catch (err) {
reject(new FailedLocalStorageError(err.message));
}
});
}

protected removeFromStore(keys: string[] = []): ng.IPromise<void> {
// Separate keys
const keysForNativeStorage = keys.filter((key) => this.nativeStorageKeys.includes(key));
Expand Down Expand Up @@ -261,14 +251,12 @@ export class AndroidStoreService extends StoreService {

// For anything else update existing app table row
return this.$q<void>((resolve, reject) => {
this.openDatabase().then((db) => {
db.executeSql(
`UPDATE ${Table.App} SET ${key} = ? WHERE ${this.idCol} = ?`,
[value, this.appRowId],
() => resolve(),
reject
);
});
this.db.executeSql(
`UPDATE ${Table.App} SET ${key} = ? WHERE ${this.idCol} = ?`,
[value, this.appRowId],
() => resolve(),
reject
);
}).catch((err) => this.handleSqlError(err));
}
}

0 comments on commit 52d6219

Please sign in to comment.