Skip to content

Commit 846ffac

Browse files
Transaction working with pure rust again
Transaction configuration working with pure rust client
1 parent d97ba6b commit 846ffac

File tree

8 files changed

+48
-23
lines changed

8 files changed

+48
-23
lines changed

rsfbclient-core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ mod transaction;
1212

1313
pub use charset::Charset;
1414
pub use connection::*;
15-
pub use transaction::*;
1615
pub use error::FbError;
1716
pub use params::*;
1817
pub use row::*;
18+
pub use transaction::*;
1919

2020
#[derive(Debug, Clone)]
2121
/// Sql parameter / column data

rsfbclient-core/src/transaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub enum TrLockResolution {
4949
/// In the WAIT model, transaction will wait till the other transaction has finished.
5050
///
5151
/// If a TIMEOUT is specified for the WAIT transaction, waiting will continue only for the number of seconds specified
52-
Wait(Option<u32>)
52+
Wait(Option<u32>),
5353
}
5454

5555
impl Default for TrLockResolution {

rsfbclient-native/src/connection.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,12 @@ impl<T: LinkageMarker> FirebirdClientSqlOps for NativeFbClient<T> {
203203
let mut handle = 0;
204204

205205
// Transaction parameter buffer
206-
let mut tpb = vec![ibase::isc_tpb_version3 as u8, confs.isolation.into(), confs.data_access as u8, confs.lock_resolution.into()];
206+
let mut tpb = vec![
207+
ibase::isc_tpb_version3 as u8,
208+
confs.isolation.into(),
209+
confs.data_access as u8,
210+
confs.lock_resolution.into(),
211+
];
207212
if let TrLockResolution::Wait(Some(time)) = confs.lock_resolution {
208213
tpb.push(ibase::isc_tpb_lock_timeout as u8);
209214
tpb.push(4 as u8);

rsfbclient-rust/src/client.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ use crate::{
1616
wire::*,
1717
xsqlda::{parse_xsqlda, xsqlda_to_blr, PrepareInfo, XSqlVar, XSQLDA_DESCRIBE_VARS},
1818
};
19-
use rsfbclient_core::{
20-
ibase, Charset, Column, Dialect, FbError, FirebirdClientDbOps, FirebirdClientSqlOps,
21-
FreeStmtOp, SqlType, StmtType, TrIsolationLevel, TrOp,
22-
};
19+
use rsfbclient_core::*;
2320

2421
type RustDbHandle = DbHandle;
2522
type RustTrHandle = TrHandle;
@@ -170,11 +167,11 @@ impl FirebirdClientSqlOps for RustFbClient {
170167
fn begin_transaction(
171168
&mut self,
172169
db_handle: &mut Self::DbHandle,
173-
isolation_level: TrIsolationLevel,
170+
confs: TransactionConfiguration,
174171
) -> Result<Self::TrHandle, FbError> {
175172
self.conn
176173
.as_mut()
177-
.map(|conn| conn.begin_transaction(db_handle, isolation_level))
174+
.map(|conn| conn.begin_transaction(db_handle, confs))
178175
.unwrap_or_else(err_client_not_connected)
179176
}
180177

@@ -445,9 +442,23 @@ impl FirebirdWireConnection {
445442
pub fn begin_transaction(
446443
&mut self,
447444
db_handle: &mut DbHandle,
448-
isolation_level: TrIsolationLevel,
445+
confs: TransactionConfiguration,
449446
) -> Result<TrHandle, FbError> {
450-
let tpb = [ibase::isc_tpb_version3 as u8, isolation_level as u8];
447+
let mut tpb = vec![
448+
ibase::isc_tpb_version3 as u8,
449+
confs.isolation.into(),
450+
confs.data_access as u8,
451+
confs.lock_resolution.into(),
452+
];
453+
if let TrLockResolution::Wait(Some(time)) = confs.lock_resolution {
454+
tpb.push(ibase::isc_tpb_lock_timeout as u8);
455+
tpb.push(4 as u8);
456+
tpb.extend_from_slice(&time.to_le_bytes());
457+
}
458+
459+
if let TrIsolationLevel::ReadCommited(rec) = confs.isolation {
460+
tpb.push(rec as u8);
461+
}
451462

452463
self.socket.write_all(&transaction(db_handle.0, &tpb))?;
453464
self.socket.flush()?;
@@ -1021,7 +1032,7 @@ fn connection_test() {
10211032
let mut db_handle = conn.attach_database(db_name, user, pass).unwrap();
10221033

10231034
let mut tr_handle = conn
1024-
.begin_transaction(&mut db_handle, TrIsolationLevel::Concurrency)
1035+
.begin_transaction(&mut db_handle, TransactionConfiguration::default())
10251036
.unwrap();
10261037

10271038
let (stmt_type, mut stmt_handle) = conn

src/connection/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
//!
44
//! Connection functions
55
//!
6-
use rsfbclient_core::{Dialect, FbError, FirebirdClient, FirebirdClientDbOps, FromRow, IntoParams, TransactionConfiguration};
6+
use rsfbclient_core::{
7+
Dialect, FbError, FirebirdClient, FirebirdClientDbOps, FromRow, IntoParams,
8+
TransactionConfiguration,
9+
};
710
use std::{marker, mem};
811

912
use crate::{

src/tests/transaction.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ mk_tests_default! {
119119
assert!(qr.is_err());
120120
let mut e = qr.err().unwrap().to_string();
121121
e.truncate(95);
122-
assert_eq!("sql error -913: deadlock\nread conflicts with concurrent update\nconcurrent transaction number is", e);
122+
assert!(e.contains("deadlock\nread conflicts with concurrent update\nconcurrent transaction number is"));
123123

124124
drop(transaction2);
125125
drop(transaction1);
@@ -147,7 +147,7 @@ mk_tests_default! {
147147
assert!(qr.is_err());
148148
let mut e = qr.err().unwrap().to_string();
149149
e.truncate(95);
150-
assert_eq!("sql error -913: deadlock\nread conflicts with concurrent update\nconcurrent transaction number is", e);
150+
assert!(e.contains("deadlock\nread conflicts with concurrent update\nconcurrent transaction number is"));
151151

152152
drop(transaction2);
153153
drop(transaction1);
@@ -169,7 +169,7 @@ mk_tests_default! {
169169
let qr = transaction1.execute_immediate(format!(insert_stmt_fmtstring!(), TABLE_NAME).as_str());
170170

171171
assert!(qr.is_err());
172-
assert_eq!("sql error -817: attempted update during read-only transaction", qr.err().unwrap().to_string());
172+
assert!(qr.err().unwrap().to_string().contains("attempted update during read-only transaction"));
173173

174174
drop(transaction1);
175175
teardown(conn, TABLE_NAME)
@@ -229,7 +229,7 @@ mk_tests_default! {
229229
assert!(qr.is_err());
230230
let mut e = qr.err().unwrap().to_string();
231231
e.truncate(52);
232-
assert_eq!("sql error -901: lock conflict on no wait transaction", e);
232+
assert!(e.contains("lock conflict on no wait transaction"));
233233

234234
drop(transaction2);
235235
drop(transaction1);

src/transaction/mod.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
//! Transaction functions
55
//!
66
7-
use rsfbclient_core::{FbError, FirebirdClient, FromRow, IntoParams, TransactionConfiguration, TrOp};
7+
use rsfbclient_core::{
8+
FbError, FirebirdClient, FromRow, IntoParams, TrOp, TransactionConfiguration,
9+
};
810
use std::marker;
911
use std::mem;
1012

@@ -27,7 +29,10 @@ where
2729

2830
impl<'c, C: FirebirdClient> Transaction<'c, C> {
2931
/// Start a new transaction
30-
pub fn new(conn: &'c mut Connection<C>, confs: TransactionConfiguration) -> Result<Self, FbError> {
32+
pub fn new(
33+
conn: &'c mut Connection<C>,
34+
confs: TransactionConfiguration,
35+
) -> Result<Self, FbError> {
3136
let data = TransactionData::new(conn, confs)?;
3237

3338
Ok(Transaction { data, conn })
@@ -229,9 +234,7 @@ where
229234
{
230235
/// Start a new transaction
231236
fn new(conn: &mut Connection<C>, confs: TransactionConfiguration) -> Result<Self, FbError> {
232-
let handle = conn
233-
.cli
234-
.begin_transaction(&mut conn.handle, confs)?;
237+
let handle = conn.cli.begin_transaction(&mut conn.handle, confs)?;
235238

236239
Ok(Self { handle })
237240
}

src/transaction/simple.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ impl<'c> TryFrom<SimpleTransaction<'c>> for Transaction<'c, RustFbClient> {
9898

9999
impl<'c> SimpleTransaction<'c> {
100100
/// Start a new transaction
101-
pub fn new(conn: &'c mut SimpleConnection, confs: TransactionConfiguration) -> Result<Self, FbError> {
101+
pub fn new(
102+
conn: &'c mut SimpleConnection,
103+
confs: TransactionConfiguration,
104+
) -> Result<Self, FbError> {
102105
match &mut conn.inner {
103106
#[cfg(feature = "linking")]
104107
TypeConnectionContainer::NativeDynLink(tr) => Ok(Transaction::new(tr, confs)?.into()),

0 commit comments

Comments
 (0)