Skip to content

Commit cec3ff6

Browse files
author
AGAEV Denis E
committed
Added fixes
1 parent e5146e1 commit cec3ff6

File tree

2 files changed

+49
-77
lines changed

2 files changed

+49
-77
lines changed

src/additional_types.rs

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,24 @@ impl<'a> FromSql<'a> for RustLine {
7272
_ty: &Type,
7373
raw: &'a [u8],
7474
) -> Result<RustLine, Box<dyn std::error::Error + Sync + Send>> {
75-
if raw.len() == 4 {
76-
let mut vec_raw = vec![];
77-
vec_raw.extend_from_slice(raw);
78-
let mut buf = vec_raw.as_slice();
75+
if raw.len() != 4 {
76+
return Err("Cannot convert PostgreSQL LINE into rust Line".into());
77+
}
7978

80-
let x1 = buf.read_f64::<BigEndian>()?;
81-
let y1 = buf.read_f64::<BigEndian>()?;
82-
let first_coord = coord!(x: x1, y: y1);
79+
let mut vec_raw = vec![];
80+
vec_raw.extend_from_slice(raw);
81+
let mut buf = vec_raw.as_slice();
8382

84-
let x2 = buf.read_f64::<BigEndian>()?;
85-
let y2 = buf.read_f64::<BigEndian>()?;
86-
let second_coord = coord!(x: x2, y: y2);
83+
let x1 = buf.read_f64::<BigEndian>()?;
84+
let y1 = buf.read_f64::<BigEndian>()?;
85+
let first_coord = coord!(x: x1, y: y1);
8786

88-
let new_line = Line::new(first_coord, second_coord);
89-
return Ok(RustLine::new(new_line));
90-
}
91-
Err("Cannot convert PostgreSQL LINE into rust Line".into())
87+
let x2 = buf.read_f64::<BigEndian>()?;
88+
let y2 = buf.read_f64::<BigEndian>()?;
89+
let second_coord = coord!(x: x2, y: y2);
90+
91+
let new_line = Line::new(first_coord, second_coord);
92+
return Ok(RustLine::new(new_line));
9293
}
9394

9495
fn accepts(_ty: &Type) -> bool {
@@ -101,24 +102,25 @@ impl<'a> FromSql<'a> for RustPolygon {
101102
_ty: &Type,
102103
raw: &'a [u8],
103104
) -> Result<RustPolygon, Box<dyn std::error::Error + Sync + Send>> {
104-
if raw.len() % 2 == 0 {
105-
let mut vec_raw = vec![];
106-
vec_raw.extend_from_slice(raw);
107-
let mut buf = vec_raw.as_slice();
105+
if raw.len() % 2 != 0 {
106+
return Err("Cannot convert PostgreSQL POLYGON into rust Polygon".into());
107+
}
108108

109-
let mut vec_raw_coord = vec![];
110-
buf.read_f64_into::<BigEndian>(&mut vec_raw_coord);
109+
let mut vec_raw = vec![];
110+
vec_raw.extend_from_slice(raw);
111+
let mut buf = vec_raw.as_slice();
111112

112-
let mut vec_coord = vec![];
113-
for (x1, y1) in vec_raw_coord.into_iter().tuples() {
114-
vec_coord.push(coord!(x: x1, y: y1));
115-
}
113+
let mut vec_raw_coord = vec![];
114+
buf.read_f64_into::<BigEndian>(&mut vec_raw_coord)?;
116115

117-
let polygon_exterior = LineString::new(vec_coord);
118-
let new_polygon = Polygon::new(polygon_exterior, vec![]);
119-
return Ok(RustPolygon::new(new_polygon));
116+
let mut vec_coord = vec![];
117+
for (x1, y1) in vec_raw_coord.into_iter().tuples() {
118+
vec_coord.push(coord!(x: x1, y: y1));
120119
}
121-
Err("Cannot convert PostgreSQL POLYGON into rust Polygon".into())
120+
121+
let polygon_exterior = LineString::new(vec_coord);
122+
let new_polygon = Polygon::new(polygon_exterior, vec![]);
123+
return Ok(RustPolygon::new(new_polygon));
122124
}
123125

124126
fn accepts(_ty: &Type) -> bool {
@@ -178,7 +180,7 @@ impl<T: CoordFloat> Circle<T> {
178180
}
179181

180182
pub fn contains(self, point: &Coord<T>) -> bool {
181-
self.distance_from_center_to(&point) <= self.radius
183+
self.distance_from_center_to(point) <= self.radius
182184
}
183185

184186
pub fn intersects(self, other: &Self) -> bool {
@@ -200,19 +202,20 @@ impl<'a> FromSql<'a> for Circle {
200202
_ty: &Type,
201203
raw: &'a [u8],
202204
) -> Result<Circle, Box<dyn std::error::Error + Sync + Send>> {
203-
if raw.len() == 3 {
204-
let mut vec_raw = vec![];
205-
vec_raw.extend_from_slice(raw);
206-
let mut buf = vec_raw.as_slice();
205+
if raw.len() != 3 {
206+
return Err("Cannot convert PostgreSQL CIRCLE into rust Circle".into());
207+
}
207208

208-
let x = buf.read_f64::<BigEndian>()?;
209-
let y = buf.read_f64::<BigEndian>()?;
210-
let r = buf.read_f64::<BigEndian>()?;
209+
let mut vec_raw = vec![];
210+
vec_raw.extend_from_slice(raw);
211+
let mut buf = vec_raw.as_slice();
211212

212-
let new_circle = Circle::new(x, y, r);
213-
return Ok(new_circle);
214-
}
215-
Err("Cannot convert PostgreSQL CIRCLE into rust Circle".into())
213+
let x = buf.read_f64::<BigEndian>()?;
214+
let y = buf.read_f64::<BigEndian>()?;
215+
let r = buf.read_f64::<BigEndian>()?;
216+
217+
let new_circle = Circle::new(x, y, r);
218+
return Ok(new_circle);
216219
}
217220

218221
fn accepts(_ty: &Type) -> bool {

src/value_converter.rs

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -134,37 +134,6 @@ impl PythonDTO {
134134
)),
135135
}
136136
}
137-
138-
/// Get value from DTO
139-
///
140-
/// # Errors
141-
/// May return Err Result if cannot convert python type into rust.
142-
pub fn get_value(&self) -> RustPSQLDriverPyResult<Value> {
143-
match self {
144-
PythonDTO::PyNone => Ok(Value::Null),
145-
PythonDTO::PyBool(pybool) => Ok(json!(pybool)),
146-
PythonDTO::PyString(pystring)
147-
| PythonDTO::PyText(pystring)
148-
| PythonDTO::PyVarChar(pystring) => Ok(json!(pystring)),
149-
PythonDTO::PyIntI32(pyint) => Ok(json!(pyint)),
150-
PythonDTO::PyIntI64(pyint) => Ok(json!(pyint)),
151-
PythonDTO::PyIntU64(pyint) => Ok(json!(pyint)),
152-
PythonDTO::PyFloat64(pyfloat) => Ok(json!(pyfloat)),
153-
PythonDTO::PyList(pylist) => {
154-
let mut vec_serde_values: Vec<Value> = vec![];
155-
156-
for py_object in pylist {
157-
vec_serde_values.push(py_object.to_serde_value()?);
158-
}
159-
160-
Ok(json!(vec_serde_values))
161-
}
162-
PythonDTO::PyJsonb(py_dict) | PythonDTO::PyJson(py_dict) => Ok(py_dict.clone()),
163-
_ => Err(RustPSQLDriverError::PyToRustValueConversionError(
164-
"Cannot convert your type into Rust type".into(),
165-
)),
166-
}
167-
}
168137
}
169138

170139
/// Implement `ToSql` trait.
@@ -910,12 +879,12 @@ pub fn build_point(value: Py<PyAny>) -> RustPSQLDriverPyResult<Point> {
910879
}
911880
}
912881

913-
Ok(point!(x: result_vec[0], y: result_vec[1]))
914-
} else {
915-
return Err(RustPSQLDriverError::PyToRustValueConversionError(
916-
"PyPoint must have pair int/float values combination passed in tuple, list or set."
917-
.to_string(),
918-
));
882+
return Ok(point!(x: result_vec[0], y: result_vec[1]));
919883
}
884+
885+
return Err(RustPSQLDriverError::PyToRustValueConversionError(
886+
"PyPoint must have pair int/float values combination passed in tuple, list or set."
887+
.to_string(),
888+
));
920889
})
921890
}

0 commit comments

Comments
 (0)