diff options
| author | Alex Yatskov <FooSoft@users.noreply.github.com> | 2019-05-05 18:26:02 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-05 18:26:02 -0700 | 
| commit | 61d1168d94a7467be6e98afc375d7583c0f23cb5 (patch) | |
| tree | 383b42f3b616c033d24f62b8d883121f6687558f /ext/bg/js/database.js | |
| parent | 43c5ef87c03307e8281366725f1196307effa9c7 (diff) | |
| parent | f2a5d5095931a78dc388d4cba66953560a336e7f (diff) | |
Merge pull request #160 from toasted-nutbread/mobile
Add support for mobile Firefox
Diffstat (limited to 'ext/bg/js/database.js')
| -rw-r--r-- | ext/bg/js/database.js | 68 | 
1 files changed, 42 insertions, 26 deletions
| diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 3c7f6aab..093ec102 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -228,11 +228,47 @@ class Database {          }      } -    async importDictionary(archive, callback) { +    async importDictionary(archive, progressCallback, exceptions) {          if (!this.db) {              throw 'Database not initialized';          } +        const maxTransactionLength = 1000; +        const bulkAdd = async (table, items, total, current) => { +            if (items.length < maxTransactionLength) { +                if (progressCallback) { +                    progressCallback(total, current); +                } + +                try { +                    await table.bulkAdd(items); +                } catch (e) { +                    if (exceptions) { +                        exceptions.push(e); +                    } else { +                        throw e; +                    } +                } +            } else { +                for (let i = 0; i < items.length; i += maxTransactionLength) { +                    if (progressCallback) { +                        progressCallback(total, current + i / items.length); +                    } + +                    let count = Math.min(maxTransactionLength, items.length - i); +                    try { +                        await table.bulkAdd(items.slice(i, i + count)); +                    } catch (e) { +                        if (exceptions) { +                            exceptions.push(e); +                        } else { +                            throw e; +                        } +                    } +                } +            } +        }; +          const indexDataLoaded = async summary => {              if (summary.version > 3) {                  throw 'Unsupported dictionary version'; @@ -247,10 +283,6 @@ class Database {          };          const termDataLoaded = async (summary, entries, total, current) => { -            if (callback) { -                callback(total, current); -            } -              const rows = [];              if (summary.version === 1) {                  for (const [expression, reading, definitionTags, rules, score, ...glossary] of entries) { @@ -280,14 +312,10 @@ class Database {                  }              } -            await this.db.terms.bulkAdd(rows); +            await bulkAdd(this.db.terms, rows, total, current);          };          const termMetaDataLoaded = async (summary, entries, total, current) => { -            if (callback) { -                callback(total, current); -            } -              const rows = [];              for (const [expression, mode, data] of entries) {                  rows.push({ @@ -298,14 +326,10 @@ class Database {                  });              } -            await this.db.termMeta.bulkAdd(rows); +            await bulkAdd(this.db.termMeta, rows, total, current);          };          const kanjiDataLoaded = async (summary, entries, total, current)  => { -            if (callback) { -                callback(total, current); -            } -              const rows = [];              if (summary.version === 1) {                  for (const [character, onyomi, kunyomi, tags, ...meanings] of entries) { @@ -332,14 +356,10 @@ class Database {                  }              } -            await this.db.kanji.bulkAdd(rows); +            await bulkAdd(this.db.kanji, rows, total, current);          };          const kanjiMetaDataLoaded = async (summary, entries, total, current) => { -            if (callback) { -                callback(total, current); -            } -              const rows = [];              for (const [character, mode, data] of entries) {                  rows.push({ @@ -350,14 +370,10 @@ class Database {                  });              } -            await this.db.kanjiMeta.bulkAdd(rows); +            await bulkAdd(this.db.kanjiMeta, rows, total, current);          };          const tagDataLoaded = async (summary, entries, total, current) => { -            if (callback) { -                callback(total, current); -            } -              const rows = [];              for (const [name, category, order, notes, score] of entries) {                  const row = dictTagSanitize({ @@ -372,7 +388,7 @@ class Database {                  rows.push(row);              } -            await this.db.tagMeta.bulkAdd(rows); +            await bulkAdd(this.db.tagMeta, rows, total, current);          };          return await Database.importDictionaryZip( |