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
10pub 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}