Skip to content

Commit

Permalink
provide support for table upgrade from schema, rm table version support
Browse files Browse the repository at this point in the history
  • Loading branch information
ujjwalguptaofficial committed Jun 13, 2021
1 parent 7616033 commit a7d11f8
Show file tree
Hide file tree
Showing 13 changed files with 103 additions and 95 deletions.
2 changes: 1 addition & 1 deletion src/common/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export type TColumns = {
export interface ITable {
name: string;
columns: TColumns;
version?: number;
upgrade?: boolean;
}

export interface IColumnOption {
Expand Down
1 change: 0 additions & 1 deletion src/worker/enums/index.ts
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
export * from "./table_state";
4 changes: 0 additions & 4 deletions src/worker/enums/table_state.ts

This file was deleted.

4 changes: 1 addition & 3 deletions src/worker/idbutil/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { DbMeta, TableMeta } from "@worker/model";
import { TABLE_STATE } from "@worker/enums";
import { IDB_MODE, QUERY_OPTION, promise } from "@/common";
import { LogHelper } from "@worker/utils";

Expand Down Expand Up @@ -121,9 +120,8 @@ export class IDBUtil {
}
});
}
const createStates = [TABLE_STATE.Create, TABLE_STATE.Delete];
db.tables.forEach(table => {
if (createStates.indexOf(table.state) >= 0) {
if (table.upgrade) {
createObjectStore(table);
}
});
Expand Down
8 changes: 5 additions & 3 deletions src/worker/model/db_meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export class DbMeta {

constructor(db: IDataBase) {
this.name = db.name;
this.version = db.version || 1;
db.tables.push({
name: MetaHelper.tableName,
columns: {
Expand All @@ -19,11 +20,12 @@ export class DbMeta {
value: {
enableSearch: false
}
}
},
upgrade: this.version === 1
})
this.tables = db.tables.map(table => {
return new TableMeta(table, db.version);
return new TableMeta(table);
});
this.version = db.version || 1;

}
}
16 changes: 4 additions & 12 deletions src/worker/model/table_meta.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { ITable } from "@/common";
import { TABLE_STATE } from "@/worker/enums";
import { IColumn } from "@/worker/interfaces";

export class TableMeta {
name: string;
columns: IColumn[];
primaryKey: string;
state: TABLE_STATE;
version: number;
autoIncColumnValue = {};
upgrade: boolean;

constructor(table: ITable, dbVersion: number) {
constructor(table: ITable) {
const columns = [];
for (const columnName in table.columns) {
const column: IColumn = table.columns[columnName] as any;
Expand All @@ -26,14 +24,8 @@ export class TableMeta {
}
this.columns = columns;
this.name = table.name;
this.version = table.version || 1;
if (dbVersion > this.version) {
this.version = dbVersion;
}
this.setState_();
this.upgrade = table.upgrade == null ? true : table.upgrade;
}

private setState_() {
this.state = TABLE_STATE.Create;
}

}
68 changes: 13 additions & 55 deletions src/worker/query_manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { Union } from "./union";
import { Remove } from "@executors/remove";
import { Clear } from "@executors/clear";
import { Transaction } from "@executors/transaction";
import { TABLE_STATE } from "./enums";
import { LogHelper, getError, promiseReject, variableFromPath, userDbSchema, getLength } from "@worker/utils";

export class QueryManager {
Expand Down Expand Up @@ -244,9 +243,11 @@ export class QueryManager {
version: query.version
});
}
return pResult.then(() => {
return this.db;
});
return this.closeDb().then(_ => {
return pResult.then(() => {
return this.db;
});
})
}

initDb(dataBase?: IDataBase) {
Expand All @@ -258,69 +259,26 @@ export class QueryManager {

const dbMeta = dataBase ? new DbMeta(dataBase) : this.db;
this.util = new IDBUtil(dbMeta);
const upgradeDbSchema = (result) => {
return promise((res, rej) => {
MetaHelper.get(MetaHelper.dbSchema, this.util).then((savedDb: DbMeta) => {
let shouldReCreateDb = false;
let dbVersion;
if (savedDb) {
dbVersion = savedDb.version;

savedDb.tables.forEach((savedTable, index) => {
const providedTable = dbMeta.tables[index];

if (providedTable) {
if (savedTable.version < providedTable.version) {
providedTable.state = TABLE_STATE.Delete;
shouldReCreateDb = true;
if (dbVersion < providedTable.version) {
dbVersion = providedTable.version;
}
}
else {
providedTable.state = null;
}
}
});
}

if (shouldReCreateDb) {
dbMeta.version = dbVersion;
this.terminate().then(_ => {
this.util = new IDBUtil(dbMeta);
this.util.initDb().then((isCreated) => {
res(isCreated);
}).catch(rej);
});

return;
}
else if (!result) {
this.db = savedDb;
}
res(result);
});
});
};
return promise<boolean>((res, rej) => {
this.util.initDb().then((isCreated) => {
if (isCreated) {
return isCreated;
}
return upgradeDbSchema(isCreated);
}).then(result => {
if (result) {
this.db = dbMeta;
MetaHelper.set(
MetaHelper.dbSchema, dbMeta,
this.util
).then(() => {
this.db = dbMeta;
res(true);
});
}
else {

res(false);
MetaHelper.get(
MetaHelper.dbSchema,
this.util
).then((value: any) => {
this.db = value;
res(false);
});
}
}).catch(rej);
});
Expand Down
1 change: 0 additions & 1 deletion src/worker/utils/db_schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ export const userDbSchema = (db: DbMeta) => {
db.tables.forEach(table => {
const tableAsObj = {
name: table.name,
version: table.version,
columns: {}
} as ITable;
table.columns.forEach(column => {
Expand Down
3 changes: 2 additions & 1 deletion test/cases/column_option/multi_entry_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ describe('Multi Entry Test', function () {

it('change db with multientry column', function (done) {
var db = MultiEntryTest.getDbSchema();
db.tables[0].version = 2;
db.version = 2;
// db.tables[0].version = 2;
db.tables[0].columns[Object.keys(db.tables[0].columns)[1]].multiEntry = true;
con.initDb(db).then(function (isDbCreated) {
expect(isDbCreated).to.be.an('boolean').equal(true);
Expand Down
2 changes: 1 addition & 1 deletion test/cases/count/count_middleware.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var JsStoreOptions = {
countMiddleware: function (request, context) {
debugger;
// debugger;
// do not delete data
const name = context.database.name;
if (request.name == "count" && request.query['add5']) {
Expand Down
10 changes: 6 additions & 4 deletions test/cases/db_update_datatype.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('Db Update data type Test', function () {
const processIdColumn = schema.tables[0].columns[1];
expect(processIdColumn.name).to.equal("process_id");
expect(processIdColumn.dataType).to.equal("number");
expect(schema.tables[0].version).equal(1)
// expect(schema.tables[0].version).equal(1)
expect(schema.version).equal(1);
done();
}).catch(function (err) {
Expand All @@ -52,7 +52,7 @@ describe('Db Update data type Test', function () {
const processIdColumn = schema.tables[0].columns[1];
expect(processIdColumn.name).to.equal("process_id");
expect(processIdColumn.dataType).to.equal("string");
expect(schema.tables[0].version).equal(2);
expect(schema.tables[0].upgrade).equal(true);
expect(schema.version).equal(2);
done();
}).catch(function (err) {
Expand Down Expand Up @@ -101,11 +101,13 @@ var DbUpdateTest = {
"dataType": "string"
},
},
version: 2
// upgrade:false
},
dataBase = {
name: 'DbUpdateTest',
tables: [people]
tables: [people],
version: 2

};
return dataBase;
},
Expand Down
77 changes: 69 additions & 8 deletions test/cases/db_upgrade.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,34 @@ describe('Db upgrade Test', function () {

});

it('insert data', function () {
var values = DbUpgradeTest.getValues();
return connection.insert({
into: "test",
values: values
}).then(results => {
expect(results).to.equal(3);
})
})

it('getDbSchema', function (done) {
connection.openDb(DbUpgradeTest.getDbSchema().name).then(function (schema) {
const processIdColumn = schema.tables[0].columns[1];
expect(processIdColumn.name).to.equal("process_id");
expect(processIdColumn.dataType).to.equal("number");
expect(schema.tables[0].version).equal(1)
expect(schema.tables[0].columns[1].encrypt).equal(true)
expect(schema.version).equal(1);
expect(schema.tables[1].upgrade).equal(true);
done();
}).catch(function (err) {
done(err);
});
});

it('change db', function (done) {
it('change db to v2', function (done) {
var db = DbUpgradeTest.getDbSchema();
db.version = 2;
db.tables[0].upgrade = false;
connection.initDb(db).then(function (isDbCreated) {
expect(isDbCreated).to.be.an('boolean').equal(true);
done();
Expand All @@ -37,8 +49,8 @@ describe('Db upgrade Test', function () {
});
});

it('open db with old version', function (done) {
connection.openDb("DbUpdateTest").catch(function (err) {
it('open db with old version', function () {
connection.openDb("DbUpgradeTest").catch(function (err) {
console.error(JSON.stringify(err));
const expected = {
"message": "The requested version (1) is less than the existing version (2).",
Expand All @@ -49,13 +61,61 @@ describe('Db upgrade Test', function () {
});
})


it('getDbSchema after updating db', function (done) {
connection.openDb("DbUpdateTest", 2).then(function (schema) {
connection.openDb("DbUpgradeTest", 2).then(function (schema) {
const processIdColumn = schema.tables[0].columns[1];
expect(processIdColumn.name).to.equal("process_id");
expect(processIdColumn.dataType).to.equal("string");
expect(schema.tables[0].version).equal(2)
expect(processIdColumn.dataType).to.equal("number");
// expect(schema.tables[0].version).equal(2)
expect(schema.tables[0].upgrade).equal(false);
expect(schema.tables[1].upgrade).equal(false);
expect(schema.version).equal(2);
expect(schema.tables[0].columns[1].encrypt).equal(true)
done();
}).catch(function (err) {
done(err);
});
});

it('count data to ensure data is not deleted', function () {
return connection.count({
from: "test",
}).then(results => {
expect(results).to.equal(3);
})
})

it('change db to v3', function (done) {
var db = DbUpgradeTest.getDbSchema();
db.version = 3;
db.tables[0].columns.process_id.encrypt = false;
connection.initDb(db).then(function (isDbCreated) {
expect(isDbCreated).to.be.an('boolean').equal(true);
done();
}).catch(function (err) {
done(err);
});
});

it('count data to ensure data is deleted', function () {
return connection.count({
from: "test",
}).then(results => {
expect(results).to.equal(0);
})
})

it('getDbSchema after updating db to v3', function (done) {
connection.openDb("DbUpgradeTest", 3).then(function (schema) {
const processIdColumn = schema.tables[0].columns[1];
expect(processIdColumn.name).to.equal("process_id");
expect(processIdColumn.dataType).to.equal("number");
// expect(schema.tables[0].version).equal(2)
expect(schema.tables[0].upgrade).equal(true);
expect(schema.tables[1].upgrade).equal(false);
expect(schema.version).equal(3);
expect(schema.tables[0].columns[1].encrypt).equal(false)
done();
}).catch(function (err) {
done(err);
Expand All @@ -81,7 +141,8 @@ var DbUpgradeTest = {
"notNull": true
},
"process_id": {
"dataType": "number"
"dataType": "number",
encrypt: true
},
},

Expand Down
2 changes: 1 addition & 1 deletion test/cases/select/join_order.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ describe('select join order test', function () {
})
});

it('drop db', function (done) {
it('drop db student', function (done) {
con.dropDb().then(function () {
done();
}).catch(function (err) {
Expand Down

0 comments on commit a7d11f8

Please sign in to comment.