Skip to content

Commit 295e369

Browse files
committed
Rewrote the whole implementation of Cursor. Made some performane changes in Transaction
1 parent 34374cd commit 295e369

File tree

3 files changed

+28
-46
lines changed

3 files changed

+28
-46
lines changed

src/driver/connection.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@ impl Connection {
7878
deferrable,
7979
);
8080

81-
Transaction::new(
82-
Arc::new(tokio::sync::RwLock::new(inner_transaction)),
83-
Default::default(),
84-
)
81+
Transaction::new(Arc::new(inner_transaction), Default::default())
8582
}
8683
}

src/driver/cursor.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use super::transaction::RustTransaction;
1818
pub struct InnerCursor {
1919
querystring: String,
2020
parameters: Vec<PythonDTO>,
21-
db_client: Arc<tokio::sync::RwLock<RustTransaction>>,
21+
db_transaction: Arc<RustTransaction>,
2222
cursor_name: String,
2323
fetch_number: usize,
2424
scroll: Option<bool>,
@@ -27,8 +27,9 @@ pub struct InnerCursor {
2727
}
2828

2929
impl InnerCursor {
30+
#[must_use]
3031
pub fn new(
31-
db_client: Arc<tokio::sync::RwLock<RustTransaction>>,
32+
db_transaction: Arc<RustTransaction>,
3233
querystring: String,
3334
parameters: Vec<PythonDTO>,
3435
cursor_name: String,
@@ -38,7 +39,7 @@ impl InnerCursor {
3839
InnerCursor {
3940
querystring,
4041
parameters,
41-
db_client,
42+
db_transaction,
4243
cursor_name,
4344
fetch_number,
4445
scroll,
@@ -54,8 +55,7 @@ impl InnerCursor {
5455
/// # Errors
5556
/// May return Err Result if cannot execute query.
5657
pub async fn inner_start(&mut self) -> RustPSQLDriverPyResult<()> {
57-
let db_client_arc = self.db_client.clone();
58-
let db_client_guard = db_client_arc.read().await;
58+
let db_transaction_arc = self.db_transaction.clone();
5959

6060
let mut vec_parameters: Vec<&(dyn ToSql + Sync)> =
6161
Vec::with_capacity(self.parameters.len());
@@ -74,7 +74,7 @@ impl InnerCursor {
7474

7575
cursor_init_query.push_str(format!(" CURSOR FOR {}", self.querystring).as_str());
7676

77-
db_client_guard
77+
db_transaction_arc
7878
.inner_execute(cursor_init_query, &self.parameters)
7979
.await?;
8080

@@ -89,16 +89,15 @@ impl InnerCursor {
8989
/// # Errors
9090
/// May return Err Result if cannot execute query.
9191
pub async fn inner_close(&mut self) -> RustPSQLDriverPyResult<()> {
92-
let db_client_arc = self.db_client.clone();
93-
let db_client_guard = db_client_arc.read().await;
92+
let db_transaction_arc = self.db_transaction.clone();
9493

9594
if self.closed {
9695
return Err(RustPSQLDriverError::DBCursorError(
9796
"Cursor is already closed".into(),
9897
));
9998
}
10099

101-
db_client_guard
100+
db_transaction_arc
102101
.inner_execute(format!("CLOSE {}", self.cursor_name), vec![])
103102
.await?;
104103

@@ -113,16 +112,15 @@ impl InnerCursor {
113112
/// # Errors
114113
/// May return Err Result if cannot execute query.
115114
pub async fn inner_execute(&self, querystring: String) -> RustPSQLDriverPyResult<Vec<Row>> {
116-
let db_client_arc = self.db_client.clone();
117-
let db_client_guard = db_client_arc.read().await;
115+
let db_transaction_arc = self.db_transaction.clone();
118116

119117
if !self.is_started {
120118
return Err(RustPSQLDriverError::DBCursorError(
121119
"Cursor is not opened, please call `start()`.".into(),
122120
));
123121
}
124122

125-
let result = db_client_guard
123+
let result = db_transaction_arc
126124
.inner_execute_raw(querystring, vec![])
127125
.await?;
128126

src/driver/transaction.rs

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -623,12 +623,13 @@ impl RustTransaction {
623623

624624
#[pyclass()]
625625
pub struct Transaction {
626-
transaction: Arc<tokio::sync::RwLock<RustTransaction>>,
626+
transaction: Arc<RustTransaction>,
627627
cursor_num: usize,
628628
}
629629

630630
impl Transaction {
631-
pub fn new(transaction: Arc<tokio::sync::RwLock<RustTransaction>>, cursor_num: usize) -> Self {
631+
#[must_use]
632+
pub fn new(transaction: Arc<RustTransaction>, cursor_num: usize) -> Self {
632633
Transaction {
633634
transaction,
634635
cursor_num,
@@ -679,8 +680,7 @@ impl Transaction {
679680
let transaction_arc2 = slf.transaction.clone();
680681
let cursor_num = slf.cursor_num;
681682
rustengine_future(py, async move {
682-
let transaction_guard = transaction_arc.read().await;
683-
transaction_guard.inner_begin().await?;
683+
transaction_arc.inner_begin().await?;
684684
Ok(Transaction {
685685
transaction: transaction_arc2,
686686
cursor_num,
@@ -703,15 +703,14 @@ impl Transaction {
703703
let cursor_num = slf.cursor_num;
704704

705705
rustengine_future(py, async move {
706-
let transaction_guard = transaction_arc.read().await;
707706
if is_no_exc {
708-
transaction_guard.inner_commit().await?;
707+
transaction_arc.inner_commit().await?;
709708
Ok(Transaction {
710709
transaction: transaction_arc2,
711710
cursor_num,
712711
})
713712
} else {
714-
transaction_guard.inner_rollback().await?;
713+
transaction_arc.inner_rollback().await?;
715714
Err(RustPSQLDriverError::PyError(py_err))
716715
}
717716
})
@@ -740,8 +739,7 @@ impl Transaction {
740739
}
741740

742741
rustengine_future(py, async move {
743-
let transaction_guard = transaction_arc.read().await;
744-
transaction_guard.inner_execute(querystring, params).await
742+
transaction_arc.inner_execute(querystring, params).await
745743
})
746744
}
747745

@@ -770,8 +768,7 @@ impl Transaction {
770768
}
771769

772770
rustengine_future(py, async move {
773-
let transaction_guard = transaction_arc.read().await;
774-
transaction_guard
771+
transaction_arc
775772
.inner_execute_many(querystring, params)
776773
.await
777774
})
@@ -800,8 +797,7 @@ impl Transaction {
800797
}
801798

802799
rustengine_future(py, async move {
803-
let transaction_guard = transaction_arc.read().await;
804-
transaction_guard.inner_fetch_row(querystring, params).await
800+
transaction_arc.inner_fetch_row(querystring, params).await
805801
})
806802
}
807803

@@ -829,8 +825,7 @@ impl Transaction {
829825
}
830826

831827
rustengine_future(py, async move {
832-
let transaction_guard = transaction_arc.read().await;
833-
let first_row = transaction_guard
828+
let first_row = transaction_arc
834829
.inner_fetch_row(querystring, params)
835830
.await?
836831
.get_inner();
@@ -878,8 +873,7 @@ impl Transaction {
878873
let transaction_arc = self.transaction.clone();
879874

880875
rustengine_future(py, async move {
881-
let transaction_guard = transaction_arc.read().await;
882-
transaction_guard.inner_pipeline(processed_queries).await
876+
transaction_arc.inner_pipeline(processed_queries).await
883877
})
884878
}
885879

@@ -891,8 +885,7 @@ impl Transaction {
891885
let transaction_arc = self.transaction.clone();
892886

893887
rustengine_future(py, async move {
894-
let transaction_guard = transaction_arc.read().await;
895-
transaction_guard.inner_begin().await?;
888+
transaction_arc.inner_begin().await?;
896889

897890
Ok(())
898891
})
@@ -906,8 +899,7 @@ impl Transaction {
906899
let transaction_arc = self.transaction.clone();
907900

908901
rustengine_future(py, async move {
909-
let transaction_guard = transaction_arc.read().await;
910-
transaction_guard.inner_commit().await?;
902+
transaction_arc.inner_commit().await?;
911903

912904
Ok(())
913905
})
@@ -936,8 +928,7 @@ impl Transaction {
936928
let transaction_arc = self.transaction.clone();
937929

938930
rustengine_future(py, async move {
939-
let transaction_guard = transaction_arc.read().await;
940-
transaction_guard.inner_savepoint(py_string).await?;
931+
transaction_arc.inner_savepoint(py_string).await?;
941932

942933
Ok(())
943934
})
@@ -951,8 +942,7 @@ impl Transaction {
951942
let transaction_arc = self.transaction.clone();
952943

953944
rustengine_future(py, async move {
954-
let transaction_guard = transaction_arc.read().await;
955-
transaction_guard.inner_rollback().await?;
945+
transaction_arc.inner_rollback().await?;
956946

957947
Ok(())
958948
})
@@ -981,8 +971,7 @@ impl Transaction {
981971
let transaction_arc = self.transaction.clone();
982972

983973
rustengine_future(py, async move {
984-
let transaction_guard = transaction_arc.read().await;
985-
transaction_guard.inner_rollback_to(py_string).await?;
974+
transaction_arc.inner_rollback_to(py_string).await?;
986975

987976
Ok(())
988977
})
@@ -1011,9 +1000,7 @@ impl Transaction {
10111000
let transaction_arc = self.transaction.clone();
10121001

10131002
rustengine_future(py, async move {
1014-
let transaction_guard = transaction_arc.read().await;
1015-
transaction_guard.inner_release_savepoint(py_string).await?;
1016-
1003+
transaction_arc.inner_release_savepoint(py_string).await?;
10171004
Ok(())
10181005
})
10191006
}

0 commit comments

Comments
 (0)