Skip to main content

rbdc_oracle/
row.rs

1use crate::decode::Decode;
2use crate::{OracleColumn, OracleValue, OracleValueRef};
3use rbdc::Error;
4use rbdc::db::{MetaData, Row};
5use rbs::Value;
6use std::sync::Arc;
7
8#[derive(Debug)]
9pub struct OracleRow {
10    pub(crate) values: Vec<OracleValue>,
11    pub(crate) columns: Arc<Vec<OracleColumn>>,
12}
13
14#[derive(Debug)]
15pub struct OracleMetaData {
16    pub(crate) columns: Arc<Vec<OracleColumn>>,
17}
18
19impl OracleRow {
20    pub(crate) fn new(columns: Arc<Vec<OracleColumn>>, values: Vec<OracleValue>) -> Self {
21        Self { values, columns }
22    }
23
24    fn try_get_raw(&self, index: usize) -> Result<OracleValueRef<'_>, Error> {
25        self.values
26            .get(index)
27            .map(OracleValueRef::value)
28            .ok_or_else(|| Error::from("Index out of bounds"))
29    }
30}
31
32impl MetaData for OracleMetaData {
33    fn column_len(&self) -> usize {
34        self.columns.len()
35    }
36
37    fn column_name(&self, i: usize) -> String {
38        self.columns[i].name().to_owned()
39    }
40
41    fn column_type(&self, i: usize) -> String {
42        self.columns[i].type_info().to_string()
43    }
44}
45
46impl Row for OracleRow {
47    fn meta_data(&self) -> Box<dyn MetaData> {
48        Box::new(OracleMetaData {
49            columns: self.columns.clone(),
50        })
51    }
52
53    fn get(&mut self, i: usize) -> Result<Value, Error> {
54        self.try_get_raw(i).and_then(Value::decode)
55    }
56}