Repositorio del curso CCOM4030 el semestre B91 del proyecto Artesanías con el Instituto de Cultura

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. (function (global, factory) {
  2. if (typeof define === "function" && define.amd) {
  3. define('webSQLStorage', ['module', 'exports', '../utils/isWebSQLValid', '../utils/serializer', '../utils/promise', '../utils/executeCallback', '../utils/normalizeKey', '../utils/getCallback'], factory);
  4. } else if (typeof exports !== "undefined") {
  5. factory(module, exports, require('../utils/isWebSQLValid'), require('../utils/serializer'), require('../utils/promise'), require('../utils/executeCallback'), require('../utils/normalizeKey'), require('../utils/getCallback'));
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory(mod, mod.exports, global.isWebSQLValid, global.serializer, global.promise, global.executeCallback, global.normalizeKey, global.getCallback);
  11. global.webSQLStorage = mod.exports;
  12. }
  13. })(this, function (module, exports, _isWebSQLValid, _serializer, _promise, _executeCallback, _normalizeKey, _getCallback) {
  14. 'use strict';
  15. Object.defineProperty(exports, "__esModule", {
  16. value: true
  17. });
  18. var _isWebSQLValid2 = _interopRequireDefault(_isWebSQLValid);
  19. var _serializer2 = _interopRequireDefault(_serializer);
  20. var _promise2 = _interopRequireDefault(_promise);
  21. var _executeCallback2 = _interopRequireDefault(_executeCallback);
  22. var _normalizeKey2 = _interopRequireDefault(_normalizeKey);
  23. var _getCallback2 = _interopRequireDefault(_getCallback);
  24. function _interopRequireDefault(obj) {
  25. return obj && obj.__esModule ? obj : {
  26. default: obj
  27. };
  28. }
  29. /*
  30. * Includes code from:
  31. *
  32. * base64-arraybuffer
  33. * https://github.com/niklasvh/base64-arraybuffer
  34. *
  35. * Copyright (c) 2012 Niklas von Hertzen
  36. * Licensed under the MIT license.
  37. */
  38. function createDbTable(t, dbInfo, callback, errorCallback) {
  39. t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);
  40. }
  41. // Open the WebSQL database (automatically creates one if one didn't
  42. // previously exist), using any options set in the config.
  43. function _initStorage(options) {
  44. var self = this;
  45. var dbInfo = {
  46. db: null
  47. };
  48. if (options) {
  49. for (var i in options) {
  50. dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];
  51. }
  52. }
  53. var dbInfoPromise = new _promise2.default(function (resolve, reject) {
  54. // Open the database; the openDatabase API will automatically
  55. // create it for us if it doesn't exist.
  56. try {
  57. dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);
  58. } catch (e) {
  59. return reject(e);
  60. }
  61. // Create our key/value table if it doesn't exist.
  62. dbInfo.db.transaction(function (t) {
  63. createDbTable(t, dbInfo, function () {
  64. self._dbInfo = dbInfo;
  65. resolve();
  66. }, function (t, error) {
  67. reject(error);
  68. });
  69. }, reject);
  70. });
  71. dbInfo.serializer = _serializer2.default;
  72. return dbInfoPromise;
  73. }
  74. function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {
  75. t.executeSql(sqlStatement, args, callback, function (t, error) {
  76. if (error.code === error.SYNTAX_ERR) {
  77. t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) {
  78. if (!results.rows.length) {
  79. // if the table is missing (was deleted)
  80. // re-create it table and retry
  81. createDbTable(t, dbInfo, function () {
  82. t.executeSql(sqlStatement, args, callback, errorCallback);
  83. }, errorCallback);
  84. } else {
  85. errorCallback(t, error);
  86. }
  87. }, errorCallback);
  88. } else {
  89. errorCallback(t, error);
  90. }
  91. }, errorCallback);
  92. }
  93. function getItem(key, callback) {
  94. var self = this;
  95. key = (0, _normalizeKey2.default)(key);
  96. var promise = new _promise2.default(function (resolve, reject) {
  97. self.ready().then(function () {
  98. var dbInfo = self._dbInfo;
  99. dbInfo.db.transaction(function (t) {
  100. tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {
  101. var result = results.rows.length ? results.rows.item(0).value : null;
  102. // Check to see if this is serialized content we need to
  103. // unpack.
  104. if (result) {
  105. result = dbInfo.serializer.deserialize(result);
  106. }
  107. resolve(result);
  108. }, function (t, error) {
  109. reject(error);
  110. });
  111. });
  112. }).catch(reject);
  113. });
  114. (0, _executeCallback2.default)(promise, callback);
  115. return promise;
  116. }
  117. function iterate(iterator, callback) {
  118. var self = this;
  119. var promise = new _promise2.default(function (resolve, reject) {
  120. self.ready().then(function () {
  121. var dbInfo = self._dbInfo;
  122. dbInfo.db.transaction(function (t) {
  123. tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {
  124. var rows = results.rows;
  125. var length = rows.length;
  126. for (var i = 0; i < length; i++) {
  127. var item = rows.item(i);
  128. var result = item.value;
  129. // Check to see if this is serialized content
  130. // we need to unpack.
  131. if (result) {
  132. result = dbInfo.serializer.deserialize(result);
  133. }
  134. result = iterator(result, item.key, i + 1);
  135. // void(0) prevents problems with redefinition
  136. // of `undefined`.
  137. if (result !== void 0) {
  138. resolve(result);
  139. return;
  140. }
  141. }
  142. resolve();
  143. }, function (t, error) {
  144. reject(error);
  145. });
  146. });
  147. }).catch(reject);
  148. });
  149. (0, _executeCallback2.default)(promise, callback);
  150. return promise;
  151. }
  152. function _setItem(key, value, callback, retriesLeft) {
  153. var self = this;
  154. key = (0, _normalizeKey2.default)(key);
  155. var promise = new _promise2.default(function (resolve, reject) {
  156. self.ready().then(function () {
  157. // The localStorage API doesn't return undefined values in an
  158. // "expected" way, so undefined is always cast to null in all
  159. // drivers. See: https://github.com/mozilla/localForage/pull/42
  160. if (value === undefined) {
  161. value = null;
  162. }
  163. // Save the original value to pass to the callback.
  164. var originalValue = value;
  165. var dbInfo = self._dbInfo;
  166. dbInfo.serializer.serialize(value, function (value, error) {
  167. if (error) {
  168. reject(error);
  169. } else {
  170. dbInfo.db.transaction(function (t) {
  171. tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {
  172. resolve(originalValue);
  173. }, function (t, error) {
  174. reject(error);
  175. });
  176. }, function (sqlError) {
  177. // The transaction failed; check
  178. // to see if it's a quota error.
  179. if (sqlError.code === sqlError.QUOTA_ERR) {
  180. // We reject the callback outright for now, but
  181. // it's worth trying to re-run the transaction.
  182. // Even if the user accepts the prompt to use
  183. // more storage on Safari, this error will
  184. // be called.
  185. //
  186. // Try to re-run the transaction.
  187. if (retriesLeft > 0) {
  188. resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));
  189. return;
  190. }
  191. reject(sqlError);
  192. }
  193. });
  194. }
  195. });
  196. }).catch(reject);
  197. });
  198. (0, _executeCallback2.default)(promise, callback);
  199. return promise;
  200. }
  201. function setItem(key, value, callback) {
  202. return _setItem.apply(this, [key, value, callback, 1]);
  203. }
  204. function removeItem(key, callback) {
  205. var self = this;
  206. key = (0, _normalizeKey2.default)(key);
  207. var promise = new _promise2.default(function (resolve, reject) {
  208. self.ready().then(function () {
  209. var dbInfo = self._dbInfo;
  210. dbInfo.db.transaction(function (t) {
  211. tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {
  212. resolve();
  213. }, function (t, error) {
  214. reject(error);
  215. });
  216. });
  217. }).catch(reject);
  218. });
  219. (0, _executeCallback2.default)(promise, callback);
  220. return promise;
  221. }
  222. // Deletes every item in the table.
  223. // TODO: Find out if this resets the AUTO_INCREMENT number.
  224. function clear(callback) {
  225. var self = this;
  226. var promise = new _promise2.default(function (resolve, reject) {
  227. self.ready().then(function () {
  228. var dbInfo = self._dbInfo;
  229. dbInfo.db.transaction(function (t) {
  230. tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {
  231. resolve();
  232. }, function (t, error) {
  233. reject(error);
  234. });
  235. });
  236. }).catch(reject);
  237. });
  238. (0, _executeCallback2.default)(promise, callback);
  239. return promise;
  240. }
  241. // Does a simple `COUNT(key)` to get the number of items stored in
  242. // localForage.
  243. function length(callback) {
  244. var self = this;
  245. var promise = new _promise2.default(function (resolve, reject) {
  246. self.ready().then(function () {
  247. var dbInfo = self._dbInfo;
  248. dbInfo.db.transaction(function (t) {
  249. // Ahhh, SQL makes this one soooooo easy.
  250. tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {
  251. var result = results.rows.item(0).c;
  252. resolve(result);
  253. }, function (t, error) {
  254. reject(error);
  255. });
  256. });
  257. }).catch(reject);
  258. });
  259. (0, _executeCallback2.default)(promise, callback);
  260. return promise;
  261. }
  262. // Return the key located at key index X; essentially gets the key from a
  263. // `WHERE id = ?`. This is the most efficient way I can think to implement
  264. // this rarely-used (in my experience) part of the API, but it can seem
  265. // inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so
  266. // the ID of each key will change every time it's updated. Perhaps a stored
  267. // procedure for the `setItem()` SQL would solve this problem?
  268. // TODO: Don't change ID on `setItem()`.
  269. function key(n, callback) {
  270. var self = this;
  271. var promise = new _promise2.default(function (resolve, reject) {
  272. self.ready().then(function () {
  273. var dbInfo = self._dbInfo;
  274. dbInfo.db.transaction(function (t) {
  275. tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {
  276. var result = results.rows.length ? results.rows.item(0).key : null;
  277. resolve(result);
  278. }, function (t, error) {
  279. reject(error);
  280. });
  281. });
  282. }).catch(reject);
  283. });
  284. (0, _executeCallback2.default)(promise, callback);
  285. return promise;
  286. }
  287. function keys(callback) {
  288. var self = this;
  289. var promise = new _promise2.default(function (resolve, reject) {
  290. self.ready().then(function () {
  291. var dbInfo = self._dbInfo;
  292. dbInfo.db.transaction(function (t) {
  293. tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {
  294. var keys = [];
  295. for (var i = 0; i < results.rows.length; i++) {
  296. keys.push(results.rows.item(i).key);
  297. }
  298. resolve(keys);
  299. }, function (t, error) {
  300. reject(error);
  301. });
  302. });
  303. }).catch(reject);
  304. });
  305. (0, _executeCallback2.default)(promise, callback);
  306. return promise;
  307. }
  308. // https://www.w3.org/TR/webdatabase/#databases
  309. // > There is no way to enumerate or delete the databases available for an origin from this API.
  310. function getAllStoreNames(db) {
  311. return new _promise2.default(function (resolve, reject) {
  312. db.transaction(function (t) {
  313. t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) {
  314. var storeNames = [];
  315. for (var i = 0; i < results.rows.length; i++) {
  316. storeNames.push(results.rows.item(i).name);
  317. }
  318. resolve({
  319. db: db,
  320. storeNames: storeNames
  321. });
  322. }, function (t, error) {
  323. reject(error);
  324. });
  325. }, function (sqlError) {
  326. reject(sqlError);
  327. });
  328. });
  329. }
  330. function dropInstance(options, callback) {
  331. callback = _getCallback2.default.apply(this, arguments);
  332. var currentConfig = this.config();
  333. options = typeof options !== 'function' && options || {};
  334. if (!options.name) {
  335. options.name = options.name || currentConfig.name;
  336. options.storeName = options.storeName || currentConfig.storeName;
  337. }
  338. var self = this;
  339. var promise;
  340. if (!options.name) {
  341. promise = _promise2.default.reject('Invalid arguments');
  342. } else {
  343. promise = new _promise2.default(function (resolve) {
  344. var db;
  345. if (options.name === currentConfig.name) {
  346. // use the db reference of the current instance
  347. db = self._dbInfo.db;
  348. } else {
  349. db = openDatabase(options.name, '', '', 0);
  350. }
  351. if (!options.storeName) {
  352. // drop all database tables
  353. resolve(getAllStoreNames(db));
  354. } else {
  355. resolve({
  356. db: db,
  357. storeNames: [options.storeName]
  358. });
  359. }
  360. }).then(function (operationInfo) {
  361. return new _promise2.default(function (resolve, reject) {
  362. operationInfo.db.transaction(function (t) {
  363. function dropTable(storeName) {
  364. return new _promise2.default(function (resolve, reject) {
  365. t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {
  366. resolve();
  367. }, function (t, error) {
  368. reject(error);
  369. });
  370. });
  371. }
  372. var operations = [];
  373. for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {
  374. operations.push(dropTable(operationInfo.storeNames[i]));
  375. }
  376. _promise2.default.all(operations).then(function () {
  377. resolve();
  378. }).catch(function (e) {
  379. reject(e);
  380. });
  381. }, function (sqlError) {
  382. reject(sqlError);
  383. });
  384. });
  385. });
  386. }
  387. (0, _executeCallback2.default)(promise, callback);
  388. return promise;
  389. }
  390. var webSQLStorage = {
  391. _driver: 'webSQLStorage',
  392. _initStorage: _initStorage,
  393. _support: (0, _isWebSQLValid2.default)(),
  394. iterate: iterate,
  395. getItem: getItem,
  396. setItem: setItem,
  397. removeItem: removeItem,
  398. clear: clear,
  399. length: length,
  400. key: key,
  401. keys: keys,
  402. dropInstance: dropInstance
  403. };
  404. exports.default = webSQLStorage;
  405. module.exports = exports['default'];
  406. });