You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
use rbdc::db::{Driver,MetaData,Row,Connection,ConnectOptions,Placeholder};pubstructYourDriver{}implDriverforYourDriver{}pubstructYourMetaData{}implMetaDataforYourMetaData{}pubstructYourRow{}implRowforYourRow{}pubstructYourConnection{}implConnectionforYourConnection{}pubstructYourConnectOptions{}implConnectOptionsforYourConnectOptions{}pubstructYourPlaceholder{}implPlaceholderforYourPlaceholder{}
use rbdc_sqlite::SqliteDriver;use rbdc::db::{Connection};use rbdc::Error;use rbdc::pool::ConnManager;use rbdc::pool::Pool;use rbdc_pool_fast::FastPool;#[tokio::main]asyncfnmain() -> Result<(),Error>{let pool = FastPool::new(ConnManager::new(SqliteDriver{},"sqlite://target/test.db")?)?;letmut conn = pool.get().await?;// selectlet v = conn.get_values("select * from sqlite_master",vec![]).await?;println!("{}", rbs::Value::Array(v));// update/deletelet r = conn.exec("update table set name='a' where id = 1",vec![]).await?;println!("{}", r);Ok(())}
FAQ
How should I implement a driver for databases with blocking APIs?
For database drivers with blocking APIs, follow the pattern in rbdc-sqlite using the flume channel library:
// Key components:// 1. Dedicated worker thread per connection// 2. Command channels for communicationpubstructYourConnection{worker:ConnectionWorker,}structConnectionWorker{command_tx: flume::Sender<Command>,}enumCommand{Execute{/* ... */},Query{/* ... */},}
Benefits:
Prevents blocking the async runtime
Provides thread safety
Maintains a clean async interface
Why does Connection require both Send and Sync?
Connection: Send + Sync is required because:
Thread Safety: Connections may be shared across tasks on different threads when using Tokio
Pool Implementation: Connection pools need thread-safe access to connections
When implementing for non-thread-safe databases:
// SAFETY: YourConnection is thread-safe because:// 1. Database operations run on a dedicated worker thread// 2. Communication uses thread-safe channelsunsafeimplSyncforYourConnection{}
Improper implementation can cause data races and undefined behavior.