- Notifications
You must be signed in to change notification settings - Fork1
rbatis/rbdc
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
RBDC driver abstract
rbdc
is safe code(#![forbid(unsafe_code)]
)- an database driver abstract for
rbatis
- supported database drivers seerbatis
just only impl this traits(6)
use rbdc::db::{Driver,MetaData,Row,Connection,ConnectOptions,Placeholder};pubstructYourDriver{}implDriverforYourDriver{}pubstructYourMetaData{}implMetaDataforYourMetaData{}pubstructYourRow{}implRowforYourRow{}pubstructYourConnection{}implConnectionforYourConnection{}pubstructYourConnectOptions{}implConnectOptionsforYourConnectOptions{}pubstructYourPlaceholder{}implPlaceholderforYourPlaceholder{}
- moreexamples
- for sqlite example
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(())}
For database drivers with blocking APIs, follow the pattern inrbdc-sqlite
using theflume
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
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.
About
rbdc-drivers
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
No packages published
Contributors2
Uh oh!
There was an error while loading.Please reload this page.