-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Design async version of traits #53
Labels
help wanted
Extra attention is needed
Comments
For reference, the current traits are: /// Represents database driver that can be shared between threads, and can therefore implement
/// a connection pool
pub trait Driver: Sync + Send {
/// Create a connection to the database. Note that connections are intended to be used
/// in a single thread since most database connections are not thread-safe
fn connect(&self, url: &str) -> Result<Box<dyn Connection>>;
}
/// Represents a connection to a database
pub trait Connection {
/// Create a statement for execution
fn create(&mut self, sql: &str) -> Result<Box<dyn Statement + '_>>;
/// Create a prepared statement for execution
fn prepare(&mut self, sql: &str) -> Result<Box<dyn Statement + '_>>;
}
/// Represents an executable statement
pub trait Statement {
/// Execute a query that is expected to return a result set, such as a `SELECT` statement
fn execute_query(&mut self, params: &[Value]) -> Result<Box<dyn ResultSet + '_>>;
/// Execute a query that is expected to update some rows.
fn execute_update(&mut self, params: &[Value]) -> Result<u64>;
}
/// Result set from executing a query against a statement
pub trait ResultSet {
/// get meta data about this result set
fn meta_data(&self) -> Result<Box<dyn ResultSetMetaData>>;
/// Move the cursor to the next available row if one exists and return true if it does
fn next(&mut self) -> bool;
fn get_i8(&self, i: u64) -> Result<Option<i8>>;
fn get_i16(&self, i: u64) -> Result<Option<i16>>;
fn get_i32(&self, i: u64) -> Result<Option<i32>>;
fn get_i64(&self, i: u64) -> Result<Option<i64>>;
fn get_f32(&self, i: u64) -> Result<Option<f32>>;
fn get_f64(&self, i: u64) -> Result<Option<f64>>;
fn get_string(&self, i: u64) -> Result<Option<String>>;
fn get_bytes(&self, i: u64) -> Result<Option<Vec<u8>>>;
}
/// Meta data for result set
pub trait ResultSetMetaData {
fn num_columns(&self) -> u64;
fn column_name(&self, i: u64) -> String;
fn column_type(&self, i: u64) -> DataType;
} |
The fn get_string(&self, i: u64) -> Result<Option<String>>;
fn get_bytes(&self, i: u64) -> Result<Option<Vec<u8>>>; Shouldn't these be fn get_string(&self, i: u64) -> Result<Option<&str>>;
fn get_bytes(&self, i: u64) -> Result<Option<&[u8]>>; The user can always get its owned version if needed. |
I wrote an experimental version of an feature gated async API here: https://github.com/sd2k/rdbc-sync-async-apis. Perhaps it would serve as a starting point for something more polished! |
Also the |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The initial PoC of RDBC was pretty naive and copied from ODBC/JDBC and is not idiomatic Rust code. This issue has been created to discuss how to create an idiomatic Rust set of traits using async for the project.
Specific issues with the current traits:
get_i32()
The text was updated successfully, but these errors were encountered: