@@ -29,23 +29,79 @@ struct FfiAccess {
2929 static const std::vector<Datum>& fields (const GenericRow& row) { return row.fields ; }
3030 static std::vector<Datum>& fields (GenericRow& row) { return row.fields ; }
3131
32- static int32_t decimal_precision (const Datum& d) { return d.decimal_precision ; }
33- static int32_t decimal_scale (const Datum& d) { return d.decimal_scale ; }
34- static int64_t i128_hi (const Datum& d) { return d.i128_hi ; }
35- static int64_t i128_lo (const Datum& d) { return d.i128_lo ; }
36-
37- static Datum from_ffi_decimal (const ffi::FfiDatum& ffi_datum, DatumType dtype) {
38- Datum d;
39- d.type = dtype;
40- d.i64_val = ffi_datum.i64_val ;
41- d.decimal_precision = ffi_datum.decimal_precision ;
42- d.decimal_scale = ffi_datum.decimal_scale ;
43- d.i128_hi = ffi_datum.i128_hi ;
44- d.i128_lo = ffi_datum.i128_lo ;
45- if (dtype == DatumType::DecimalString) {
46- d.string_val = std::string (ffi_datum.string_val );
32+ static ffi::FfiDatum to_ffi_datum (const Datum& datum) {
33+ ffi::FfiDatum ffi_datum;
34+ ffi_datum.datum_type = static_cast <int32_t >(datum.type );
35+ ffi_datum.bool_val = datum.bool_val ;
36+ ffi_datum.i32_val = datum.i32_val ;
37+ ffi_datum.i64_val = datum.i64_val ;
38+ ffi_datum.f32_val = datum.f32_val ;
39+ ffi_datum.f64_val = datum.f64_val ;
40+ ffi_datum.string_val = rust::String (datum.string_val );
41+ ffi_datum.decimal_precision = datum.decimal_precision ;
42+ ffi_datum.decimal_scale = datum.decimal_scale ;
43+ ffi_datum.i128_hi = datum.i128_hi ;
44+ ffi_datum.i128_lo = datum.i128_lo ;
45+
46+ rust::Vec<uint8_t > bytes;
47+ for (auto b : datum.bytes_val ) {
48+ bytes.push_back (b);
49+ }
50+ ffi_datum.bytes_val = std::move (bytes);
51+
52+ return ffi_datum;
53+ }
54+
55+ static Datum from_ffi_datum (const ffi::FfiDatum& ffi_datum) {
56+ auto dtype = static_cast <DatumType>(ffi_datum.datum_type );
57+ switch (dtype) {
58+ case DatumType::Null:
59+ return Datum::Null ();
60+ case DatumType::Bool:
61+ return Datum::Bool (ffi_datum.bool_val );
62+ case DatumType::Int32:
63+ return Datum::Int32 (ffi_datum.i32_val );
64+ case DatumType::Int64:
65+ return Datum::Int64 (ffi_datum.i64_val );
66+ case DatumType::Float32:
67+ return Datum::Float32 (ffi_datum.f32_val );
68+ case DatumType::Float64:
69+ return Datum::Float64 (ffi_datum.f64_val );
70+ case DatumType::String:
71+ return Datum::String (std::string (ffi_datum.string_val ));
72+ case DatumType::Bytes: {
73+ std::vector<uint8_t > bytes;
74+ for (auto b : ffi_datum.bytes_val ) {
75+ bytes.push_back (b);
76+ }
77+ return Datum::Bytes (std::move (bytes));
78+ }
79+ case DatumType::Date:
80+ return Datum::Date (fluss::Date{ffi_datum.i32_val });
81+ case DatumType::Time:
82+ return Datum::Time (fluss::Time{ffi_datum.i32_val });
83+ case DatumType::TimestampNtz:
84+ return Datum::TimestampNtz (fluss::Timestamp{ffi_datum.i64_val , ffi_datum.i32_val });
85+ case DatumType::TimestampLtz:
86+ return Datum::TimestampLtz (fluss::Timestamp{ffi_datum.i64_val , ffi_datum.i32_val });
87+ case DatumType::DecimalI64:
88+ case DatumType::DecimalI128:
89+ case DatumType::DecimalString: {
90+ Datum d;
91+ d.type = dtype;
92+ d.i64_val = ffi_datum.i64_val ;
93+ d.decimal_precision = ffi_datum.decimal_precision ;
94+ d.decimal_scale = ffi_datum.decimal_scale ;
95+ d.i128_hi = ffi_datum.i128_hi ;
96+ d.i128_lo = ffi_datum.i128_lo ;
97+ if (dtype == DatumType::DecimalString) {
98+ d.string_val = std::string (ffi_datum.string_val );
99+ }
100+ return d;
101+ }
102+ default :
103+ return Datum::Null ();
47104 }
48- return d;
49105 }
50106};
51107} // namespace detail
@@ -128,35 +184,12 @@ inline ffi::FfiTableDescriptor to_ffi_table_descriptor(const TableDescriptor& de
128184 return ffi_desc;
129185}
130186
131- inline ffi::FfiDatum to_ffi_datum (const Datum& datum) {
132- ffi::FfiDatum ffi_datum;
133- ffi_datum.datum_type = static_cast <int32_t >(datum.GetType ());
134- ffi_datum.bool_val = datum.GetBool ();
135- ffi_datum.i32_val = datum.GetInt32 ();
136- ffi_datum.i64_val = datum.GetInt64 ();
137- ffi_datum.f32_val = datum.GetFloat32 ();
138- ffi_datum.f64_val = datum.GetFloat64 ();
139- ffi_datum.string_val = rust::String (datum.GetString ());
140- ffi_datum.decimal_precision = detail::FfiAccess::decimal_precision (datum);
141- ffi_datum.decimal_scale = detail::FfiAccess::decimal_scale (datum);
142- ffi_datum.i128_hi = detail::FfiAccess::i128_hi (datum);
143- ffi_datum.i128_lo = detail::FfiAccess::i128_lo (datum);
144-
145- rust::Vec<uint8_t > bytes;
146- for (auto b : datum.GetBytes ()) {
147- bytes.push_back (b);
148- }
149- ffi_datum.bytes_val = std::move (bytes);
150-
151- return ffi_datum;
152- }
153-
154187inline ffi::FfiGenericRow to_ffi_generic_row (const GenericRow& row) {
155188 ffi::FfiGenericRow ffi_row;
156189
157190 rust::Vec<ffi::FfiDatum> ffi_fields;
158191 for (const auto & field : detail::FfiAccess::fields (row)) {
159- ffi_fields.push_back (to_ffi_datum (field));
192+ ffi_fields.push_back (detail::FfiAccess:: to_ffi_datum (field));
160193 }
161194 ffi_row.fields = std::move (ffi_fields);
162195
@@ -220,52 +253,11 @@ inline TableInfo from_ffi_table_info(const ffi::FfiTableInfo& ffi_info) {
220253 return info;
221254}
222255
223- inline Datum from_ffi_datum (const ffi::FfiDatum& ffi_datum) {
224- auto dtype = static_cast <DatumType>(ffi_datum.datum_type );
225- switch (dtype) {
226- case DatumType::Null:
227- return Datum::Null ();
228- case DatumType::Bool:
229- return Datum::Bool (ffi_datum.bool_val );
230- case DatumType::Int32:
231- return Datum::Int32 (ffi_datum.i32_val );
232- case DatumType::Int64:
233- return Datum::Int64 (ffi_datum.i64_val );
234- case DatumType::Float32:
235- return Datum::Float32 (ffi_datum.f32_val );
236- case DatumType::Float64:
237- return Datum::Float64 (ffi_datum.f64_val );
238- case DatumType::String:
239- return Datum::String (std::string (ffi_datum.string_val ));
240- case DatumType::Bytes: {
241- std::vector<uint8_t > bytes;
242- for (auto b : ffi_datum.bytes_val ) {
243- bytes.push_back (b);
244- }
245- return Datum::Bytes (std::move (bytes));
246- }
247- case DatumType::Date:
248- return Datum::Date (fluss::Date{ffi_datum.i32_val });
249- case DatumType::Time:
250- return Datum::Time (fluss::Time{ffi_datum.i32_val });
251- case DatumType::TimestampNtz:
252- return Datum::TimestampNtz (fluss::Timestamp{ffi_datum.i64_val , ffi_datum.i32_val });
253- case DatumType::TimestampLtz:
254- return Datum::TimestampLtz (fluss::Timestamp{ffi_datum.i64_val , ffi_datum.i32_val });
255- case DatumType::DecimalI64:
256- case DatumType::DecimalI128:
257- case DatumType::DecimalString:
258- return detail::FfiAccess::from_ffi_decimal (ffi_datum, dtype);
259- default :
260- return Datum::Null ();
261- }
262- }
263-
264256inline GenericRow from_ffi_generic_row (const ffi::FfiGenericRow& ffi_row) {
265257 GenericRow row;
266258
267259 for (const auto & field : ffi_row.fields ) {
268- detail::FfiAccess::fields (row).push_back (from_ffi_datum (field));
260+ detail::FfiAccess::fields (row).push_back (detail::FfiAccess:: from_ffi_datum (field));
269261 }
270262
271263 return row;
0 commit comments