aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/dictionary.js41
-rw-r--r--ext/bg/js/translator.js5
2 files changed, 36 insertions, 10 deletions
diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js
index 20a94f8f..936dc3c1 100644
--- a/ext/bg/js/dictionary.js
+++ b/ext/bg/js/dictionary.js
@@ -20,26 +20,53 @@
class Dictionary {
constructor() {
this.db = null;
+ this.dbVer = 1;
this.entities = null;
}
initDb() {
+ if (this.db !== null) {
+ return Promise.reject('database already initialized');
+ }
+
this.db = new Dexie('dict');
this.db.version(1).stores({
terms: '++id,expression,reading',
entities: '++,name',
- kanji: '++,character'
+ kanji: '++,character',
+ meta: 'name,value',
});
-
- this.entities = null;
}
- deleteDb() {
- return this.db === null ? Promise.resolve() : this.db.delete();
+ prepareDb() {
+ this.initDb();
+
+ return this.db.meta.get('version').then(row => {
+ return row ? row.value : 0;
+ }).catch(() => {
+ return 0;
+ }).then(version => {
+ if (this.dbVer === version) {
+ return true;
+ }
+
+ const db = this.db;
+ this.db.close();
+ this.db = null;
+
+ return db.delete().then(() => {
+ this.initDb();
+ return false;
+ });
+ });
}
- existsDb() {
- return Dexie.exists('dict');
+ sealDb() {
+ if (this.db === null) {
+ return Promise.reject('database not initialized');
+ }
+
+ return this.db.meta.put({name: 'version', value: this.dbVer});
}
findTerm(term) {
diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js
index b8cad6de..2cc97e1c 100644
--- a/ext/bg/js/translator.js
+++ b/ext/bg/js/translator.js
@@ -35,15 +35,14 @@ class Translator {
return loadJson('bg/data/tags.json');
}).then(tagMeta => {
this.tagMeta = tagMeta;
- return this.dictionary.existsDb();
+ return this.dictionary.prepareDb();
}).then(exists => {
- this.dictionary.initDb();
if (!exists) {
return Promise.all([
this.dictionary.importKanjiDict('bg/data/kanjidic/index.json'),
this.dictionary.importTermDict('bg/data/edict/index.json'),
this.dictionary.importTermDict('bg/data/enamdict/index.json')
- ]);
+ ]).then(() => this.dictionary.sealDb());
}
}).then(() => {
this.loaded = true;