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}