libsql-wasi 0.1.0

WASI support for libSQL
Documentation
use libsql_wasi::{instantiate, new_linker, Error, Result};

fn main() -> Result<()> {
    tracing_subscriber::fmt::try_init().ok();

    let engine = wasmtime::Engine::default();
    let linker = new_linker(&engine)?;
    let (mut store, instance) = instantiate(&linker, "../../libsql.wasm")?;

    let malloc = instance.get_typed_func::<i32, i32>(&mut store, "malloc")?;
    let free = instance.get_typed_func::<i32, ()>(&mut store, "free")?;

    let memory = instance
        .get_memory(&mut store, "memory")
        .ok_or_else(|| Error::RuntimeError("no memory found"))?;

    let db_path = malloc.call(&mut store, 16)?;
    memory.write(&mut store, db_path as usize, b"/tmp/wasm-demo.db\0")?;

    let libsql_wasi_init = instance.get_typed_func::<(), ()>(&mut store, "libsql_wasi_init")?;
    let open_func = instance.get_typed_func::<i32, i32>(&mut store, "libsql_wasi_open_db")?;
    let exec_func = instance.get_typed_func::<(i32, i32), i32>(&mut store, "libsql_wasi_exec")?;
    let close_func = instance.get_typed_func::<i32, i32>(&mut store, "sqlite3_close")?;

    libsql_wasi_init.call(&mut store, ())?;
    let db = open_func.call(&mut store, db_path)?;

    let sql = malloc.call(&mut store, 64)?;
    memory.write(&mut store, sql as usize, b"PRAGMA journal_mode=WAL;\0")?;
    let rc = exec_func.call(&mut store, (db, sql))?;
    free.call(&mut store, sql)?;
    if rc != 0 {
        return Err(Error::RuntimeError("Failed to execute SQL"));
    }

    let sql = malloc.call(&mut store, 64)?;
    memory.write(
        &mut store,
        sql as usize,
        b"CREATE TABLE testme(id, v1, v2);\0",
    )?;
    let rc = exec_func.call(&mut store, (db, sql))?;
    free.call(&mut store, sql)?;

    let _ = close_func.call(&mut store, db)?;
    free.call(&mut store, db_path)?;

    println!("rc: {rc}");

    Ok(())
}