@@ -11,6 +11,13 @@ use taos::{taos_query::common::Timestamp, BorrowedValue, RawBlock};
1111
1212use crate :: ConsumerException ;
1313
14+ pub fn to_py_decimal ( value : impl std:: fmt:: Display , py : Python < ' _ > ) -> PyResult < PyObject > {
15+ let decimal_mod = py. import ( "decimal" ) ?;
16+ let decimal_cls = decimal_mod. getattr ( "Decimal" ) ?;
17+ let decimal = value. to_string ( ) ;
18+ Ok ( decimal_cls. call1 ( ( decimal, ) ) ?. into_py ( py) )
19+ }
20+
1421pub fn to_py_datetime ( ts : Timestamp , tz : Option < Tz > , py : Python ) -> PyResult < PyObject > {
1522 let datetime_mod = py. import ( "datetime" ) ?;
1623 let datetime = datetime_mod. getattr ( "datetime" ) ?;
@@ -94,7 +101,11 @@ fn warn_missing_timezone_libs(tz: Option<Tz>) {
94101 } ) ;
95102}
96103
97- pub unsafe fn get_row_of_block_unchecked ( py : Python , block : & RawBlock , index : usize ) -> PyObject {
104+ pub unsafe fn get_row_of_block_unchecked (
105+ py : Python ,
106+ block : & RawBlock ,
107+ index : usize ,
108+ ) -> PyResult < PyObject > {
98109 let mut vec = Vec :: new ( ) ;
99110 for i in 0 ..block. ncols ( ) {
100111 let val = block. get_ref ( index, i) . unwrap ( ) ;
@@ -110,43 +121,44 @@ pub unsafe fn get_row_of_block_unchecked(py: Python, block: &RawBlock, index: us
110121 BorrowedValue :: VarChar ( v) => v. into_py ( py) ,
111122 BorrowedValue :: Timestamp ( v) => match v. precision ( ) {
112123 taos:: Precision :: Nanosecond => v. as_raw_i64 ( ) . to_object ( py) ,
113- _ => to_py_datetime ( v, block. timezone ( ) , py) . unwrap ( ) ,
124+ _ => to_py_datetime ( v, block. timezone ( ) , py) ? ,
114125 } ,
115126 BorrowedValue :: NChar ( v) => v. into_py ( py) ,
116127 BorrowedValue :: UTinyInt ( v) => v. into_py ( py) ,
117128 BorrowedValue :: USmallInt ( v) => v. into_py ( py) ,
118129 BorrowedValue :: UInt ( v) => v. into_py ( py) ,
119130 BorrowedValue :: UBigInt ( v) => v. into_py ( py) ,
120131 BorrowedValue :: Json ( v) => std:: str:: from_utf8 ( & v)
121- . map_err ( |err| ConsumerException :: new_err ( err. to_string ( ) ) )
122- . unwrap ( )
132+ . map_err ( |err| ConsumerException :: new_err ( err. to_string ( ) ) ) ?
123133 . to_string ( )
124134 . into_py ( py) ,
125135 BorrowedValue :: VarBinary ( v) => v. into_py ( py) ,
126136 BorrowedValue :: Geometry ( v) => v. into_py ( py) ,
127- BorrowedValue :: Decimal64 ( v) => v . to_string ( ) . into_py ( py) ,
128- BorrowedValue :: Decimal ( v) => v . to_string ( ) . into_py ( py) ,
137+ BorrowedValue :: Decimal64 ( v) => to_py_decimal ( v , py) ? ,
138+ BorrowedValue :: Decimal ( v) => to_py_decimal ( v , py) ? ,
129139 BorrowedValue :: Blob ( v) => v. into_py ( py) ,
130140 BorrowedValue :: MediumBlob ( _) => todo ! ( ) ,
131141 } ;
132142 vec. push ( val) ;
133143 }
134- PyTuple :: new ( py, vec) . to_object ( py)
144+ Ok ( PyTuple :: new ( py, vec) . to_object ( py) )
135145}
136146
137- pub fn get_row_of_block ( py : Python , block : & RawBlock , index : usize ) -> Option < PyObject > {
147+ pub fn get_row_of_block ( py : Python , block : & RawBlock , index : usize ) -> PyResult < Option < PyObject > > {
138148 if block. nrows ( ) > index {
139- Some ( unsafe { get_row_of_block_unchecked ( py, block, index) } )
149+ Ok ( Some ( unsafe {
150+ get_row_of_block_unchecked ( py, block, index) ?
151+ } ) )
140152 } else {
141- None
153+ Ok ( None )
142154 }
143155}
144156
145157pub fn get_slice_of_block (
146158 py : Python ,
147159 block : & RawBlock ,
148160 range : Range < usize > ,
149- ) -> ( Vec < PyObject > , Option < usize > ) {
161+ ) -> PyResult < ( Vec < PyObject > , Option < usize > ) > {
150162 debug_assert ! ( range. start < block. nrows( ) ) ;
151163 let start = range. start ;
152164 let end = range. end ;
@@ -159,14 +171,14 @@ pub fn get_slice_of_block(
159171 let slices = range
160172 . into_iter ( )
161173 . map ( |index| unsafe { get_row_of_block_unchecked ( py, block, index) } )
162- . collect ( ) ;
174+ . collect :: < PyResult < Vec < _ > > > ( ) ? ;
163175
164- ( slices, remain)
176+ Ok ( ( slices, remain) )
165177}
166178
167- pub fn get_all_of_block ( py : Python , block : & RawBlock ) -> Vec < PyObject > {
179+ pub fn get_all_of_block ( py : Python , block : & RawBlock ) -> PyResult < Vec < PyObject > > {
168180 ( 0 ..block. nrows ( ) )
169181 . into_iter ( )
170182 . map ( |index| unsafe { get_row_of_block_unchecked ( py, block, index) } )
171- . collect ( )
183+ . collect :: < PyResult < Vec < _ > > > ( )
172184}
0 commit comments