✨
LiteVFS入門
LiteVFSはSQLiteのVFS拡張機能を使ってバックエンドをLiteFS Cloudにする実験的なソースコード
LiteFSだけではカバーできない環境に対応するために検証しているらしい
Fuseを使ったLiteFSのVFS版
LiteVFSはRustで書かれているので、システムに応じた拡張バイナリをビルドする
git clone https://github.com/superfly/litevfs.git
cd litevfs
cargo build --release
当方macOSなのでtarget/release/liblitevfs.dylib
がバイナリになる
LiteFSのトークンが必要なので https://fly.io/dashboard/ > LiteFS Cloud から作って環境変数に入れる
export LITEFS_CLOUD_TOKEN=XXX
クラスタ内にexample.sqlite
というDBを追加した
Node.jsとbetter-sqlite3で読み書きしてみる
import sqlite from "better-sqlite3";
const extDb = new sqlite(":memory:");
extDb.loadExtension(
"target/release/liblitevfs.dylib",
"sqlite3_litevfs_init_default_vfs"
);
extDb.close();
最初に先程ビルドした拡張の読み込みが必要になる。このインスタンスは使い回せないのですぐ閉じる
以下のようなtableを定義してダッシュボードからimportしてスキーマを更新した
/**
CREATE TABLE example (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT
)
*/
const db = new sqlite("example.sqlite");
console.log("read test:");
const result = db
.prepare("select * from example order by id desc limit 1")
.all();
console.log(result);
console.log("write test:");
db.pragma("litevfs_acquire_lease");
const randomString = Math.random().toString(36).substring(7);
const ret = db
.prepare("INSERT INTO example (data) VALUES (?)")
.run(randomString);
console.log(ret);
db.pragma("litevfs_release_lease");
実行する度にデータが増えていることが分かる
❯ node main.mjs
read test:
[ { id: 14, data: 'njq0h' } ]
write test:
{ changes: 1, lastInsertRowid: 15 }
db.pragma("litevfs_acquire_lease")
とdb.pragma("litevfs_release_lease")
を書込みの前後に実行しないと動作しない
実体はクラウドにHTTPでアクセスしにいっているのでrm example.sqlite
してもデータは読み書きできる
以上を理解すると内部のソースコードを読める
LiteVFSはWasmでビルドしてブラウザ上で動かすことも想定している
ブラウザ上で動かすということはEdgeランタイム向けにもなっている
素朴に実行する全操作がHTTP越しになるので遅い。中の人によるとキャッシュ機構があるらしい
Discussion