@cortexkit/pi-magic-context 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -168,6 +168,12 @@ function trackSqliteConnection(db, filename, options) {
168
168
  ...metadata,
169
169
  reference: new WeakRef(db)
170
170
  });
171
+ const prepare = db.prepare.bind(db);
172
+ Object.defineProperty(db, "prepare", {
173
+ configurable: true,
174
+ writable: true,
175
+ value: (sql) => ownPreparedStatement(db, prepare(sql))
176
+ });
171
177
  return db;
172
178
  }
173
179
  var TrackedDatabase = new Proxy(DatabaseImpl, {
@@ -213,6 +219,54 @@ function pragmaNumber(db, name) {
213
219
  return null;
214
220
  }
215
221
  }
222
+ var statementOwners = new WeakMap;
223
+ var FIRST_PRUNE_AT = 256;
224
+ function ownPreparedStatement(db, statement) {
225
+ const finalizable = statement;
226
+ if (typeof finalizable.finalize !== "function")
227
+ return statement;
228
+ let owner = statementOwners.get(db);
229
+ if (!owner) {
230
+ const references = new Set;
231
+ owner = { references, registered: new WeakSet, pruneAt: FIRST_PRUNE_AT };
232
+ statementOwners.set(db, owner);
233
+ const close = db.close.bind(db);
234
+ Object.defineProperty(db, "close", {
235
+ configurable: true,
236
+ writable: true,
237
+ value: (...args) => {
238
+ let failure;
239
+ for (const reference of references) {
240
+ try {
241
+ reference.deref()?.finalize();
242
+ } catch (error) {
243
+ failure ??= error;
244
+ }
245
+ }
246
+ references.clear();
247
+ const result = close(...args);
248
+ if (failure)
249
+ throw failure;
250
+ return result;
251
+ }
252
+ });
253
+ }
254
+ if (!owner.registered.has(finalizable)) {
255
+ if (owner.references.size >= owner.pruneAt) {
256
+ for (const reference of owner.references) {
257
+ if (reference.deref() === undefined)
258
+ owner.references.delete(reference);
259
+ }
260
+ owner.pruneAt = Math.max(FIRST_PRUNE_AT, owner.references.size * 2);
261
+ }
262
+ owner.references.add(new WeakRef(finalizable));
263
+ owner.registered.add(finalizable);
264
+ }
265
+ return statement;
266
+ }
267
+ function prepareCachedStatement(db, sql) {
268
+ return ownPreparedStatement(db, db.prepare(sql));
269
+ }
216
270
  var privilegeDepth = new WeakMap;
217
271
  var transformPassScope = new AsyncLocalStorage;
218
272
  var admissionScope = new AsyncLocalStorage;
@@ -407,4 +461,4 @@ function withPrivilegedWriter(db, operation) {
407
461
  }
408
462
  }
409
463
 
410
- export { registerSlowWriteReporter, registerSqliteDiagnosticSink, detectSqliteRuntime, Database, withSqliteBackgroundWriter, withSqliteTransformPass, withoutSqliteTransformPass, isTransientSqliteError, withPrivilegedWriter };
464
+ export { registerSlowWriteReporter, registerSqliteDiagnosticSink, detectSqliteRuntime, Database, prepareCachedStatement, withSqliteBackgroundWriter, withSqliteTransformPass, withoutSqliteTransformPass, isTransientSqliteError, withPrivilegedWriter };