Using Apache Ignite from a Rust Agent
golem-rust already exposes the host bindings for golem:rdbms/ignite2@1.5.0, so you do not need an extra crate.
Imports
use golem_rust::bindings::golem::rdbms::ignite2::{
DbConnection,
DbValue,
};Open a Connection
Ignite uses thin-client URLs like ignite://host:10800.
let conn = DbConnection::open("ignite://127.0.0.1:10800")
.map_err(|err| format!("{err:?}"))?;If the user asks for a method that returns a plain String, keep the public method signature as
String and handle host errors inside the method with expect(...) or panic!(...) rather than
changing the signature to Result<String, _>.
Query Data
Ignite placeholders use ?.
let result = conn
.query(
"SELECT ?",
vec![DbValue::DbString("hello".to_string())],
)
.map_err(|err| format!("{err:?}"))?;
let row = result.rows.first().ok_or("query returned no rows")?;
let value = row.values.first().ok_or("query returned no columns")?;
let message = match value {
DbValue::DbString(value) => value.clone(),
other => return Err(format!("unexpected Ignite value: {other:?}")),
};Execute Statements
conn.execute(
r#"CREATE TABLE IF NOT EXISTS notes (
id INT PRIMARY KEY,
body VARCHAR
) WITH "CACHE_NAME=notes""#,
vec![],
)
.map_err(|err| format!("{err:?}"))?;When creating Ignite tables through SQL, include WITH "CACHE_NAME=...".
Transactions
let tx = conn.begin_transaction().map_err(|err| format!("{err:?}"))?;
tx.execute(
"INSERT INTO notes (id, body) VALUES (?, ?)",
vec![DbValue::DbInt(1), DbValue::DbString("hello".to_string())],
)
.map_err(|err| format!("{err:?}"))?;
tx.commit().map_err(|err| format!("{err:?}"))?;If you need transactional tables, create them with ATOMICITY=TRANSACTIONAL in the table options.