mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-09-26 21:41:48 +02:00
fix(sql): derive datatype from value, not colomn (#118)
This commit is contained in:
+22
-10
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user