diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/select.rs | 23 | ||||
| -rw-r--r-- | src/yaml/sql.rs | 27 | 
2 files changed, 49 insertions, 1 deletions
| diff --git a/src/select.rs b/src/select.rs index 1e4d81b..0c61c34 100644 --- a/src/select.rs +++ b/src/select.rs @@ -3,6 +3,8 @@ pub fn select(      table_name: &str,      record_id: &str,  ) -> yaml_rust::Yaml { +    use crate::yaml::Yaml; +      let mut stmt = dbconn.prepare(          &format!(              r#" @@ -15,13 +17,32 @@ pub fn select(          ),      ).unwrap(); +    let column_count = stmt.column_count(); +      let rows = stmt.query_map(          rusqlite::named_params! {              ":pk_column": "id",              ":pk": record_id,          },          |row| { -            Ok(()) +            // let data: [dyn rusqlite::types::FromSql; column_count] = [rusqlite::types::Null; column_count]; +            // let data: Vec<dyn rusqlite::types::FromSql> +            //     = Vec::with_capacity(column_count); +            // let data = Vec::with_capacity(column_count); +            let data: Vec<Yaml> = Vec::with_capacity(column_count); + +            // for i in 0..=column_count { +            //     data.push(row.get(i)); +            // } + +            // TODO: column values must be converted to yaml_rust::Yaml in this +            // closure. + +            for i in 0..=column_count { +                data.push(row.get(i)?); +            } + +            Ok(data)          },      ).unwrap(); diff --git a/src/yaml/sql.rs b/src/yaml/sql.rs index 68488d2..d065718 100644 --- a/src/yaml/sql.rs +++ b/src/yaml/sql.rs @@ -34,3 +34,30 @@ impl<'a> rusqlite::ToSql for Yaml<'a> {          Ok(sql_output)      }  } + +impl<'a> rusqlite::types::FromSql for Yaml<'a> { +    fn column_result( +        value: rusqlite::types::ValueRef<'_>, +    ) -> rusqlite::types::FromSqlResult<Self> { +        use rusqlite::types::ValueRef; + +        match value { +            ValueRef::Integer(i) => Ok(Yaml(&yaml_rust::Yaml::Integer(i))), +            ValueRef::Real(f) => +                Ok(Yaml(&yaml_rust::Yaml::Real(f.to_string()))), +            ValueRef::Text(_) => { +                let s = value.as_str()?; + +                Ok(Yaml(&yaml_rust::Yaml::String(s.to_owned()))) +            } +            ValueRef::Blob(_) => { +                // TODO: How should we handle blobs? Parsing as string might not +                // make the most sense. +                let b = value.as_str()?; + +                Ok(Yaml(&yaml_rust::Yaml::String(b.to_owned()))) +            } +            ValueRef::Null => Ok(Yaml(&yaml_rust::Yaml::Null)), +        } +    } +} | 
