ionic-database-builder
Version:
Extended library from database-builder to assist in creating and maintaining SQL commands. Allowing integrate execute commands with SQLite ('@ionic-native/sqlite'), Web Sql, etc. Through the interface injection 'DatabaseCreatorContract' returning an imple
91 lines • 14.4 kB
JavaScript
import * as momentNs from 'moment';
const moment = momentNs;
import { Observable } from 'rxjs';
export class DatabaseMigrationBase {
version(database, version) {
return new Observable((observer) => {
this.checkTableVersion(database)
.subscribe(_ => {
this.checkVersion(database, version)
.subscribe((result) => {
this.migration(database, result)
.subscribe(r => {
observer.next(r);
observer.complete();
}, err => this.error(err, observer));
}, err => this.error(err, observer));
}, err => this.error(err, observer));
});
}
error(error, observer) {
// tslint:disable-next-line:no-console
console.error(error);
observer.error(error);
observer.complete();
}
checkTableVersion(database) {
return new Observable((observer) => {
// return new Promise<any>((resolve, reject) => {
const scriptTableVersion = `CREATE TABLE IF NOT EXISTS MigrationVersion(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
, data INTEGER
, version TEXT
);`;
database.executeSql(scriptTableVersion, {})
.then(result => {
observer.next(result);
observer.complete();
}, err => this.error(err, observer));
});
}
checkVersion(database, newVersion) {
return new Observable((observer) => {
this.getVersion(database).subscribe((oldVersion) => {
if (oldVersion > 0) {
if (newVersion > oldVersion) {
// tslint:disable-next-line:no-console
console.info(`Version old: ${oldVersion}`);
database.executeSql(`UPDATE MigrationVersion
SET (data, version) = (?, ?);`, [moment().unix(), newVersion])
.then()
.catch(err => this.error(err, observer));
}
}
else {
database.executeSql(`INSERT INTO MigrationVersion (data, version) VALUES (?, ?)`, [moment().unix(), newVersion])
.then()
.catch(err => this.error(err, observer));
}
observer.next({
oldVersion,
newVersion
});
observer.complete();
});
});
}
getVersion(database) {
return new Observable((observer) => {
database.executeSql(`SELECT * FROM MigrationVersion`, {})
.then((result) => {
let version = 0;
if (result.rows.length > 0) {
version = Number.parseFloat(result.rows.item(0).version);
}
observer.next(version);
observer.complete();
})
.catch(err => this.error(err, observer));
});
}
migration(database, control) {
return new Observable((observer) => {
this.migrationExecute(database, control)
.subscribe(result => {
observer.next(result);
observer.complete();
}, err => this.error(err, observer));
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtbWlncmF0aW9uLWJhc2UuanMiLCJzb3VyY2VSb290IjoiQzovVHJhYmFsaG9GZXJuYW5kby9Qcm9qZXRvcy9pb25pYy1kYXRhYmFzZS1idWlsZGVyL3Byb2plY3RzL2lvbmljLWRhdGFiYXNlLWJ1aWxkZXIvc3JjLyIsInNvdXJjZXMiOlsibGliL3V0aWxzL2RhdGFiYXNlLW1pZ3JhdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUV4QixPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sTUFBTSxDQUFDO0FBRTVDLE1BQU0sT0FBZ0IscUJBQXFCO0lBRWhDLE9BQU8sQ0FBQyxRQUF3QixFQUFFLE9BQWU7UUFDcEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQTJCLEVBQUUsRUFBRTtZQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDO2lCQUMzQixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO3FCQUMvQixTQUFTLENBQUMsQ0FBQyxNQUFtRCxFQUFFLEVBQUU7b0JBQy9ELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQzt5QkFDM0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFB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Q0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDNUQ7Z0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFNBQVMsQ0FBQyxRQUF3QixFQUFFLE9BQW1EO1FBQzNGLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUEyQixFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7aUJBQ25DLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBtb21lbnROcyBmcm9tICdtb21lbnQnO1xyXG5jb25zdCBtb21lbnQgPSBtb21lbnROcztcclxuaW1wb3J0IHsgRGF0YWJhc2VPYmplY3QgfSBmcm9tICdkYXRhYmFzZS1idWlsZGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhYmFzZU1pZ3JhdGlvbkJhc2Uge1xyXG5cclxuICAgIHB1YmxpYyB2ZXJzaW9uKGRhdGFiYXNlOiBEYXRhYmFzZU9iamVjdCwgdmVyc2lvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8Ym9vbGVhbj4pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RhYmxlVmVyc2lvbihkYXRhYmFzZSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZlcnNpb24oZGF0YWJhc2UsIHZlcnNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogeyBvbGRWZXJzaW9uOiBudW1iZXI7IG5ld1ZlcnNpb246IG51bWJlcjsgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taWdyYXRpb24oZGF0YWJhc2UsIHJlc3VsdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGVyciA9PiB0aGlzLmVycm9yKGVyciwgb2JzZXJ2ZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBlcnJvcihlcnJvcjogc3RyaW5nLCBvYnNlcnZlcjogT2JzZXJ2ZXI8YW55Pikge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IG1pZ3JhdGlvbkV4ZWN1dGUoXHJcbiAgICAgICAgZGF0YWJhc2U6IERhdGFiYXNlT2JqZWN0LCBjb250cm9sOiB7IG9sZFZlcnNpb246IG51bWJlciwgbmV3VmVyc2lvbjogbnVtYmVyIH1cclxuICAgICk6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1RhYmxlVmVyc2lvbihkYXRhYmFzZTogRGF0YWJhc2VPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPGFueT4pID0+IHtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JpcHRUYWJsZVZlcnNpb24gPSBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgTWlncmF0aW9uVmVyc2lvbihcclxuICAgICAgICAgICAgICAgICAgICBpZCBJTlRFR0VSIE5PVCBOVUxMIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlRcclxuICAgICAgICAgICAgICAgICAgICAsIGRhdGEgSU5URUdFUlxyXG4gICAgICAgICAgICAgICAgICAgICwgdmVyc2lvbiBURVhUXHJcbiAgICAgICAgICAgICAgICAgICAgKTtgO1xyXG4gICAgICAgICAgICBkYXRhYmFzZS5leGVjdXRlU3FsKHNjcmlwdFRhYmxlVmVyc2lvbiwge30pXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tWZXJzaW9uKGRhdGFiYXNlOiBEYXRhYmFzZU9iamVjdCwgbmV3VmVyc2lvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTx7IG9sZFZlcnNpb246IG51bWJlciwgbmV3VmVyc2lvbjogbnVtYmVyIH0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VmVyc2lvbihkYXRhYmFzZSkuc3Vic2NyaWJlKChvbGRWZXJzaW9uOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvbGRWZXJzaW9uID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWZXJzaW9uID4gb2xkVmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYFZlcnNpb24gb2xkOiAke29sZFZlcnNpb259YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlLmV4ZWN1dGVTcWwoYFVQREFURSBNaWdyYXRpb25WZXJzaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUIChkYXRhLCB2ZXJzaW9uKSA9ICg/LCA/KTtgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vbWVudCgpLnVuaXgoKSwgbmV3VmVyc2lvbl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UuZXhlY3V0ZVNxbChgSU5TRVJUIElOVE8gTWlncmF0aW9uVmVyc2lvbiAoZGF0YSwgdmVyc2lvbikgVkFMVUVTICg/LCA/KWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb21lbnQoKS51bml4KCksIG5ld1ZlcnNpb25dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5lcnJvcihlcnIsIG9ic2VydmVyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICBvbGRWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZlcnNpb25cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWZXJzaW9uKGRhdGFiYXNlOiBEYXRhYmFzZU9iamVjdCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8bnVtYmVyPikgPT4ge1xyXG4gICAgICAgICAgICBkYXRhYmFzZS5leGVjdXRlU3FsKGBTRUxFQ1QgKiBGUk9NIE1pZ3JhdGlvblZlcnNpb25gLCB7fSlcclxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IE51bWJlci5wYXJzZUZsb2F0KHJlc3VsdC5yb3dzLml0ZW0oMCkudmVyc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmVyc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWlncmF0aW9uKGRhdGFiYXNlOiBEYXRhYmFzZU9iamVjdCwgY29udHJvbDogeyBvbGRWZXJzaW9uOiBudW1iZXIsIG5ld1ZlcnNpb246IG51bWJlciB9KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8Ym9vbGVhbj4pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5taWdyYXRpb25FeGVjdXRlKGRhdGFiYXNlLCBjb250cm9sKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuZXJyb3IoZXJyLCBvYnNlcnZlcikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==