Skip to content

Rust API Reference

The native Rust API lives in the decentdb crate.

Opening a database

use decentdb::{Db, DbConfig};

let db = Db::create("app.ddb", DbConfig::default())?;
let reopened = Db::open("app.ddb", DbConfig::default())?;
let auto = Db::open_or_create("auto.ddb", DbConfig::default())?;
# Ok::<(), decentdb::DbError>(())

Use :memory: for the in-memory VFS:

use decentdb::{Db, DbConfig};

let db = Db::open(":memory:", DbConfig::default())?;
db.execute("CREATE TABLE cache (id INT64 PRIMARY KEY, value TEXT)")?;
# Ok::<(), decentdb::DbError>(())

Executing SQL

use decentdb::{Db, DbConfig, Value};

let db = Db::open(":memory:", DbConfig::default())?;
db.execute("CREATE TABLE users (id INT64 PRIMARY KEY, name TEXT)")?;
db.execute_with_params(
    "INSERT INTO users (id, name) VALUES ($1, $2)",
    &[Value::Int64(1), Value::Text("Ada".to_string())],
)?;

let result = db.execute("SELECT id, name FROM users ORDER BY id")?;
assert_eq!(result.columns(), &["id", "name"]);
assert_eq!(result.rows().len(), 1);
# Ok::<(), decentdb::DbError>(())

Db::execute_batch and Db::execute_batch_with_params accept semicolon-delimited batches.

Explicit transactions

The Rust engine now supports explicit handle-local SQL transactions:

use decentdb::{Db, DbConfig};

let db = Db::open(":memory:", DbConfig::default())?;
db.execute("CREATE TABLE items (id INT64 PRIMARY KEY, name TEXT)")?;

db.begin_transaction()?;
db.execute("INSERT INTO items (id, name) VALUES (1, 'Ada')")?;
db.commit_transaction()?;
# Ok::<(), decentdb::DbError>(())

Available helpers: - Db::begin_transaction() - Db::commit_transaction() - Db::rollback_transaction() - Db::in_transaction()

Metadata and maintenance

The crate exposes structured inspection helpers for the CLI and higher-level bindings:

  • Db::storage_info()
  • Db::header_info()
  • Db::list_tables()
  • Db::describe_table(name)
  • Db::list_indexes()
  • Db::list_views()
  • Db::list_triggers()
  • Db::verify_index(name)
  • Db::dump_sql()

Maintenance helpers:

  • Db::checkpoint()
  • Db::bulk_load_rows(...)
  • Db::rebuild_index(name)
  • Db::rebuild_indexes()
  • Db::save_as(path)
  • decentdb::evict_shared_wal(path)

Results

Db::execute* returns QueryResult.

use decentdb::{Db, DbConfig, Value};

let db = Db::open(":memory:", DbConfig::default())?;
db.execute("CREATE TABLE users (id INT64 PRIMARY KEY, name TEXT)")?;
db.execute("INSERT INTO users (id, name) VALUES (1, 'Ada')")?;

let result = db.execute("SELECT id, name FROM users")?;
assert_eq!(result.rows()[0].values(), &[
    Value::Int64(1),
    Value::Text("Ada".to_string()),
]);
# Ok::<(), decentdb::DbError>(())

For EXPLAIN, QueryResult::explain_lines() returns the rendered plan rows.

Error handling

All fallible operations return decentdb::Result<T>, which aliases std::result::Result<T, DbError>.

DbError exposes stable numeric categories through DbError::numeric_code() for:

  • I/O failures
  • corruption
  • constraint violations
  • transaction errors
  • SQL errors
  • internal engine errors
  • panic boundaries