Skip to content

Commit 17c89ec

Browse files
committed
Pulled
Signed-off-by: chandr-andr (Kiselev Aleksandr) <chandr@chandr.net>
2 parents ffbedad + 2a7effb commit 17c89ec

File tree

7 files changed

+480
-609
lines changed

7 files changed

+480
-609
lines changed

python/psqlpy/__init__.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,7 @@
1-
from ._internal import (
2-
# Connection,
3-
# ConnRecyclingMethod,
4-
# Cursor,
5-
# IsolationLevel,
6-
# PSQLPool,
7-
# QueryResult,
8-
# ReadVariant,
9-
# Transaction,
10-
ConnectionPool,
11-
)
1+
from psqlpy._internal import Connection, ConnectionPool, Transaction
122

133
__all__ = [
144
"ConnectionPool",
15-
# "PSQLPool",
16-
# "QueryResult",
17-
# "Transaction",
18-
# "IsolationLevel",
19-
# "ReadVariant",
20-
# "Connection",
21-
# "Cursor",
22-
# "ConnRecyclingMethod",
5+
"Transaction",
6+
"Connection",
237
]

python/psqlpy/_internal/__init__.pyi

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,6 @@ class PSQLPool:
941941
It acquires new connection from the database pool.
942942
"""
943943

944-
945944
class ConnectionPool:
946945
"""Connection pool for executing queries.
947946
@@ -1017,9 +1016,8 @@ class ConnectionPool:
10171016
# it will be dropped on Rust side.
10181017
```
10191018
"""
1020-
10211019
async def connection(self: Self) -> Connection:
10221020
"""Create new connection.
10231021
10241022
It acquires new connection from the database pool.
1025-
"""
1023+
"""

src/common.rs

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
use pyo3::{types::PyModule, PyResult, Python};
1+
use deadpool_postgres::Object;
2+
use pyo3::{types::PyModule, PyAny, PyResult, Python};
3+
4+
use crate::{
5+
exceptions::rust_errors::RustPSQLDriverPyResult,
6+
query_result::{PSQLDriverPyQueryResult, PSQLDriverSinglePyQueryResult},
7+
value_converter::{convert_parameters, PythonDTO, QueryParameter},
8+
};
29

310
/// Add new module to the parent one.
411
///
@@ -23,3 +30,104 @@ pub fn add_module(
2330
)?;
2431
Ok(())
2532
}
33+
34+
pub trait BaseDataBaseQuery {
35+
fn psqlpy_query_one(
36+
&self,
37+
querystring: String,
38+
parameters: Option<pyo3::Py<PyAny>>,
39+
prepared: Option<bool>,
40+
) -> impl std::future::Future<Output = RustPSQLDriverPyResult<PSQLDriverSinglePyQueryResult>> + Send;
41+
42+
fn psqlpy_query(
43+
&self,
44+
querystring: String,
45+
parameters: Option<pyo3::Py<PyAny>>,
46+
prepared: Option<bool>,
47+
) -> impl std::future::Future<Output = RustPSQLDriverPyResult<PSQLDriverPyQueryResult>> + Send;
48+
49+
fn psqlpy_query_simple(
50+
&self,
51+
querystring: String,
52+
) -> impl std::future::Future<Output = RustPSQLDriverPyResult<()>> + Send;
53+
}
54+
55+
impl BaseDataBaseQuery for Object {
56+
async fn psqlpy_query_one(
57+
&self,
58+
querystring: String,
59+
parameters: Option<pyo3::Py<PyAny>>,
60+
prepared: Option<bool>,
61+
) -> RustPSQLDriverPyResult<PSQLDriverSinglePyQueryResult> {
62+
let mut params: Vec<PythonDTO> = vec![];
63+
if let Some(parameters) = parameters {
64+
params = convert_parameters(parameters)?;
65+
}
66+
let prepared = prepared.unwrap_or(true);
67+
68+
let result = if prepared {
69+
self.query_one(
70+
&self.prepare_cached(&querystring).await?,
71+
&params
72+
.iter()
73+
.map(|param| param as &QueryParameter)
74+
.collect::<Vec<&QueryParameter>>()
75+
.into_boxed_slice(),
76+
)
77+
.await?
78+
} else {
79+
self.query_one(
80+
&querystring,
81+
&params
82+
.iter()
83+
.map(|param| param as &QueryParameter)
84+
.collect::<Vec<&QueryParameter>>()
85+
.into_boxed_slice(),
86+
)
87+
.await?
88+
};
89+
90+
Ok(PSQLDriverSinglePyQueryResult::new(result))
91+
}
92+
93+
async fn psqlpy_query(
94+
&self,
95+
querystring: String,
96+
parameters: Option<pyo3::Py<PyAny>>,
97+
prepared: Option<bool>,
98+
) -> RustPSQLDriverPyResult<PSQLDriverPyQueryResult> {
99+
let mut params: Vec<PythonDTO> = vec![];
100+
if let Some(parameters) = parameters {
101+
params = convert_parameters(parameters)?;
102+
}
103+
let prepared = prepared.unwrap_or(true);
104+
105+
let result = if prepared {
106+
self.query(
107+
&self.prepare_cached(&querystring).await?,
108+
&params
109+
.iter()
110+
.map(|param| param as &QueryParameter)
111+
.collect::<Vec<&QueryParameter>>()
112+
.into_boxed_slice(),
113+
)
114+
.await?
115+
} else {
116+
self.query(
117+
&querystring,
118+
&params
119+
.iter()
120+
.map(|param| param as &QueryParameter)
121+
.collect::<Vec<&QueryParameter>>()
122+
.into_boxed_slice(),
123+
)
124+
.await?
125+
};
126+
127+
Ok(PSQLDriverPyQueryResult::new(result))
128+
}
129+
130+
async fn psqlpy_query_simple(&self, querystring: String) -> RustPSQLDriverPyResult<()> {
131+
Ok(self.batch_execute(querystring.as_str()).await?)
132+
}
133+
}

src/driver/connection.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
use deadpool_postgres::Object;
22
use pyo3::{pyclass, pymethods, Py, PyAny, Python};
3-
use std::{sync::Arc, vec};
3+
use std::{collections::HashSet, sync::Arc, vec};
44

55
use crate::{
66
exceptions::rust_errors::{RustPSQLDriverError, RustPSQLDriverPyResult},
77
query_result::{PSQLDriverPyQueryResult, PSQLDriverSinglePyQueryResult},
88
value_converter::{convert_parameters, postgres_to_py, PythonDTO, QueryParameter},
99
};
1010

11+
use super::{
12+
transaction::Transaction,
13+
transaction_options::{IsolationLevel, ReadVariant},
14+
};
15+
1116
#[pyclass]
1217
pub struct Connection {
1318
pub db_client: Arc<Object>,
@@ -34,8 +39,8 @@ impl Connection {
3439
pub async fn execute(
3540
self_: pyo3::Py<Self>,
3641
querystring: String,
37-
prepared: Option<bool>,
3842
parameters: Option<pyo3::Py<PyAny>>,
43+
prepared: Option<bool>,
3944
) -> RustPSQLDriverPyResult<PSQLDriverPyQueryResult> {
4045
let db_client = pyo3::Python::with_gil(|gil| self_.borrow(gil).db_client.clone());
4146

@@ -255,4 +260,22 @@ impl Connection {
255260
None => Ok(gil.None()),
256261
})
257262
}
263+
264+
#[must_use]
265+
pub fn transaction(
266+
&self,
267+
isolation_level: Option<IsolationLevel>,
268+
read_variant: Option<ReadVariant>,
269+
deferrable: Option<bool>,
270+
) -> Transaction {
271+
Transaction::new(
272+
self.db_client.clone(),
273+
false,
274+
false,
275+
HashSet::new(),
276+
isolation_level,
277+
read_variant,
278+
deferrable,
279+
)
280+
}
258281
}

0 commit comments

Comments
 (0)