cassandra_cpp/cassandra/schema/
column_meta.rs

1use crate::cassandra::data_type::ConstDataType;
2
3use crate::cassandra::iterator::FieldIterator;
4use crate::cassandra::util::{Protected, ProtectedInner};
5use crate::cassandra::value::Value;
6use crate::cassandra_sys::cass_column_meta_data_type;
7use crate::cassandra_sys::cass_column_meta_field_by_name_n;
8use crate::cassandra_sys::cass_column_meta_name;
9use crate::cassandra_sys::cass_column_meta_type;
10use crate::cassandra_sys::cass_iterator_fields_from_column_meta;
11use crate::cassandra_sys::CassColumnMeta as _CassColumnMeta;
12use crate::cassandra_sys::CassColumnType as _CassColumnType;
13
14use std::marker::PhantomData;
15use std::os::raw::c_char;
16use std::slice;
17use std::str;
18
19/// Column metadata
20//
21// Borrowed immutably.
22#[derive(Debug)]
23pub struct ColumnMeta<'a>(*const _CassColumnMeta, PhantomData<&'a _CassColumnMeta>);
24
25impl ProtectedInner<*const _CassColumnMeta> for ColumnMeta<'_> {
26    fn inner(&self) -> *const _CassColumnMeta {
27        self.0
28    }
29}
30
31impl Protected<*const _CassColumnMeta> for ColumnMeta<'_> {
32    fn build(inner: *const _CassColumnMeta) -> Self {
33        if inner.is_null() {
34            panic!("Unexpected null pointer")
35        };
36        ColumnMeta(inner, PhantomData)
37    }
38}
39
40impl<'a> ColumnMeta<'a> {
41    /// returns an iterator over the fields of this column
42    pub fn field_iter(&self) -> FieldIterator<'a> {
43        unsafe { FieldIterator::build(cass_iterator_fields_from_column_meta(self.0)) }
44    }
45
46    /// Gets the name of the column.
47    pub fn name(&self) -> String {
48        let mut name = std::ptr::null();
49        let mut name_length = 0;
50        unsafe {
51            cass_column_meta_name(self.0, &mut name, &mut name_length);
52            let slice = slice::from_raw_parts(name as *const u8, name_length);
53            str::from_utf8(slice).expect("must be utf8").to_owned()
54        }
55    }
56
57    /// Gets the type of the column.
58    pub fn get_type(&self) -> _CassColumnType {
59        unsafe { cass_column_meta_type(self.0) }
60    }
61
62    /// Gets the data type of the column.
63    pub fn data_type(&self) -> ConstDataType<'a> {
64        unsafe { ConstDataType::build(cass_column_meta_data_type(self.0)) }
65    }
66
67    /// Gets a metadata field for the provided name. Metadata fields allow direct
68    /// access to the column data found in the underlying "columns" metadata table.
69    pub fn field_by_name(&self, name: &str) -> Option<Value<'a>> {
70        unsafe {
71            let name_ptr = name.as_ptr() as *const c_char;
72            let field = cass_column_meta_field_by_name_n(self.0, name_ptr, name.len());
73            if field.is_null() {
74                None
75            } else {
76                Some(Value::build(field))
77            }
78        }
79    }
80}