@@ -2,8 +2,8 @@ use std::str::FromStr;
22
33use geo_types:: { Line as RustLineSegment , LineString , Point as RustPoint , Rect as RustRect } ;
44use macaddr:: { MacAddr6 as RustMacAddr6 , MacAddr8 as RustMacAddr8 } ;
5+ use postgres_types:: Type ;
56use pyo3:: {
6- conversion:: FromPyObjectBound ,
77 pyclass, pymethods,
88 types:: { PyModule , PyModuleMethods } ,
99 Bound , Py , PyAny , PyResult , Python ,
@@ -325,7 +325,7 @@ impl Circle {
325325}
326326
327327macro_rules! build_array_type {
328- ( $st_name: ident, $kind: path) => {
328+ ( $st_name: ident, $kind: path, $elem_kind : path ) => {
329329 #[ pyclass]
330330 #[ derive( Clone ) ]
331331 pub struct $st_name {
@@ -347,52 +347,61 @@ macro_rules! build_array_type {
347347 self . inner. clone( )
348348 }
349349
350+ pub fn element_type( ) -> Type {
351+ $elem_kind
352+ }
353+
350354 /// Convert incoming sequence from python to internal `PythonDTO`.
351355 ///
352356 /// # Errors
353357 /// May return Err Result if cannot convert sequence to array.
354- pub fn _convert_to_python_dto( & self ) -> PSQLPyResult <PythonDTO > {
358+ pub fn _convert_to_python_dto( & self , elem_type : & Type ) -> PSQLPyResult <PythonDTO > {
355359 return Python :: with_gil( |gil| {
356360 let binding = & self . inner;
357361 let bound_inner = Ok :: <& pyo3:: Bound <' _, pyo3:: PyAny >, RustPSQLDriverError >(
358362 binding. bind( gil) ,
359363 ) ?;
360364 Ok :: <PythonDTO , RustPSQLDriverError >( $kind( py_sequence_into_postgres_array(
361365 bound_inner,
366+ elem_type,
362367 ) ?) )
363368 } ) ;
364369 }
365370 }
366371 } ;
367372}
368373
369- build_array_type ! ( BoolArray , PythonDTO :: PyBoolArray ) ;
370- build_array_type ! ( UUIDArray , PythonDTO :: PyUuidArray ) ;
371- build_array_type ! ( VarCharArray , PythonDTO :: PyVarCharArray ) ;
372- build_array_type ! ( TextArray , PythonDTO :: PyTextArray ) ;
373- build_array_type ! ( Int16Array , PythonDTO :: PyInt16Array ) ;
374- build_array_type ! ( Int32Array , PythonDTO :: PyInt32Array ) ;
375- build_array_type ! ( Int64Array , PythonDTO :: PyInt64Array ) ;
376- build_array_type ! ( Float32Array , PythonDTO :: PyFloat32Array ) ;
377- build_array_type ! ( Float64Array , PythonDTO :: PyFloat64Array ) ;
378- build_array_type ! ( MoneyArray , PythonDTO :: PyMoneyArray ) ;
379- build_array_type ! ( IpAddressArray , PythonDTO :: PyIpAddressArray ) ;
380- build_array_type ! ( JSONBArray , PythonDTO :: PyJSONBArray ) ;
381- build_array_type ! ( JSONArray , PythonDTO :: PyJSONArray ) ;
382- build_array_type ! ( DateArray , PythonDTO :: PyDateArray ) ;
383- build_array_type ! ( TimeArray , PythonDTO :: PyTimeArray ) ;
384- build_array_type ! ( DateTimeArray , PythonDTO :: PyDateTimeArray ) ;
385- build_array_type ! ( DateTimeTZArray , PythonDTO :: PyDateTimeTZArray ) ;
386- build_array_type ! ( MacAddr6Array , PythonDTO :: PyMacAddr6Array ) ;
387- build_array_type ! ( MacAddr8Array , PythonDTO :: PyMacAddr8Array ) ;
388- build_array_type ! ( NumericArray , PythonDTO :: PyNumericArray ) ;
389- build_array_type ! ( PointArray , PythonDTO :: PyPointArray ) ;
390- build_array_type ! ( BoxArray , PythonDTO :: PyBoxArray ) ;
391- build_array_type ! ( PathArray , PythonDTO :: PyPathArray ) ;
392- build_array_type ! ( LineArray , PythonDTO :: PyLineArray ) ;
393- build_array_type ! ( LsegArray , PythonDTO :: PyLsegArray ) ;
394- build_array_type ! ( CircleArray , PythonDTO :: PyCircleArray ) ;
395- build_array_type ! ( IntervalArray , PythonDTO :: PyIntervalArray ) ;
374+ build_array_type ! ( BoolArray , PythonDTO :: PyBoolArray , Type :: BOOL ) ;
375+ build_array_type ! ( UUIDArray , PythonDTO :: PyUuidArray , Type :: UUID ) ;
376+ build_array_type ! ( VarCharArray , PythonDTO :: PyVarCharArray , Type :: VARCHAR ) ;
377+ build_array_type ! ( TextArray , PythonDTO :: PyTextArray , Type :: TEXT ) ;
378+ build_array_type ! ( Int16Array , PythonDTO :: PyInt16Array , Type :: INT2 ) ;
379+ build_array_type ! ( Int32Array , PythonDTO :: PyInt32Array , Type :: INT4 ) ;
380+ build_array_type ! ( Int64Array , PythonDTO :: PyInt64Array , Type :: INT8 ) ;
381+ build_array_type ! ( Float32Array , PythonDTO :: PyFloat32Array , Type :: FLOAT4 ) ;
382+ build_array_type ! ( Float64Array , PythonDTO :: PyFloat64Array , Type :: FLOAT8 ) ;
383+ build_array_type ! ( MoneyArray , PythonDTO :: PyMoneyArray , Type :: MONEY ) ;
384+ build_array_type ! ( IpAddressArray , PythonDTO :: PyIpAddressArray , Type :: INET ) ;
385+ build_array_type ! ( JSONBArray , PythonDTO :: PyJSONBArray , Type :: JSONB ) ;
386+ build_array_type ! ( JSONArray , PythonDTO :: PyJSONArray , Type :: JSON ) ;
387+ build_array_type ! ( DateArray , PythonDTO :: PyDateArray , Type :: DATE ) ;
388+ build_array_type ! ( TimeArray , PythonDTO :: PyTimeArray , Type :: TIME ) ;
389+ build_array_type ! ( DateTimeArray , PythonDTO :: PyDateTimeArray , Type :: TIMESTAMP ) ;
390+ build_array_type ! (
391+ DateTimeTZArray ,
392+ PythonDTO :: PyDateTimeTZArray ,
393+ Type :: TIMESTAMPTZ
394+ ) ;
395+ build_array_type ! ( MacAddr6Array , PythonDTO :: PyMacAddr6Array , Type :: MACADDR ) ;
396+ build_array_type ! ( MacAddr8Array , PythonDTO :: PyMacAddr8Array , Type :: MACADDR8 ) ;
397+ build_array_type ! ( NumericArray , PythonDTO :: PyNumericArray , Type :: NUMERIC ) ;
398+ build_array_type ! ( PointArray , PythonDTO :: PyPointArray , Type :: POINT ) ;
399+ build_array_type ! ( BoxArray , PythonDTO :: PyBoxArray , Type :: BOX ) ;
400+ build_array_type ! ( PathArray , PythonDTO :: PyPathArray , Type :: PATH ) ;
401+ build_array_type ! ( LineArray , PythonDTO :: PyLineArray , Type :: LINE ) ;
402+ build_array_type ! ( LsegArray , PythonDTO :: PyLsegArray , Type :: LSEG ) ;
403+ build_array_type ! ( CircleArray , PythonDTO :: PyCircleArray , Type :: CIRCLE ) ;
404+ build_array_type ! ( IntervalArray , PythonDTO :: PyIntervalArray , Type :: INTERVAL ) ;
396405
397406#[ allow( clippy:: module_name_repetitions) ]
398407#[ allow( clippy:: missing_errors_doc) ]
0 commit comments