MCPcopy Create free account
hub / github.com/apache/paimon-rust / datum_from_c

Function datum_from_c

bindings/c/src/table.rs:529–594  ·  view source on GitHub ↗

Convert a C datum to a Rust Datum.

(d: &paimon_datum)

Source from the content-addressed store, hash-verified

527
528/// Convert a C datum to a Rust Datum.
529unsafe 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 };

Callers 2

Calls 5

DateTypeAlias · 0.85
TimeTypeAlias · 0.85
BytesTypeAlias · 0.85
is_nullMethod · 0.80
to_vecMethod · 0.80

Tested by

no test coverage detected