1const dbName = "StIndexedDB"; // Name der Datenbank 2const storeName = "content"; // Name des ObjectStores 3const versNr = 9; 4 5//const request = indexedDB.open(dbName, 1); 6//openDB(); 7 8//insertOrUpdateRecord('123', 'content 123', 10); 9 10//openDB(); 11 12//indexedDB.deleteDatabase(dbName); 13//location.reload(); // Seite neu laden 14 15 16function openDB() { 17 18 return new Promise((resolve, reject) => { 19 const request = indexedDB.open(dbName, versNr); 20 request.onupgradeneeded = function(event) { 21 22 const db = event.target.result; 23 24 if (!db.objectStoreNames.contains(storeName)) { 25 let objectStore = db.createObjectStore(storeName, { keyPath: "id" }); 26 // Erstelle Indizes für andere Felder 27 objectStore.createIndex("content", "content", { unique: false }); 28 objectStore.createIndex("kundenaction_id", "kundenaction_id", { unique: false }); 29 objectStore.createIndex("url", "url", { unique: false }); 30 objectStore.createIndex("steuerjahr", "steuerjahr", { unique: false }); 31 objectStore.createIndex("ablaufdatum", "ablaufdatum", { unique: false }); 32 objectStore.createIndex("control", "control", { unique: false }); 33 } 34 }; 35 36 //request.onsuccess = (event) => resolve(event.target.result); 37 //request.onerror = (event) => reject(event.target.error); 38 request.onsuccess = function(event) { 39 //alert("OK:" + event.target.result); 40 resolve(event.target.result); 41 }; 42 request.onerror = function(event) { 43 //alert("Fehler:" + event.target.error); 44 reject(event.target.error); 45 }; 46 request.onblocked = function() { 47 //alert("â ï¸ Das Upgrade ist blockiert. SchlieÃe alle anderen Tabs."); 48 }; 49 50 }); 51} 52 53async function insertOrUpdateRecord(id, content, aktiv_minuten = 0, control = null) { 54 const db = await openDB(); 55 return new Promise((resolve, reject) => { 56 // Starte eine Transaktion im Read-Write-Modus 57 const transaction = db.transaction(storeName, "readwrite"); 58 const store = transaction.objectStore(storeName); 59 60 const currentDate = new Date(); 61 currentDate.setMinutes(currentDate.getMinutes() + aktiv_minuten); // 3 Minuten hinzufügen 62 63 const data = { 64 id: id, 65 content: content, 66 ablaufdatum: currentDate, 67 control: control 68 }; 69 70 const request = store.put(data); // `put` fügt ein oder überschreibt 71 72 request.onsuccess = () => resolve("Daten erfolgreich gespeichert!"); 73 request.onerror = () => reject("Fehler beim Einfügen der Daten"); 74 }); 75} 76 77async function IndexedDB_getRecord(url, aktiv_minuten = 0, update_el = null) { 78 let id = url.replace(/\//g, '::'); 79 80 const db = await openDB(); 81 return new Promise((resolve, reject) => { 82 // Starte eine Transaktion im Read-Write-Modus 83 const transaction = db.transaction(storeName, "readwrite"); 84 const store = transaction.objectStore(storeName); 85 86 const getRequest = store.get(id); // Hole den Datensatz mit der ID 87 88 getRequest.onsuccess = function() { 89 const record = getRequest.result; 90 var content; 91 92 if (record) { 93 const currentDate = new Date(); 94 const expirationDate = new Date(record.ablaufdatum); 95 if ((expirationDate > currentDate && aktiv_minuten > 0) || aktiv_minuten == 0) { 96 // Wenn das Ablaufdatum nicht abgelaufen ist ODER kein Ablaufdatum gestetzt ist 97 content = record.content; 98 99 // Update im Frontend 100 if(update_el){ 101 jQuery(update_el).html(content); 102 }else{ 103 (new Function(content))(); 104 } 105 } else { 106 // Der Datensatz ist abgelaufen. 107 content = null; 108 } 109 } else { 110 // Datensatz mit der ID nicht gefunden. 111 content = null; 112 } 113 114 115 116 if(content == null || aktiv_minuten == 0){ 117 //leer wird gesetzt 118 119 jQuery.ajax({ 120 url: url, 121 type: 'POST', 122 dataType: 'json', 123 cache: false, timeout: 60000, 124 success: function(response){ 125 if (response.script) { 126 content = response.script; 127 }else if(response){ 128 content = response; 129 } 130 131 if (content != null) { 132 // Save in IndexedDB
133 insertOrUpdateRecord(id, content, aktiv_minuten); 134 135 // Update im Frontend 136 if(update_el){ 137 jQuery(update_el).html(content); 138 }else{ 139 (new Function(content))(); 140 } 141 } 142 }, 143 error: function(obj, strError){ 144 log_jquery_ajax_errors(this.url, url.replace('/', '::'), strError); 145 } 146 }); 147 } 148 149 }; 150 151 152 }); 153} 154 155const IndexedDB_deleteDatabase = () => { 156 const request = indexedDB.deleteDatabase(dbName); 157 158 request.onsuccess = () => { 159 console.log(`Database '${dbName}' deleted successfully`); 160 }; 161 162 request.onerror = (event) => { 163 console.error(`Error deleting database '${dbName}':`, event.target.error); 164 }; 165 166 request.onblocked = () => { 167 console.warn(`Database deletion is blocked. Close all connections and try again.`); 168 }; 169}; 170 171async function deleteAllIndexedDBs() { 172 if (!window.indexedDB.databases) { 173 console.warn("Diese Funktion wird in deinem Browser möglicherweise nicht unterstützt."); 174 return; 175 } 176 177 const databases = await window.indexedDB.databases(); 178 for (const db of databases) { 179 if (db.name) { 180 console.log(`Lösche Datenbank: ${db.name}`); 181 indexedDB.deleteDatabase(db.name); 182 } 183 } 184}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.