this.mutex = new Mutex()
this.log = null
this.eof = 0
+ this.dirty = false
this.value = undefined
}
this.log = await fsPromises.open(path, 'w+')
this.eof = 0
+ this.dirty = false
this.value = undefined
this.mutex.release()
}
this.eof = (await this.log.stat()).size
+ this.dirty = false
try {
this.value = await this.find_root()
}
}
async close() {
+ this.flush()
+
await this.mutex.acquire()
assert(this.log !== null)
value === null ||
value instanceof Lazy
)
+ this.dirty = true
//if (typeof value === 'object' && value !== null)
value = [-1, 0, value]
this.value = value
}
async flush() {
- if (this.value === undefined)
+ await this.mutex.acquire()
+
+ if (this.value === undefined) {
+ await this.mutex.release()
return
+ }
//if (this.value instanceof Array) {
let [ptr, len, value] = this.value
this.value[0] = ptr + 1
this.value[1] = len - 3
+ //this.dirty = true
}
//}
+ //else if (this.dirty) {
+ // let buffer = Buffer.from(
+ // `<${JSON.stringify(this.value, null, 2)}>\n`,
+ // 'utf-8'
+ // )
+
+ // ptr = this.eof
+ // len = buffer.length
+ // assert(
+ // (await this.log.write(buffer, 0, len, ptr)).bytesWritten === len
+ // )
+ // this.eof += len
+ //}
+
+ this.dirty = false
+ this.mutex.release()
}
}
class Lazy {
constructor(file) {
this.file = file || null
+ this.dirty = false
}
has(key) {
value === null ||
value instanceof Lazy
)
+ this.dirty = true
//if (typeof value === 'object' && value !== null)
value = [-1, 0, value]
this.array[key] = value
if (file != this.file) {
assert(this.file === null)
this.file = file
+ this.dirty = true
}
- let dirty = false
for (let i = 0; i < this.length; ++i) {
let item = this.array[i]
//if (item instanceof Array) {
item[0] = ptr
item[1] = len - 1
- dirty = true
+ this.dirty = true
}
//}
}
- return dirty
+ return this.dirty
}
pack() {
+ this.dirty = false
+
let new_array = []
for (let i = 0; i < this.length; ++i) {
let item = this.array[i]
value === null ||
value instanceof Lazy
)
+ this.dirty = true
//if (typeof value === 'object' && value !== null)
value = [-1, 0, value]
this.object[key] = value
if (file != this.file) {
assert(this.file === null)
this.file = file
+ this.dirty = true
}
- let dirty = false
for (let i in this.object) {
let item = this.object[i]
//if (item instanceof Array) {
item[0] = ptr
item[1] = len
- dirty = true
+ this.dirty = true
}
//}
}
- return dirty
+ return this.dirty
}
pack() {
+ this.dirty = false
+
let new_object = {}
for (let i in this.object) {
let item = this.object[i]