db_mover/databases/sqlite/
value.rs1use 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}