From 48a26223c0492fff57ddaf0763739b90addd45f8 Mon Sep 17 00:00:00 2001 From: Anton Nesterov Date: Mon, 26 Aug 2024 22:51:43 +0200 Subject: [PATCH] [fix] #1 js bindings Signed-off-by: Anton Nesterov --- dal/Binding.ts | 6 +++++- dal/CBuilder.ts | 27 +++++++++++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/dal/Binding.ts b/dal/Binding.ts index 0ad407e..45fe8ba 100644 --- a/dal/Binding.ts +++ b/dal/Binding.ts @@ -1,7 +1,11 @@ import { createRequire } from "node:module"; const require = createRequire(import.meta.url); +type RowIterator = { + next: () => Buffer; + free: () => void; +}; type SQLite = { InitSQLite: (pragmas: Buffer) => void; - Handle: (input: Buffer) => Buffer; + RowIterator: (input: Buffer) => RowIterator; }; export default require("../build/Release/dal.node") as SQLite; diff --git a/dal/CBuilder.ts b/dal/CBuilder.ts index 71f1e3f..0a872dd 100644 --- a/dal/CBuilder.ts +++ b/dal/CBuilder.ts @@ -18,20 +18,26 @@ export default class CBuilder< super({ database: opts.database, url: "" }); } /** - * Not really an iterator, since addonn allocates memory for all rows - * but returns an iterator + * TODO: handle responses */ async *Rows>(): AsyncGenerator { this.formatRequest(); const req = Buffer.from(encodeRequest(this.request)); - const response = Binding.Handle(req); - const rows = decodeRows(response); - for (const row of rows) { - if (this.headerRow === null) { - this.headerRow = row.r; - continue; + const iter = Binding.RowIterator(req); + for (;;) { + const response = iter.next(); + const rows = decodeRows(response); + if (rows.length === 0) { + iter.free(); + break; + } + for (const row of rows) { + if (this.headerRow === null) { + this.headerRow = row.r; + continue; + } + yield this.formatRow(row.r); } - yield this.formatRow(row.r); } } async Query>(): Promise { @@ -45,7 +51,8 @@ export default class CBuilder< async Exec(): Promise { this.formatRequest(); const req = Buffer.from(encodeRequest(this.request)); - const response = Binding.Handle(req); + const iter = Binding.RowIterator(req); + const response = iter.next(); return decodeResponse(response); } }