UNPKG

vue-cesium

Version:
290 lines (286 loc) 8.2 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); "use strict"; const Status = { NONE: 0, STORING: 1, STORED: 2, FAILED: 3 }; class IndexedDBScheduler { /** * * @param {Object} options */ constructor(options) { if (!Cesium.defined(options.name)) { throw new Cesium.DeveloperError("options.name is required."); } const dbRequest = window.indexedDB.open(this.dbname); this.layer = options.layer || null; this.storageType = options.storageType || "arrayBuffer"; this.creatingTable = false; this.cachestatus = {}; this.dbname = options.name; const that = this; return new Promise((resolve, reject) => { dbRequest.onsuccess = (event) => { that.db = event.target.result; that.version = that.db.version; that.cachestatus = that.cachestatus || {}; resolve(that); }; dbRequest.onupgradeneeded = (event) => { that.db = event.target.result; that.version = that.db.version; resolve(that); }; dbRequest.onerror = (event) => { that.db = null; reject("create database fail, error code : " + event.target.errorcode); }; }); } /** * 检查对象仓库是否存在。 * @param {String} storeName 对象仓库(表)名称 */ checkObjectStoreExist(storeName) { return Cesium.defined(this.db) ? this.db.objectStoreNames.contains(storeName) : false; } /** * 创建 IndexedDB 浏对象仓库,IndexedDB 是浏览器提供的本地数据库 * @param {String} storeName 对象仓库(表)名称 * @returns {Promise} */ createObjectStore(storeName) { return new Promise((resolve, reject) => { if (this.creatingTable) { reject(false); } else { if (this.db.objectStoreNames.contains(storeName)) { reject(false); return; } this.creatingTable = true; const version = parseInt(this.db.version); this.db.close(); const that = this; const dbRequest = window.indexedDB.open(this.dbname, version + 1); dbRequest.onupgradeneeded = (event) => { const db = event.target.result; that.db = db; const objectStore = db.createObjectStore(storeName, { keyPath: "id" }); if (Cesium.defined(objectStore)) { objectStore.createIndex("value", "value", { unique: false }); that.creatingTable = false; that.cachestatus = that.cachestatus || {}; that.cachestatus[storeName] = {}; that.db.close(); const dbRequest2 = window.indexedDB.open(that.dbname); dbRequest2.onsuccess = (event2) => { that.db = event2.target.result; resolve(true); }; } else { that.creatingTable = false; resolve(false); } }; dbRequest.onsuccess = (event) => { ; event.target.result.close(); resolve(true); }; dbRequest.onerror = (event) => { that.creatingTable = false; reject(false); }; } }); } /** * 向对象仓库写入数据记录。 * @param {String} storeName 对象仓库(表)名称 * @param {Number} id 主键 * @param {*} value 值 * @returns {Promise} */ putElementInDB(storeName, id, value) { return new Promise((resolve, reject) => { if (!Cesium.defined(this.db)) { reject(false); return; } const { cachestatus, db } = this; if (Cesium.defined(cachestatus[storeName]) && Cesium.defined(cachestatus[storeName][id] && (cachestatus[storeName][id] === Status.STORING || cachestatus[storeName][id] === Status.STORED))) { resolve(false); return; } if (db.objectStoreNames.contains(storeName)) { cachestatus[storeName] = cachestatus[storeName] || {}; try { const request = db.transaction([storeName], "readwrite").objectStore(storeName).add({ id, value }); cachestatus[storeName][id] = Status.STORING; request.onsuccess = (event) => { cachestatus[storeName][id] = Status.STORED; resolve(true); }; request.onerror = (event) => { cachestatus[storeName][id] = Status.FAILED; resolve(false); }; } catch (error) { reject(null); return; } } else { this.createObjectStore(storeName).then( () => { const request = db.transaction([storeName], "readwrite").objectStore(storeName).add({ id, value }); request.onsuccess = function(e) { resolve(true); }; request.onerror = function(e) { reject(false); }; }, () => { reject(false); } ); } }); } /** * 向对象仓库读取数据。 * @param {String} storeName 对象仓库(表)名称 * @param {Number} id 主键 * @returns {Promise} */ getElementFromDB(storeName, id) { return new Promise((resolve, reject) => { const { db } = this; if (!Cesium.defined(db)) { return null; } if (!db.objectStoreNames.contains(storeName)) { return null; } try { const transaction = db.transaction([storeName]); const objectStore = transaction.objectStore(storeName); const request = objectStore.get(id); request.onsuccess = (e) => { return Cesium.defined(e.target.result) ? resolve(e.target.result.value) : reject(null); }; request.onerror = (e) => { reject(null); }; } catch (error) { reject(null); } }); } /** * 更新数据。 * @param {String} storeName * @param {Number} id * @param {*} value * @returns {Promise} */ updateElementInDB(storeName, id, value) { return new Promise((resolve, reject) => { const { db } = this; if (!Cesium.defined(db)) { resolve(false); return; } if (!db.objectStoreNames.contains(storeName)) { resolve(false); return; } try { const request = db.transaction([storeName], "readwrite").objectStore(storeName).put({ id, value }); request.onsuccess = () => { resolve(true); }; request.onerror = () => { resolve(false); }; } catch (e) { resolve(false); } }); } /** * 移除数据。 * @param {String} storeName * @param {Number} id * @returns {Promise} */ removeElementFromDB(storeName, id) { return new Promise((resolve, reject) => { const { db } = this; if (!Cesium.defined(db)) { resolve(false); return; } if (!db.objectStoreNames.contains(storeName)) { resolve(false); return; } try { const request = db.transaction([storeName], "readwrite").objectStore(storeName).delete(id); request.onsuccess = () => { resolve(true); }; request.onerror = () => { resolve(false); }; } catch (e) { resolve(false); } }); } /** * 清空对象仓库 * @param {String} storeName */ clear(storeName) { return new Promise((resolve, reject) => { const { db } = this; if (!Cesium.defined(db)) { resolve(false); return; } if (!db.objectStoreNames.contains(storeName)) { resolve(false); return; } try { const request = db.transaction([storeName], "readwrite").objectStore(storeName).clear(); request.onsuccess = () => { resolve(true); }; request.onerror = () => { resolve(false); }; } catch (e) { resolve(false); } }); } } exports["default"] = IndexedDBScheduler; //# sourceMappingURL=IndexedDBScheduler.js.map