Skip to main content

db_mover/databases/sqlite/
value.rs

1use crate::databases::table::{Column, ColumnType, Value};
2use rusqlite::{
3    ToSql,
4    types::{FromSql, ToSqlOutput, ValueRef},
5};
6
7impl TryFrom<(&Column, ValueRef<'_>)> for Value {
8    type Error = anyhow::Error;
9
10    fn try_from(value: (&Column, ValueRef<'_>)) -> Result<Self, Self::Error> {
11        let (column, val) = value;
12        if val == ValueRef::Null {
13            return Ok(Value::Null);
14        }
15        let parsed = match column.column_type {
16            ColumnType::I64 => Value::I64(FromSql::column_result(val)?),
17            ColumnType::I32 => Value::I32(FromSql::column_result(val)?),
18            ColumnType::I16 => Value::I16(FromSql::column_result(val)?),
19            ColumnType::F64 => Value::F64(FromSql::column_result(val)?),
20            ColumnType::F32 => Value::F32(FromSql::column_result(val)?),
21            ColumnType::Bool => Value::Bool(FromSql::column_result(val)?),
22            ColumnType::String => Value::String(FromSql::column_result(val)?),
23            ColumnType::Bytes => {
24                let buff: Vec<u8> = FromSql::column_result(val)?;
25                Value::Bytes(bytes::Bytes::from(buff))
26            }
27            ColumnType::Timestamptz => Value::Timestamptz(FromSql::column_result(val)?),
28            ColumnType::Timestamp => Value::Timestamp(FromSql::column_result(val)?),
29            ColumnType::Date => Value::Date(FromSql::column_result(val)?),
30            ColumnType::Time => Value::Time(FromSql::column_result(val)?),
31            ColumnType::Json => Value::Json(FromSql::column_result(val)?),
32            ColumnType::Uuid => Value::Uuid(FromSql::column_result(val)?),
33            ColumnType::Decimal => {
34                return Err(anyhow::anyhow!("Decimal is not supported for sqlite"));
35            }
36        };
37        return Ok(parsed);
38    }
39}
40
41impl ToSql for Value {
42    fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
43        match self {
44            Value::Null => Ok(ToSqlOutput::from(rusqlite::types::Null)),
45            Value::I64(val) => val.to_sql(),
46            Value::I32(val) => val.to_sql(),
47            Value::I16(val) => val.to_sql(),
48            Value::F64(val) => val.to_sql(),
49            Value::F32(val) => val.to_sql(),
50            Value::Bool(val) => val.to_sql(),
51            Value::String(val) => val.to_sql(),
52            Value::Bytes(val) => val.to_sql(),
53            Value::Timestamptz(val) => val.to_sql(),
54            Value::Timestamp(val) => val.to_sql(),
55            Value::Date(val) => val.to_sql(),
56            Value::Time(val) => val.to_sql(),
57            Value::Json(val) => val.to_sql(),
58            Value::Uuid(val) => val.to_sql(),
59            Value::Decimal(_) => {
60                return Err(rusqlite::Error::ToSqlConversionFailure(
61                    anyhow::anyhow!("Decimal is not supported for sqlite").into(),
62                ));
63            }
64        }
65    }
66}