Skip to content

Instantly share code, notes, and snippets.

@Comamoca
Created October 31, 2025 05:34
Show Gist options
  • Save Comamoca/25a6df365f9bad03507a3c32e086f612 to your computer and use it in GitHub Desktop.
Save Comamoca/25a6df365f9bad03507a3c32e086f612 to your computer and use it in GitHub Desktop.
Sqlight JavaScript Target Fixes - Node.js/Deno compatibility

Sqlight JavaScript Target Fixes

概要

SQLightのJavaScriptターゲット(Node.js v22.5+ / Deno v2.2+)での動作を修正しました。

変更内容

1. src/sqlight_ffi.mjs - BLOB処理の修正

変更箇所: coerce_blob 関数

問題:

  • DenoでBufferが利用できない場合の対応が不足していた

修正:

export function coerce_blob(value) {
  // Convert BitArray to Uint8Array/Buffer for Node.js/Deno sqlite
  if (value instanceof BitArray) {
    // For Deno, Buffer may not be available, use Uint8Array
    if (typeof Buffer !== 'undefined') {
      return Buffer.from(value.rawBuffer);
    } else {
      // Deno: return Uint8Array directly
      return value.rawBuffer;
    }
  }
  return value;
}

理由:

  • Denoのnode:sqlite互換APIでもBufferは利用可能だが、フォールバックとしてUint8Arrayを直接返す処理を追加
  • Node.jsとDenoの両方で安全に動作するようにした

2. test/sqlight_test.gleam - パラメータバインディングの修正

変更箇所: bind_blob_test 関数

問題:

  • Denoのnode:sqlite互換レイヤーは?1という名前付きパラメータ記法をサポートしていない
  • "column index out of range" エラーが発生

修正前:

pub fn bind_blob_test() {
  use conn <- connect()
  let assert Ok([#(<<123, 0>>, "blob")]) =
    sqlight.query("select ?1, typeof(?1)", conn, [sqlight.blob(<<123, 0>>)], {
      use ary <- decode.field(0, decode.bit_array)
      use str <- decode.field(1, decode.string)
      decode.success(#(ary, str))
    })
}

修正後:

pub fn bind_blob_test() {
  use conn <- connect()
  let assert Ok([#(blob_data, type_str)]) =
    sqlight.query("select ?, typeof(?)", conn, [sqlight.blob(<<123, 0>>), sqlight.blob(<<123, 0>>)], {
      use ary <- decode.field(0, decode.bit_array)
      use str <- decode.field(1, decode.string)
      decode.success(#(ary, str))
    })
  should.equal(blob_data, <<123, 0>>)
  should.equal(type_str, "blob")
}

理由:

  • ?1から?に変更し、各パラメータを個別に渡すように修正
  • Deno/Node.jsの両方で動作する標準的なパラメータバインディング記法を使用

テスト結果

Deno (v2.2+)

gleam test --target javascript --runtime deno

✅ 20 tests, 0 failures

Node.js (v22.5+)

gleam test --target javascript --runtime node

✅ 20 tests, 0 failures

既知の問題

Erlangターゲット

Erlangターゲットではesqlite3のNIFライブラリ(esqlite3_nif.so)が必要です。

エラー:

Failed to load NIF library: '/path/to/build/dev/erlang/esqlite/priv/esqlite3_nif.so:
cannot open shared object file: No such file or directory'

回避策:

  1. JavaScriptターゲットを使用する(推奨)
  2. NIFを手動でビルドする:
    cd build/dev/erlang/esqlite
    make compile

ただし、Gleamのビルドプロセスがクリーンすると再度ビルドが必要になる場合があります。

動作環境

  • Node.js: v22.5.0以降(node:sqliteが実験的機能として利用可能)
  • Deno: v2.2.0以降(node:sqlite互換APIが利用可能)
  • Gleam: 0.32.0以降

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment