pub struct SqliteProjectionStore { /* private fields */ }Expand description
SQLite-backed projection store
Uses separate connections for reads and writes. SQLite WAL mode allows readers and writers to operate concurrently at the database level. While each connection still needs mutex protection (rusqlite::Connection is not Sync), using separate connections means reads don’t block writes and vice versa.
Optionally supports a read connection pool for higher concurrency.
Implementations§
Source§impl SqliteProjectionStore
impl SqliteProjectionStore
Sourcepub fn conn(&self) -> &Arc<Mutex<Connection>>
pub fn conn(&self) -> &Arc<Mutex<Connection>>
Get the underlying write connection (for migrations and custom queries)
Returns an Arc to the Mutex-protected SQLite connection. Users should lock the mutex to access the connection.
Sourcepub async fn query_async<F, R>(&self, f: F) -> Result<R>
pub async fn query_async<F, R>(&self, f: F) -> Result<R>
Execute a read-only SQL query asynchronously
This method runs the query on a separate thread to avoid blocking, making it safe to call from async contexts. Uses a read-only connection that doesn’t block writes.
§Example
let balance: i64 = store.query_async(|conn| {
conn.query_row("SELECT balance FROM accounts WHERE id = ?1", [account_id], |row| row.get(0))
}).await?;Sourcepub fn query<F, R>(&self, f: F) -> Result<R>
pub fn query<F, R>(&self, f: F) -> Result<R>
Execute a read-only SQL query synchronously
This is a convenience method for non-async contexts.
For async contexts, prefer query_async. Uses a read-only connection
that doesn’t block writes.
§Example
let balance: i64 = store.query(|conn| {
conn.query_row("SELECT balance FROM accounts WHERE id = ?1", [account_id], |row| row.get(0))
})?;Sourcepub async fn execute_async<F>(&self, f: F) -> Result<()>
pub async fn execute_async<F>(&self, f: F) -> Result<()>
Execute arbitrary SQL statements (DDL/DML) asynchronously
Useful for creating tables, indexes, or performing bulk updates. Uses the write connection.
§Example
store.execute_async(|conn| {
conn.execute("CREATE TABLE IF NOT EXISTS balances (id INTEGER PRIMARY KEY, amount INTEGER)", [])?;
conn.execute("CREATE INDEX IF NOT EXISTS idx_amount ON balances(amount)", [])?;
Ok(())
}).await?;Sourcepub fn transaction<F>(&self, f: F) -> Result<()>
pub fn transaction<F>(&self, f: F) -> Result<()>
Execute a transaction with multiple SQL statements
The closure receives a transaction object and can execute multiple statements atomically. If the closure returns an error, the transaction is rolled back. Uses the write connection.
§Example
store.transaction(|tx| {
tx.execute("INSERT INTO accounts (id, balance) VALUES (?1, ?2)", params![1, 100])?;
tx.execute("INSERT INTO accounts (id, balance) VALUES (?1, ?2)", params![2, 200])?;
Ok(())
})?;Sourcepub async fn transaction_async<F>(&self, f: F) -> Result<()>
pub async fn transaction_async<F>(&self, f: F) -> Result<()>
Execute a transaction asynchronously
Uses the write connection.
Sourcepub fn read_pool(&self) -> Option<&Arc<SqliteReadPool>>
pub fn read_pool(&self) -> Option<&Arc<SqliteReadPool>>
Get reference to the read pool (if enabled)
Returns None if read pooling was not enabled in config.
Sourcepub fn has_read_pool(&self) -> bool
pub fn has_read_pool(&self) -> bool
Check if read pooling is enabled