mirror of
https://github.com/launchbadge/sqlx.git
synced 2026-04-08 19:25:50 +00:00
feat: add sqlx::Done and return from Executor::execute()
+ Done::rows_affected() + Done::last_insert_id()
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
32
sqlx-core/src/sqlite/done.rs
Normal file
32
sqlx-core/src/sqlite/done.rs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user