WME Cities Overlay DB

IndexedDB interface for Cities overlay

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greatest.deepsurf.us/scripts/369729/607489/WME%20Cities%20Overlay%20DB.js

  1. // ==UserScript==
  2. // @name WME Cities Overlay DB
  3. // @namespace https://greatest.deepsurf.us/en/users/166843-wazedev
  4. // @version 2018.06.22.05
  5. // @description IndexedDB interface for Cities overlay
  6. // @author WazeDev
  7. // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/
  8. // @license GNU GPLv3
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12.  
  13. (function() {
  14. 'use strict';
  15. var db;
  16.  
  17. function getDB() {
  18. if (!db) {
  19. db = new Promise(function(resolve, reject) {
  20. var openreq = indexedDB.open('WMECitiesOverlay', 1);
  21.  
  22. openreq.onerror = function() {
  23. reject(openreq.error);
  24. };
  25.  
  26. openreq.onupgradeneeded = function() {
  27. // First time setup: create an empty object store
  28. //openreq.result.createObjectStore(dbName, { keyPath: "state" });
  29. if(!openreq.result.objectStoreNames.contains("US_states_cities")) {
  30. openreq.result.createObjectStore("US_states_cities", { keyPath: "state" });
  31. }
  32.  
  33. if(!openreq.result.objectStoreNames.contains("MX_states_cities")) {
  34. openreq.result.createObjectStore("MX_states_cities", { keyPath: "state" });
  35. }
  36. };
  37.  
  38. openreq.onsuccess = function() {
  39. resolve(openreq.result);
  40. };
  41. });
  42. }
  43. return db;
  44. }
  45.  
  46. function withStore(storeName, type, callback) {
  47. return getDB().then(function(db) {
  48. return new Promise(function(resolve, reject) {
  49. var transaction = db.transaction(storeName, type);
  50. transaction.oncomplete = function() {
  51. resolve();
  52. };
  53. transaction.onerror = function() {
  54. reject(transaction.error);
  55. };
  56. callback(transaction.objectStore(storeName));
  57. });
  58. });
  59. }
  60.  
  61. var idbKeyval = {
  62. get: function(storeName, key) {
  63. var req;
  64. return withStore(storeName, 'readonly', function(store) {
  65. req = store.get(key);
  66. }).then(function() {
  67. return req.result;
  68. });
  69. },
  70. set: function(storeName, value) {
  71. return withStore(storeName, 'readwrite', function(store) {
  72. store.put(value);
  73. });
  74. },
  75. delete: function(storeName, key) {
  76. return withStore(storeName, 'readwrite', function(store) {
  77. store.delete(key);
  78. });
  79. },
  80. clear: function(storeName) {
  81. return withStore(storeName, 'readwrite', function(store) {
  82. store.clear();
  83. });
  84. },
  85. keys: function(storeName) {
  86. var keys = [];
  87. return withStore(storeName, 'readonly', function(store) {
  88. // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.
  89. // And openKeyCursor isn't supported by Safari.
  90. (store.openKeyCursor || store.openCursor).call(store).onsuccess = function() {
  91. if (!this.result) return;
  92. keys.push(this.result.key);
  93. this.result.continue();
  94. };
  95. }).then(function() {
  96. return keys;
  97. });
  98. }
  99. };
  100.  
  101. if (typeof module != 'undefined' && module.exports) {
  102. module.exports = idbKeyval;
  103. } else if (typeof define === 'function' && define.amd) {
  104. define('idbKeyval', [], function() {
  105. return idbKeyval;
  106. });
  107. } else {
  108. self.idbKeyval = idbKeyval;
  109. }
  110. }());