diff options
Diffstat (limited to 'ext/bg/js/database.js')
| -rw-r--r-- | ext/bg/js/database.js | 43 | 
1 files changed, 42 insertions, 1 deletions
| diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 260c815a..16612403 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -33,7 +33,7 @@ class Database {          }          try { -            this.db = await Database._open('dict', 5, (db, transaction, oldVersion) => { +            this.db = await Database._open('dict', 6, (db, transaction, oldVersion) => {                  Database._upgrade(db, transaction, oldVersion, [                      {                          version: 2, @@ -90,6 +90,15 @@ class Database {                                  indices: ['dictionary', 'expression', 'reading', 'sequence', 'expressionReverse', 'readingReverse']                              }                          } +                    }, +                    { +                        version: 6, +                        stores: { +                            media: { +                                primaryKey: {keyPath: 'id', autoIncrement: true}, +                                indices: ['dictionary', 'path'] +                            } +                        }                      }                  ]);              }); @@ -268,6 +277,34 @@ class Database {          return result;      } +    async getMedia(targets) { +        this._validate(); + +        const count = targets.length; +        const promises = []; +        const results = new Array(count).fill(null); +        const createResult = Database._createMedia; +        const processRow = (row, [index, dictionaryName]) => { +            if (row.dictionary === dictionaryName) { +                results[index] = createResult(row, index); +            } +        }; + +        const transaction = this.db.transaction(['media'], 'readonly'); +        const objectStore = transaction.objectStore('media'); +        const index = objectStore.index('path'); + +        for (let i = 0; i < count; ++i) { +            const {path, dictionaryName} = targets[i]; +            const only = IDBKeyRange.only(path); +            promises.push(Database._getAll(index, only, [i, dictionaryName], processRow)); +        } + +        await Promise.all(promises); + +        return results; +    } +      async getDictionaryInfo() {          this._validate(); @@ -432,6 +469,10 @@ class Database {          return {character, mode, data, dictionary, index};      } +    static _createMedia(row, index) { +        return Object.assign({}, row, {index}); +    } +      static _getAll(dbIndex, query, context, processRow) {          const fn = typeof dbIndex.getAll === 'function' ? Database._getAllFast : Database._getAllUsingCursor;          return fn(dbIndex, query, context, processRow); |