Comparing version
@@ -111,5 +111,5 @@ import { SuperArray } from "../array/array.js"; | ||
binary: { | ||
encode(value: any): Uint8Array; | ||
decode(value: Uint8Array): any; | ||
encode(value: any): Uint8Array<ArrayBufferLike>; | ||
decode(value: Uint8Array<ArrayBufferLike>): any; | ||
}; | ||
}; |
@@ -51,3 +51,16 @@ import crypto from "crypto"; | ||
forEach(fn) { | ||
for (const [key, value] of this) { | ||
// We need to collect entries first to avoid database busy conflicts | ||
// when the callback function modifies the map during iteration | ||
const entries = []; | ||
const stmt = database.prepare(`SELECT * FROM ${name}`); | ||
try { | ||
for (const row of stmt.iterate()) { | ||
const typedRow = row; | ||
entries.push([typedRow.key, serializer.decode(typedRow.value)]); | ||
} | ||
} | ||
finally { | ||
// Better-sqlite3 automatically finalizes iterators | ||
} | ||
for (const [key, value] of entries) { | ||
fn(value, key, this); | ||
@@ -70,25 +83,49 @@ } | ||
}, | ||
*[Symbol.iterator]() { | ||
const res = database.prepare(`SELECT * FROM ${name}`).all(); | ||
for (const row of res) { | ||
yield [row.key, serializer.decode(row.value)]; | ||
[Symbol.iterator]: function* () { | ||
const stmt = database.prepare(`SELECT * FROM ${name}`); | ||
try { | ||
for (const row of stmt.iterate()) { | ||
const typedRow = row; | ||
yield [typedRow.key, serializer.decode(typedRow.value)]; | ||
} | ||
} | ||
finally { | ||
// Better-sqlite3 automatically finalizes iterators, but we can be explicit | ||
} | ||
}, | ||
keys: function* () { | ||
const res = database.prepare(`SELECT key FROM ${name}`).all(); | ||
for (const row of res) { | ||
yield row.key; | ||
const stmt = database.prepare(`SELECT key FROM ${name}`); | ||
try { | ||
for (const row of stmt.iterate()) { | ||
const typedRow = row; | ||
yield typedRow.key; | ||
} | ||
} | ||
finally { | ||
// Better-sqlite3 automatically finalizes iterators | ||
} | ||
}, | ||
values: function* () { | ||
const res = database.prepare(`SELECT value FROM ${name}`).all(); | ||
for (const row of res) { | ||
yield serializer.decode(row.value); | ||
const stmt = database.prepare(`SELECT value FROM ${name}`); | ||
try { | ||
for (const row of stmt.iterate()) { | ||
const typedRow = row; | ||
yield serializer.decode(typedRow.value); | ||
} | ||
} | ||
finally { | ||
// Better-sqlite3 automatically finalizes iterators | ||
} | ||
}, | ||
entries: function* () { | ||
const res = database.prepare(`SELECT * FROM ${name}`).all(); | ||
for (const row of res) { | ||
yield [row.key, serializer.decode(row.value)]; | ||
const stmt = database.prepare(`SELECT * FROM ${name}`); | ||
try { | ||
for (const row of stmt.iterate()) { | ||
const typedRow = row; | ||
yield [typedRow.key, serializer.decode(typedRow.value)]; | ||
} | ||
} | ||
finally { | ||
// Better-sqlite3 automatically finalizes iterators | ||
} | ||
}, | ||
@@ -103,9 +140,11 @@ [Symbol.toStringTag]: "BetterSqlite3 Persistent Map", | ||
var _a; | ||
const rows = database.prepare(`SELECT * FROM ${name}`).all(); | ||
const stmt = database.prepare(`SELECT * FROM ${name}`); | ||
const rows = stmt.all(); // We need all data anyway for this method | ||
const res = []; | ||
for (const row of rows) { | ||
const value = serializer.decode(row.value); | ||
const typedRow = row; | ||
const value = serializer.decode(typedRow.value); | ||
const relationValues = {}; | ||
for (const key of existingRelations) { | ||
const columnValues = row[key]; | ||
const columnValues = typedRow[key]; | ||
if (!columnValues) | ||
@@ -133,3 +172,3 @@ continue; | ||
continue; | ||
res.push({ key: row.key, value, relations: relationValues }); | ||
res.push({ key: typedRow.key, value, relations: relationValues }); | ||
} | ||
@@ -136,0 +175,0 @@ return res; |
{ | ||
"name": "sqlite-map", | ||
"version": "0.1.2", | ||
"version": "0.1.3", | ||
"description": "Simple javascript persistent map and array datastructures based on better-sqlite3", | ||
@@ -40,4 +40,9 @@ "license": "ISC", | ||
"peerDependencies": { | ||
"better-sqlite3": "^8.x.x" | ||
} | ||
"better-sqlite3": "^12.x.x" | ||
}, | ||
"pnpm": { | ||
"onlyBuiltDependencies": [ | ||
"better-sqlite3" | ||
] | ||
} | ||
} |
26898
6.63%582
7.18%