diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-04-11 14:23:02 -0400 | 
|---|---|---|
| committer | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-04-18 21:32:35 -0400 | 
| commit | fd6ea0e404da2657f110599061af4034a524283a (patch) | |
| tree | cc993d88a040a0870ccf465209e0bb794502de88 | |
| parent | 8106f4744b07833526d16acf656eda11d29b99ad (diff) | |
Add API for getting media data
| -rw-r--r-- | ext/bg/js/backend.js | 7 | ||||
| -rw-r--r-- | ext/bg/js/database.js | 32 | ||||
| -rw-r--r-- | ext/mixed/js/api.js | 4 | 
3 files changed, 42 insertions, 1 deletions
| diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index e0814c17..8a19203f 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -111,7 +111,8 @@ class Backend {              ['getAnkiModelFieldNames', {handler: this._onApiGetAnkiModelFieldNames.bind(this), async: true}],              ['getDictionaryInfo', {handler: this._onApiGetDictionaryInfo.bind(this), async: true}],              ['getDictionaryCounts', {handler: this._onApiGetDictionaryCounts.bind(this), async: true}], -            ['purgeDatabase', {handler: this._onApiPurgeDatabase.bind(this), async: true}] +            ['purgeDatabase', {handler: this._onApiPurgeDatabase.bind(this), async: true}], +            ['getMedia', {handler: this._onApiGetMedia.bind(this), async: true}]          ]);          this._commandHandlers = new Map([ @@ -762,6 +763,10 @@ class Backend {          return await this.translator.purgeDatabase();      } +    async _onApiGetMedia({targets}) { +        return await this.database.getMedia(targets); +    } +      // Command handlers      async _onCommandSearch(params) { diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 0c7eee6a..16612403 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -277,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(); @@ -441,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); diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js index c97dc687..52f41646 100644 --- a/ext/mixed/js/api.js +++ b/ext/mixed/js/api.js @@ -140,6 +140,10 @@ function apiPurgeDatabase() {      return _apiInvoke('purgeDatabase');  } +function apiGetMedia(targets) { +    return _apiInvoke('getMedia', {targets}); +} +  function _apiInvoke(action, params={}) {      const data = {action, params};      return new Promise((resolve, reject) => { |