Fixed tree reset after sync, optimized sync with IndexedDB

This commit is contained in:
Magnus Åhall 2026-05-03 19:45:39 +02:00
parent 454d065baa
commit 26ca510785
5 changed files with 72 additions and 52 deletions

View file

@ -159,6 +159,7 @@ export class NodeStore {
})
}//}}}
/*
upsertNodeRecords(records) {//{{{
return new Promise((resolve, reject) => {
const t = this.db.transaction('nodes', 'readwrite')
@ -187,16 +188,10 @@ export class NodeStore {
record.modified = 0
addReq = nodeStore.put(record)
}
addReq.onsuccess = () => {
console.debug(`${op} ${record.UUID} (${record.Name})`)
}
addReq.onerror = (event) => {
console.log(`error ${op} ${record.UUID}`, event.target.error)
reject(event.target.error)
}
}
})
}//}}}
*/
getTreeNodes(parent, newLevel) {//{{{
return new Promise((resolve, reject) => {
// Parent of toplevel nodes is ROOT_NODE in indexedDB.
@ -219,7 +214,7 @@ export class NodeStore {
req.onerror = (event) => reject(event.target.error)
})
}//}}}
async search(searchfor, parent) {//{{{
search(searchfor, parent) {//{{{
return new Promise((resolve, reject) => {
const trx = this.db.transaction('nodes', 'readonly')
const nodeStore = trx.objectStore('nodes')
@ -249,43 +244,55 @@ export class NodeStore {
})
}//}}}
add(records) {//{{{
add(records, objstore) {//{{{
return new Promise((resolve, reject) => {
try {
const t = this.db.transaction('nodes', 'readwrite')
const nodeStore = t.objectStore('nodes')
t.onerror = (event) => {
console.error('transaction error', event.target.error)
reject(event.target.error)
// A nodestore can be provided in order to
// avoid creating new transactions.
let nodeStore = objstore
let t
if (nodeStore === undefined) {
t = this.db.transaction('nodes', 'readwrite')
nodeStore = t.objectStore('nodes')
t.oncomplete = (_event) => {
resolve()
}
t.onerror = (event) => {
console.error('transaction error', event.target.error)
reject(event.target.error)
}
}
// records is an object, not an array.
const promises = []
for (const recordIdx in records) {
const record = records[recordIdx]
const addReq = nodeStore.put(record.data)
const promise = new Promise((resolve, reject) => {
addReq.onsuccess = () => resolve()
addReq.onerror = (event) => {
console.error('Error!', event.target.error, record.ID)
reject(event.target.error)
}
})
promises.push(promise)
nodeStore.put(record.data)
}
Promise.all(promises).then(() => resolve())
resolve()
} catch (e) {
console.log(e)
console.error(e)
reject(e)
}
})
}//}}}
get(uuid) {//{{{
get(uuid, suppliedNodestore) {//{{{
return new Promise((resolve, reject) => {
const trx = this.db.transaction('nodes', 'readonly')
const nodeStore = trx.objectStore('nodes')
// A nodestore can be provided in order to
// avoid creating new transactions.
let trx
let nodeStore = suppliedNodestore
if (nodeStore === undefined) {
trx = this.db.transaction('nodes', 'readonly')
nodeStore = trx.objectStore('nodes')
}
const getRequest = nodeStore.get(uuid)
getRequest.onsuccess = (event) => {
// Node not found in IndexedDB.
if (event.target.result === undefined) {
@ -328,6 +335,9 @@ export class NodeStore {
})
}//}}}
newTransaction(objectStore, mode) {// {{{
return this.db.transaction(objectStore, mode)
}// }}}
nodeCount() {//{{{
return new Promise((resolve, reject) => {