rsfbclient_diesel/fb/
value.rs

1//! Firebird value representation
2
3use super::backend::Fb;
4use diesel::backend::RawValue;
5use diesel::row::{Field, FieldRet, PartialRow, Row as DsRow, RowGatWorkaround, RowIndex};
6use rsfbclient::Column;
7use rsfbclient::Row as RsRow;
8use std::ops::Range;
9
10pub struct FbValue<'a> {
11    pub raw: &'a Column,
12}
13
14pub struct FbField<'a> {
15    raw: &'a Column,
16}
17
18impl<'a> Field<'a, Fb> for FbField<'a> {
19    fn field_name(&self) -> Option<&'a str> {
20        Some(self.raw.name.as_str())
21    }
22
23    fn value(&self) -> Option<RawValue<'a, Fb>> {
24        if self.raw.value.is_null() {
25            return None;
26        }
27
28        Some(FbValue { raw: self.raw })
29    }
30}
31
32pub struct FbRow {
33    raw: RsRow,
34}
35
36impl FbRow {
37    pub fn new(row: RsRow) -> Self {
38        Self { raw: row }
39    }
40}
41
42impl<'b> RowGatWorkaround<'b, Fb> for FbRow {
43    type Field = FbField<'b>;
44}
45
46impl<'a> DsRow<'a, Fb> for FbRow {
47    type InnerPartialRow = Self;
48
49    fn get<'b, I>(&'b self, idx: I) -> Option<FieldRet<'b, Self, Fb>>
50    where
51        'a: 'b,
52        Self: RowIndex<I>,
53    {
54        let idx = self.idx(idx)?;
55        if let Some(col) = self.raw.cols.get(idx) {
56            return Some(Self::Field { raw: col });
57        }
58
59        None
60    }
61
62    fn field_count(&self) -> usize {
63        self.raw.cols.len()
64    }
65
66    fn partial_row(&self, range: Range<usize>) -> PartialRow<Self::InnerPartialRow> {
67        PartialRow::new(self, range)
68    }
69}
70
71impl RowIndex<usize> for FbRow {
72    fn idx(&self, idx: usize) -> Option<usize> {
73        if idx < self.raw.cols.len() {
74            Some(idx)
75        } else {
76            None
77        }
78    }
79}
80
81impl<'a> RowIndex<&'a str> for FbRow {
82    fn idx(&self, field_name: &'a str) -> Option<usize> {
83        self.raw
84            .cols
85            .iter()
86            .position(|col| col.name.to_lowercase() == field_name.to_lowercase())
87    }
88}