ic-rusqlite 0.1.0

The project provides easy-to-use library to enable SQLite in your Internet Computer canister.
docs.rs failed to build ic-rusqlite-0.1.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: ic-rusqlite-0.4.1

ic-rusqlite

This is a convenience package to create a canister with the Sqlite support.

Prerequisites

It is assumed that you have rust, dfx.

You also need the Wasm-oriented clang installation. Once installed the clang compiler should be available from the path /opt/wasi-sdk/bin/.

If your WASI installation is in a different folder, assign it to environment variable WASI_SDK:

export WASI_SDK=/opt/wasi-sdk

Finally, install the wasi2ic tool:

cargo install wasi2ic

Developing casniter

To enable rusqlite in your canister, add the helper dependency:

cargo add ic-rusqlite

You will also need to update the dfx.json to specify path to wasm, set type to custom, and specify custom build steps to enforce compilation to the wasm32-wasip1 target. Finally, use wasi2ic to produce wasm executable on the Internet Computer.

Example:

{
  "canisters": {
    "backend": {
      "candid": "can.did",
      "package": "backend",
      "build": [
        "cargo build --release --target wasm32-wasip1",
        "wasi2ic target/wasm32-wasip1/release/backend.wasm target/wasm32-wasip1/release/backend_nowasi.wasm"
      ],
      "wasm": "target/wasm32-wasip1/release/backend_nowasi.wasm",
      "type": "custom",
      "metadata": [
        {
          "name": "candid:service"
        }
      ]
    }
  },
  "dfx": "0.28.0",
  "version": 1
}

Example use in your Rust code

Finally, use the get_connection() function to access your database:

    //...
    
    // get connection to the database
    let conn = ic_rusqlite::get_connection();

    conn.execute(
        "CREATE TABLE person (
            id    INTEGER PRIMARY KEY,
            name  TEXT NOT NULL,
            data  BLOB
        )",
        (),
    )?;

    let data: Option<Vec<u8>> = None;

    conn.execute(
        "INSERT INTO person (name, data) VALUES (?1, ?2)",
        ("Steven", &data),
    )?;

    //...

You can find a small example in the "examples/backend" folder.