cdbc_pg/
row.rs

1use cdbc::column::ColumnIndex;
2use cdbc::error::Error;
3use crate::message::DataRow;
4use crate::statement::PgStatementMetadata;
5use crate::value::PgValueFormat;
6use crate::{PgColumn, PgValueRef, Postgres};
7use cdbc::row::Row;
8use std::sync::Arc;
9
10/// Implementation of [`Row`] for PostgreSQL.
11pub struct PgRow {
12    pub(crate) data: DataRow,
13    pub(crate) format: PgValueFormat,
14    pub(crate) metadata: Arc<PgStatementMetadata>,
15}
16
17impl Row for PgRow {
18    type Database = Postgres;
19
20    fn columns(&self) -> &[PgColumn] {
21        &self.metadata.columns
22    }
23
24    fn try_get_raw<I>(&self, index: I) -> Result<PgValueRef<'_>, Error>
25    where
26        I: ColumnIndex<Self>,
27    {
28        let index = index.index(self)?;
29        let column = &self.metadata.columns[index];
30        let value = self.data.get(index);
31
32        Ok(PgValueRef {
33            format: self.format,
34            row: Some(&self.data.storage),
35            type_info: column.type_info.clone(),
36            value,
37        })
38    }
39}
40
41impl ColumnIndex<PgRow> for &'_ str {
42    fn index(&self, row: &PgRow) -> Result<usize, Error> {
43        row.metadata
44            .column_names
45            .get(*self)
46            .ok_or_else(|| Error::ColumnNotFound((*self).into()))
47            .map(|v| *v)
48    }
49}