diff options
Diffstat (limited to 'ext/bg/js/database.js')
| -rw-r--r-- | ext/bg/js/database.js | 73 | 
1 files changed, 73 insertions, 0 deletions
diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 7f4c6ac6..06786881 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -148,6 +148,79 @@ class Database {          return this.db.dictionaries.toArray();      } +    deleteDictionary(title, callback) { +        if (this.db === null) { +            return Promise.reject('database not initialized'); +        } + +        return this.db.dictionaries.where('title').equals(title).first(info => { +            if (!info) { +                return; +            } + +            let termCounter = Promise.resolve(0); +            if (info.hasTerms) { +                termCounter = this.db.terms.where('dictionary').equals(title).count(); +            } + +            let kanjiCounter = Promise.resolve(0); +            if (info.hasKanji) { +                kanjiCounter = this.db.kanji.where('dictionary').equals(title).count(); +            } + +            return Promise.all([termCounter, kanjiCounter]).then(([termCount, kanjiCount]) => { +                const totalCount = termCount + kanjiCount; +                let deletedCount = 0; + +                let termDeleter = Promise.resolve(); +                if (info.hasTerms) { +                    const termDeleterFunc = () => { +                        return this.db.terms.where('dictionary').equals(title).limit(1000).delete().then(count => { +                            if (count === 0) { +                                return Promise.resolve(); +                            } + +                            deletedCount += count; +                            if (callback) { +                                callback(totalCount, deletedCount); +                            } + +                            return termDeleterFunc(); +                        }); +                    }; + +                    termDeleter = termDeleterFunc(); +                } + +                let kanjiDeleter = Promise.resolve(); +                if (info.hasKanji) { +                    const kanjiDeleterFunc = () => { +                        return this.db.kanji.where('dictionary').equals(title).limit(1000).delete().then(count => { +                            if (count === 0) { +                                return Promise.resolve(); +                            } + +                            deletedCount += count; +                            if (callback) { +                                callback(totalCount, deletedCount); +                            } + +                            return kanjiDeleterFunc(); +                        }); +                    }; + +                    kanjiDeleter = kanjiDeleterFunc(); +                } + +                return Promise.all([termDeleter, kanjiDeleter]); +            }); +        }).then(() => { +            return this.db.entities.where('dictionary').equals(title).delete(); +        }).then(() => { +            return this.db.dictionaries.where('title').equals(title).delete(); +        }); +    } +      importDictionary(indexUrl, callback) {          if (this.db === null) {              return Promise.reject('database not initialized');  |