Convert a C datum to a Rust Datum.
(d: &paimon_datum)
| 527 | |
| 528 | /// Convert a C datum to a Rust Datum. |
| 529 | unsafe fn datum_from_c(d: &paimon_datum) -> Result<Datum, *mut paimon_error> { |
| 530 | match d.tag { |
| 531 | 0 => Ok(Datum::Bool(d.int_val != 0)), |
| 532 | 1 => Ok(Datum::TinyInt(d.int_val as i8)), |
| 533 | 2 => Ok(Datum::SmallInt(d.int_val as i16)), |
| 534 | 3 => Ok(Datum::Int(d.int_val as i32)), |
| 535 | 4 => Ok(Datum::Long(d.int_val)), |
| 536 | 5 => Ok(Datum::Float(d.double_val as f32)), |
| 537 | 6 => Ok(Datum::Double(d.double_val)), |
| 538 | 7 => { |
| 539 | if d.str_len == 0 { |
| 540 | return Ok(Datum::String(String::new())); |
| 541 | } |
| 542 | if d.str_data.is_null() { |
| 543 | return Err(paimon_error::new( |
| 544 | PaimonErrorCode::InvalidInput, |
| 545 | "null string data in datum with non-zero length".to_string(), |
| 546 | )); |
| 547 | } |
| 548 | let bytes = std::slice::from_raw_parts(d.str_data, d.str_len); |
| 549 | let s = std::str::from_utf8(bytes).map_err(|e| { |
| 550 | paimon_error::new( |
| 551 | PaimonErrorCode::InvalidInput, |
| 552 | format!("invalid UTF-8 in datum string: {e}"), |
| 553 | ) |
| 554 | })?; |
| 555 | Ok(Datum::String(s.to_string())) |
| 556 | } |
| 557 | 8 => Ok(Datum::Date(d.int_val as i32)), |
| 558 | 9 => Ok(Datum::Time(d.int_val as i32)), |
| 559 | 10 => Ok(Datum::Timestamp { |
| 560 | millis: d.int_val, |
| 561 | nanos: d.int_val2 as i32, |
| 562 | }), |
| 563 | 11 => Ok(Datum::LocalZonedTimestamp { |
| 564 | millis: d.int_val, |
| 565 | nanos: d.int_val2 as i32, |
| 566 | }), |
| 567 | 12 => { |
| 568 | let unscaled = ((d.int_val2 as i128) << 64) | (d.int_val as u64 as i128); |
| 569 | Ok(Datum::Decimal { |
| 570 | unscaled, |
| 571 | precision: d.uint_val, |
| 572 | scale: d.uint_val2, |
| 573 | }) |
| 574 | } |
| 575 | 13 => { |
| 576 | if d.str_data.is_null() && d.str_len > 0 { |
| 577 | return Err(paimon_error::new( |
| 578 | PaimonErrorCode::InvalidInput, |
| 579 | "null bytes data in datum".to_string(), |
| 580 | )); |
| 581 | } |
| 582 | let bytes = if d.str_len > 0 { |
| 583 | std::slice::from_raw_parts(d.str_data, d.str_len).to_vec() |
| 584 | } else { |
| 585 | Vec::new() |
| 586 | }; |