tndrle / node-sqlite3-wasm

WebAssembly port of SQLite3 for Node.js with file system access
MIT License
56 stars 8 forks source link

Compatible with kysely #77

Open ci010 opened 5 days ago

ci010 commented 5 days ago

Current interface is pretty similar to better-sqlite3. So I think it can be easy to work with kysely.

Regardless the statement.finalize call, in kysely, the only thing does not fit is the reader property on Statement, which is used to determine if it's a read operation or write:

  executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {
    const { sql, parameters } = compiledQuery
    const stmt = this.#db.prepare(sql)

    if (stmt.reader) {
      return Promise.resolve({
        rows: stmt.all(parameters) as O[],
      })
    } else {
      const { changes, lastInsertRowid } = stmt.run(parameters)

      const numAffectedRows =
        changes !== undefined && changes !== null ? BigInt(changes) : undefined

      return Promise.resolve({
        numUpdatedOrDeletedRows: numAffectedRows,
        numAffectedRows,
        insertId:
          lastInsertRowid !== undefined && lastInsertRowid !== null
            ? BigInt(lastInsertRowid)
            : undefined,
        rows: [],
      })
    }
  }

Possible solution

I read the better-sqlite3 code, the value is like

bool returns_data = sqlite3_column_count(handle) >= 1 || pragmaMode;

(not sure what's the pragmaMode here)

So I guess we should just add

const columns = sqlite3.column_count(this._ptr);
return columns >= 1;

to implement it.

I'm not familiar with sqlite library. If the thought above is doable, I can send PR for it.