feat: add sqlx::Done and return from Executor::execute()

+ Done::rows_affected()

 + Done::last_insert_id()
This commit is contained in:
Ryan Leckey
2020-07-12 05:27:38 -07:00
parent 51aeee20da
commit 00137d4a04
33 changed files with 258 additions and 68 deletions

View File

@@ -5,6 +5,7 @@ use futures_core::future::BoxFuture;
use futures_core::stream::BoxStream;
use futures_util::{FutureExt, TryStreamExt};
use hashbrown::HashMap;
use libsqlite3_sys::sqlite3_last_insert_rowid;
use crate::common::StatementCache;
use crate::error::Error;
@@ -13,7 +14,9 @@ use crate::ext::ustr::UStr;
use crate::sqlite::connection::describe::describe;
use crate::sqlite::connection::ConnectionHandle;
use crate::sqlite::statement::{SqliteStatement, StatementHandle};
use crate::sqlite::{Sqlite, SqliteArguments, SqliteColumn, SqliteConnection, SqliteRow};
use crate::sqlite::{
Sqlite, SqliteArguments, SqliteColumn, SqliteConnection, SqliteDone, SqliteRow,
};
use crate::statement::StatementInfo;
fn prepare<'a>(
@@ -92,7 +95,7 @@ impl<'c> Executor<'c> for &'c mut SqliteConnection {
fn fetch_many<'e, 'q: 'e, E: 'q>(
self,
mut query: E,
) -> BoxStream<'e, Result<Either<u64, SqliteRow>, Error>>
) -> BoxStream<'e, Result<Either<SqliteDone, SqliteRow>, Error>>
where
'c: 'e,
E: Execute<'q, Self::Database>,
@@ -145,7 +148,16 @@ impl<'c> Executor<'c> for &'c mut SqliteConnection {
match s {
Either::Left(changes) => {
r#yield!(Either::Left(changes));
let last_insert_rowid = unsafe {
sqlite3_last_insert_rowid(conn.as_ptr())
};
let done = SqliteDone {
changes: changes,
last_insert_rowid: last_insert_rowid,
};
r#yield!(Either::Left(done));
break;
}

View File

@@ -1,6 +1,6 @@
use crate::database::{Database, HasArguments, HasStatementCache, HasValueRef};
use crate::sqlite::{
SqliteArgumentValue, SqliteArguments, SqliteColumn, SqliteConnection, SqliteRow,
SqliteArgumentValue, SqliteArguments, SqliteColumn, SqliteConnection, SqliteDone, SqliteRow,
SqliteTransactionManager, SqliteTypeInfo, SqliteValue, SqliteValueRef,
};
@@ -15,6 +15,8 @@ impl Database for Sqlite {
type Row = SqliteRow;
type Done = SqliteDone;
type Column = SqliteColumn;
type TypeInfo = SqliteTypeInfo;

View File

@@ -0,0 +1,32 @@
use crate::done::Done;
use crate::sqlite::Sqlite;
use std::iter::{Extend, IntoIterator};
#[derive(Debug, Default)]
pub struct SqliteDone {
pub(super) changes: u64,
pub(super) last_insert_rowid: i64,
}
impl SqliteDone {
pub fn last_insert_rowid(&self) -> i64 {
self.last_insert_rowid
}
}
impl Done for SqliteDone {
type Database = Sqlite;
fn rows_affected(&self) -> u64 {
self.changes
}
}
impl Extend<SqliteDone> for SqliteDone {
fn extend<T: IntoIterator<Item = SqliteDone>>(&mut self, iter: T) {
for elem in iter {
self.changes += elem.changes;
self.last_insert_rowid = elem.last_insert_rowid;
}
}
}

View File

@@ -9,6 +9,7 @@ mod arguments;
mod column;
mod connection;
mod database;
mod done;
mod error;
mod options;
mod row;
@@ -25,6 +26,7 @@ pub use arguments::{SqliteArgumentValue, SqliteArguments};
pub use column::SqliteColumn;
pub use connection::SqliteConnection;
pub use database::Sqlite;
pub use done::SqliteDone;
pub use error::SqliteError;
pub use options::{SqliteConnectOptions, SqliteJournalMode};
pub use row::SqliteRow;