| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- /**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
- define(['./when-8d13db60', './createTaskProcessorWorker'], function (when, createTaskProcessorWorker) { 'use strict';
- /**
- * @exports defined
- *
- * @param {*} value The object.
- * @returns {Boolean} Returns true if the object is defined, returns false otherwise.
- *
- * @example
- * if (Cesium.defined(positions)) {
- * doSomething();
- * } else {
- * doSomethingElse();
- * }
- */
- function defined(value) {
- return value !== undefined && value !== null;
- }
- /**
- * Constructs an exception object that is thrown due to a developer error, e.g., invalid argument,
- * argument out of range, etc. This exception should only be thrown during development;
- * it usually indicates a bug in the calling code. This exception should never be
- * caught; instead the calling code should strive not to generate it.
- * <br /><br />
- * On the other hand, a {@link RuntimeError} indicates an exception that may
- * be thrown at runtime, e.g., out of memory, that the calling code should be prepared
- * to catch.
- *
- * @alias DeveloperError
- * @constructor
- * @extends Error
- *
- * @param {String} [message] The error message for this exception.
- *
- * @see RuntimeError
- */
- function DeveloperError(message) {
- /**
- * 'DeveloperError' indicating that this exception was thrown due to a developer error.
- * @type {String}
- * @readonly
- */
- this.name = 'DeveloperError';
- /**
- * The explanation for why this exception was thrown.
- * @type {String}
- * @readonly
- */
- this.message = message;
- //Browsers such as IE don't have a stack property until you actually throw the error.
- var stack;
- try {
- throw new Error();
- } catch (e) {
- stack = e.stack;
- }
- /**
- * The stack trace of this exception, if available.
- * @type {String}
- * @readonly
- */
- this.stack = stack;
- }
- if (defined(Object.create)) {
- DeveloperError.prototype = Object.create(Error.prototype);
- DeveloperError.prototype.constructor = DeveloperError;
- }
- DeveloperError.prototype.toString = function() {
- var str = this.name + ': ' + this.message;
- if (defined(this.stack)) {
- str += '\n' + this.stack.toString();
- }
- return str;
- };
- /**
- * @private
- */
- DeveloperError.throwInstantiationError = function() {
- throw new DeveloperError('This function defines an interface and should not be called directly.');
- };
- var DataStatus = {
- NONE : 0,
- STORING : 1,
- STORED : 2,
- FAILED : 3
- };
- function IndexedDBScheduler(options) {
- if(!defined(options.name)){
- throw new DeveloperError('options.name is required.');
- }
- var defer = when.when.defer();
- this.dbname = options.name;
- var request = indexedDB.open(this.dbname);
- var that = this;
- request.onsuccess = function (event) {
- that.db = event.target.result;
- that.version = that.db.version;
- if (!defined(that.cachestatus)) {
- that.cachestatus = {
- };
- }
- defer.resolve(that);
- };
- request.onupgradeneeded = function (event) {
- that.db = event.target.result;
- that.version = that.db.version;
- defer.resolve(that);
- };
- request.onerror = function (event) {
- that.db = null;
- defer.reject('create database fail, error code : ' + event.target.errorcode);
- };
- this.layer = options.layer || null;
- this.storageType = options.storageType || "arrayBuffer";
- this.creatingTable = false;
- this.cachestatus = {};
- return defer.promise;
- }
- IndexedDBScheduler.prototype.checkObjectStoreExit = function(storeName) {
- if (!defined(this.db)) {
- return false;
- }
- return this.db.objectStoreNames.contains(storeName);
- };
- IndexedDBScheduler.prototype.createObjectStore = function(storeName) {
- var defer = when.when.defer();
- //防止多个请求同时创建同一张表
- if (!this.creatingTable) {
- if (this.db.objectStoreNames.contains(storeName)) {
- defer.reject(false);
- return defer.promise;
- }
- this.creatingTable = true;
- var that = this;
- //只能在onupgradeneeded方法中创建新表,所以需要用更高版本打开数据库触发更新
- var version = parseInt(that.db.version);
- that.db.close();
- var secondRequest = indexedDB.open(that.dbname, version + 1);
- secondRequest.onupgradeneeded = function(e) {
- var database = e.target.result;
- that.db = database;
- var objectStore = database.createObjectStore(storeName, { keyPath : 'id'});
- if (defined(objectStore)) {
- objectStore.createIndex('value', 'value', { unique : false});
- that.creatingTable = false;
- //初始化表的缓存状态
- if (!defined(that.cachestatus)) {
- that.cachestatus = {};
- }
- that.cachestatus[storeName] = {
- };
- //这边创建成功表后直接使用会出现各种奇怪的问题,索性关闭数据库后再打开
- that.db.close();
- var thirdRequest = indexedDB.open(that.dbname);
- thirdRequest.onsuccess = function(e) {
- var database = e.target.result;
- that.db = database;
- defer.resolve(true);
- };
- } else {
- that.creatingTable = false;
- defer.reject(false);
- }
- };
- secondRequest.onsuccess = function(e) {
- e.target.result.close();
- defer.resolve(true);
- };
- secondRequest.onerror = function(e) {
- that.creatingTable = false;
- defer.reject(false);
- };
- } else {
- defer.reject(false);
- }
- return defer.promise;
- };
- IndexedDBScheduler.prototype.putElementInDB = function (table, key, data, objectArray) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- defer.reject(false);
- return defer.promise;
- }
- var objectStore;
- var that = this;
- //先检查缓存,如果已经写了就不去写了
- if (defined(that.cachestatus[table]) && !defined(objectArray)) {
- if (defined(that.cachestatus[table][key])) {
- if (that.cachestatus[table][key] === DataStatus.STORING || that.cachestatus[table][key] === DataStatus.STORED) {
- defer.resolve(false);
- return defer.promise;
- }
- }
- }
- //没有表,去创建指定名称的表
- if (!this.db.objectStoreNames.contains(table)) {
- this.createObjectStore(table).then(function(success) {
- var transaction = that.db.transaction([table], "readwrite");
- objectStore = transaction.objectStore(table);
- if (defined(objectArray)) {
- for (var i = 0, len = objectArray.length; i < len; i++) {
- objectStore.add({ id : objectArray[i].key, value : objectArray[i].value});
- }
- defer.resolve(true);
- } else {
- var request = objectStore.add({ id : key, value : data});
- request.onsuccess = function (event) {
- defer.resolve(true);
- };
- request.onerror = function (event) {
- defer.reject(false);
- };
- }
- }, function(error) {
- defer.reject(false);
- });
- } else {
- if (!defined(that.cachestatus[table])) {
- that.cachestatus[table] = {
- };
- }
- //打开表并添加对应数据
- var transaction;
- try {
- transaction = this.db.transaction([table], "readwrite");
- } catch (e) {
- defer.reject(null);
- return defer.promise;
- }
- objectStore = transaction.objectStore(table);
- if (defined(objectArray)) {
- if (objectArray instanceof Array) {
- for (var i = 0, len = objectArray.length; i < len; i++) {
- if (that.cachestatus[table][objectArray[i].key] !== DataStatus.STORED) {
- objectStore.add({ id : objectArray[i].key, value : objectArray[i].value});
- that.cachestatus[table][objectArray[i].key] = DataStatus.STORED;
- }
- }
- defer.resolve(true);
- } else {
- for (var key in objectArray) {
- if (isNaN(key * 1)) {
- continue;
- }
- objectStore.add({ id : key, value : objectArray[key]});
- }
- defer.resolve(true);
- }
-
- } else if (!defined(key) || !defined(data)) {
- return;
- } else if (key instanceof Array && data instanceof Array) {
- for (var i = 0, len = key.length; i < len; i++) {
- if (that.cachestatus[table][key[i]] !== DataStatus.STORED) {
- objectStore.add({ id : key[i], value : data[i]});
- that.cachestatus[table][key[i]] = DataStatus.STORED;
- }
- }
- transaction.oncomplete = function(e) {
- defer.resolve(true);
- };
- transaction.onerror = function(e) {
- defer.reject(false);
- };
- } else {
- var request = objectStore.add({ id : key, value : data});
- that.cachestatus[table][key] = DataStatus.STORING;
- request.onsuccess = function (event) {
- that.cachestatus[table][key] = DataStatus.STORED;
- defer.resolve(true);
- };
- request.onerror = function (event) {
- that.cachestatus[table][key] = DataStatus.FAILED;
- defer.reject(false);
- };
- }
- }
- return defer.promise;
- };
- IndexedDBScheduler.prototype.getRangeFromDB = function(table, idRange) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- return null;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- return null;
- }
- var transaction;
- try {
- transaction = this.db.transaction([table]);
- } catch (e) {
- defer.reject(null);
- return defer.promise;
- }
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.reject(null);
- }
- var request = objectStore.openCursor(IDBKeyRange.bound(idRange[0], idRange[1]));
- var rs = [];
- request.onsuccess = function(event) {
- var cursor = event.target.result;
- if (!defined(cursor)) {
- defer.resolve(rs);
- } else {
- rs.push(cursor.value);
- cursor.continue();
- }
- };
- request.onerror = function(event) {
- defer.reject(null);
- };
- return defer.promise;
- };
- IndexedDBScheduler.prototype.getElementFromDB = function (table, key) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- return null;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- return null;
- }
- var transaction;
- try {
- transaction = this.db.transaction([table]);
- } catch (e) {
- defer.reject(null);
- return defer.promise;
- }
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.reject(null);
- }
- var request = objectStore.get(key);
- request.onsuccess = function(event) {
- if (!defined(event.target.result)) {
- defer.reject(null);
- return;
- }
- defer.resolve(event.target.result.value);
- };
- request.onerror = function(event) {
- defer.reject(null);
- };
- return defer.promise;
- };
- IndexedDBScheduler.prototype.getAllElementFromDB = function (table) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- return null;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- return null;
- }
- var transaction;
- if (this.transaction != null) {
- transaction = this.transaction;
- } else {
- try {
- transaction = this.db.transaction([table]);
- } catch (e) {
- defer.reject(null);
- return defer.promise;
- }
- }
-
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.reject(null);
- }
- var request = objectStore.getAll();
- request.onsuccess = function(event) {
- if (!defined(event.target.result)) {
- defer.reject(null);
- return;
- }
- defer.resolve(event.target.result);
- };
- request.onerror = function(event) {
- defer.reject(null);
- };
- return defer.promise;
- };
- IndexedDBScheduler.prototype.updateElementInDB = function (table, key, value, append) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- defer.resolve(false);
- return defer.promise;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- defer.resolve(false);
- return defer.promise;
- }
- var transaction = this.db.transaction([table], "readwrite");
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.resolve(false);
- }
- var request = objectStore.get(key);
- request.onsuccess = function(event) {
- var data = event.target.result;
- if (!defined(data)) {
- data = {
- id : key
- };
- }
- if (append === true) {
- data.value = Object.assign(data.value, value);
- } else {
- data.value = value;
- }
-
- var requestUpdate = objectStore.put(data);
- requestUpdate.onsuccess = function(event) {
- defer.resolve(true);
- };
- requestUpdate.onerror = function(event) {
- defer.resolve(false);
- };
- };
- request.onerror = function(event) {
- defer.resolve(false);
- };
- return defer.promise;
- };
- IndexedDBScheduler.prototype.removeElementFromDB = function (table, key) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- defer.resolve(false);
- return defer.promise;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- defer.resolve(false);
- return defer.promise;
- }
- var transaction = this.db.transaction([table], "readwrite");
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.resolve(false);
- }
- var request = objectStore.delete(key);
- request.onerror = function(event) {
- defer.resolve(false);
- };
- request.onsuccess = function(event) {
- defer.resolve(true);
- };
- return defer.promise;
- };
- IndexedDBScheduler.prototype.clear = function(table) {
- var defer = when.when.defer();
- if (!defined(this.db)) {
- defer.resolve(false);
- return defer.promise;
- }
- if (!this.db.objectStoreNames.contains(table)) {
- defer.resolve(false);
- return defer.promise;
- }
- var transaction = this.db.transaction([table], "readwrite");
- var objectStore;
- try {
- objectStore = transaction.objectStore(table);
- } catch (e) {
- defer.resolve(false);
- }
- var request = objectStore.clear();
- request.onerror = function(event) {
- defer.resolve(false);
- };
- request.onsuccess = function(event) {
- defer.resolve(true);
- };
- return defer.promise;
- };
- var cache = {};
- function indexedDBWorker(parameters, transferableObjects) {
- var blob = parameters.blob;
- var key = parameters.key;
- var tablename = parameters.tablename;
- var dbname = parameters.dbname;
- var cacheSize = parameters.cacheSize || 100;
- var cahceKey = dbname + tablename;
- if (typeof cache[cahceKey] === "undefined") {
- cache[cahceKey] = {
- cache: [],
- creatingDB: false,
- scheduler: null,
- creatingTable: false
- };
- } else {
- cache[cahceKey].cache.push({
- key: key,
- value: blob
- });
- }
- if (cache[cahceKey].cache.length > cacheSize) {
- putElementInDB(dbname, tablename, cache[cahceKey]);
- }
- }
- function putElementInDB(dbname, tablename, cache) {
- if (cache.scheduler === null) {
- if (!cache.creatingDB) {
- cache.creatingDB = true;
- new IndexedDBScheduler({ name: dbname }).then(function (result) {
- cache.creatingDB = false;
- cache.scheduler = result;
- if (!result.checkObjectStoreExit(tablename)) {
- if (!cache.creatingTable) {
- cache.creatingTable = true;
- result.createObjectStore(tablename).then(function () {
- cache.creatingTable = false;
- result.putElementInDB(tablename, null, null, cache.cache);
- cache.cache = [];
- });
- }
- } else {
- result.putElementInDB(tablename, null, null, cache.cache);
- cache.cache = [];
- }
- });
- }
- } else {
- if (!cache.scheduler.checkObjectStoreExit(tablename)) {
- if (!cache.creatingTable) {
- cache.creatingTable = true;
- cache.scheduler.createObjectStore(tablename).then(function () {
- cache.creatingTable = false;
- cache.scheduler.putElementInDB(tablename, null, null, cache.cache);
- cache.cache = [];
- });
- }
- } else {
- cache.scheduler.putElementInDB(tablename, null, null, cache.cache);
- cache.cache = [];
- }
- }
- }
- var indexedDBWorker$1 = createTaskProcessorWorker(indexedDBWorker);
- return indexedDBWorker$1;
- });
|