fix(sql): derive datatype from value, not colomn (#118)

pull/256/head
Fabian-Lars 2 years ago committed by GitHub
parent c348eb31ea
commit d18bc1ea60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -10,7 +10,7 @@ use sqlx::{
migrate::{ migrate::{
MigrateDatabase, Migration as SqlxMigration, MigrationSource, MigrationType, Migrator, MigrateDatabase, Migration as SqlxMigration, MigrationSource, MigrationType, Migrator,
}, },
Column, Pool, Row, TypeInfo, Column, Pool, Row, TypeInfo, ValueRef,
}; };
use tauri::{ use tauri::{
command, command,
@ -44,6 +44,8 @@ pub enum Error {
Migration(#[from] sqlx::migrate::MigrateError), Migration(#[from] sqlx::migrate::MigrateError),
#[error("database {0} not loaded")] #[error("database {0} not loaded")]
DatabaseNotLoaded(String), DatabaseNotLoaded(String),
#[error("unsupported datatype: {0}")]
UnsupportedDatatype(String),
} }
impl Serialize for Error { impl Serialize for Error {
@ -246,12 +248,16 @@ async fn select(
for row in rows { for row in rows {
let mut value = HashMap::default(); let mut value = HashMap::default();
for (i, column) in row.columns().iter().enumerate() { for (i, column) in row.columns().iter().enumerate() {
let info = column.type_info(); let v = row.try_get_raw(i)?;
let v = if info.is_null() {
let v = if v.is_null() {
JsonValue::Null JsonValue::Null
} else { } else {
match info.name() { // TODO: postgresql's JSON type
"VARCHAR" | "STRING" | "TEXT" | "DATETIME" | "JSON" => { match v.type_info().name() {
"VARCHAR" | "STRING" | "TEXT" | "TINYTEXT" | "LONGTEXT" | "NVARCHAR"
| "BIGVARCHAR" | "CHAR" | "BIGCHAR" | "NCHAR" | "DATETIME" | "DATE"
| "TIME" | "YEAR" | "TIMESTAMP" => {
if let Ok(s) = row.try_get(i) { if let Ok(s) = row.try_get(i) {
JsonValue::String(s) JsonValue::String(s)
} else { } else {
@ -266,22 +272,25 @@ async fn select(
JsonValue::Bool(x.to_lowercase() == "true") JsonValue::Bool(x.to_lowercase() == "true")
} }
} }
"INT" | "NUMBER" | "INTEGER" | "BIGINT" | "INT8" => { "INT" | "NUMBER" | "INTEGER" | "BIGINT" | "INT2" | "INT4" | "INT8"
| "NUMERIC" | "TINYINT" | "SMALLINT" | "MEDIUMINT" | "TINYINT UNSINGED"
| "SMALLINT UNSINGED" | "INT UNSINGED" | "MEDIUMINT UNSINGED"
| "BIGINT UNSINGED" => {
if let Ok(n) = row.try_get::<i64, usize>(i) { if let Ok(n) = row.try_get::<i64, usize>(i) {
JsonValue::Number(n.into()) JsonValue::Number(n.into())
} else { } else {
JsonValue::Null JsonValue::Null
} }
} }
"REAL" => { "REAL" | "FLOAT" | "DOUBLE" | "FLOAT4" | "FLOAT8" => {
if let Ok(n) = row.try_get::<f64, usize>(i) { if let Ok(n) = row.try_get::<f64, usize>(i) {
JsonValue::from(n) JsonValue::from(n)
} else { } else {
JsonValue::Null JsonValue::Null
} }
} }
// "JSON" => JsonValue::Object(row.get(i)), "BLOB" | "TINYBLOB" | "MEDIUMBLOB" | "LONGBLOB" | "BINARY" | "VARBINARY"
"BLOB" => { | "BYTEA" => {
if let Ok(n) = row.try_get::<Vec<u8>, usize>(i) { if let Ok(n) = row.try_get::<Vec<u8>, usize>(i) {
JsonValue::Array( JsonValue::Array(
n.into_iter().map(|n| JsonValue::Number(n.into())).collect(), n.into_iter().map(|n| JsonValue::Number(n.into())).collect(),
@ -290,13 +299,16 @@ async fn select(
JsonValue::Null JsonValue::Null
} }
} }
_ => JsonValue::Null, _ => return Err(Error::UnsupportedDatatype(v.type_info().name().to_string())),
} }
}; };
value.insert(column.name().to_string(), v); value.insert(column.name().to_string(), v);
} }
values.push(value); values.push(value);
} }
Ok(values) Ok(values)
} }

Loading…
Cancel
Save