From 4c32b0bacf3cd49f1c52f14d86e5bb647d5fc792 Mon Sep 17 00:00:00 2001 From: bitful-pannul Date: Wed, 20 Dec 2023 17:26:47 -0300 Subject: [PATCH 1/2] sqlite: ergonomic functions --- src/sqlite.rs | 163 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 161 insertions(+), 2 deletions(-) diff --git a/src/sqlite.rs b/src/sqlite.rs index b896a4d..812c61b 100644 --- a/src/sqlite.rs +++ b/src/sqlite.rs @@ -1,7 +1,7 @@ +use std::collections::HashMap; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::package_id::PackageId; - +use crate::{PackageId, Request, Message, get_payload}; #[derive(Debug, Serialize, Deserialize)] pub struct SqliteRequest { @@ -70,3 +70,162 @@ pub enum SqliteError { #[error("sqlite: input bytes/json/key error: {error}")] InputError { error: String }, } + +pub fn new( + package_id: PackageId, + db: String, +) -> anyhow::Result<()> { + let res = Request::new() + .target(("our", "sqlite", "sys", "uqbar")) + .ipc(serde_json::to_vec(&SqliteRequest { + package_id, + db, + action: SqliteAction::New, + })?) + .send_and_await_response(5)?; + + match res { + Ok(Message::Response { ipc, .. }) => { + let resp = serde_json::from_slice::(&ipc).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + + if let SqliteResponse::Ok = resp { + Ok(()) + } else { + Err(anyhow::anyhow!("sqlite: unexpected response: {:?}", resp)) + } + }, + _ => return Err(anyhow::anyhow!("sqlite: unexpected response")), + } +} + +pub fn read( + package_id: PackageId, + db: String, + query: String, + params: Vec, +) -> anyhow::Result>> { + let res = Request::new() + .target(("our", "sqlite", "sys", "uqbar")) + .ipc(serde_json::to_vec(&SqliteRequest { + package_id, + db, + action: SqliteAction::Read { query }, + })?) + .payload_bytes(serde_json::to_vec(¶ms)?) + .send_and_await_response(5)?; + + match res { + Ok(Message::Response { ipc, .. }) => { + let resp = serde_json::from_slice::(&ipc).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + + if let SqliteResponse::Read = resp { + let payload = get_payload().ok_or_else(|| SqliteError::InputError { + error: format!("sqlite: no payload"), + })?; + let values = serde_json::from_slice::>>(&payload.bytes).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + Ok(values) + } else { + Err(anyhow::anyhow!("sqlite: unexpected response: {:?}", resp)) + } + }, + _ => return Err(anyhow::anyhow!("sqlite: unexpected response")), + } +} + +pub fn write( + package_id: PackageId, + db: String, + statement: String, + params: Vec, + tx_id: Option, +) -> anyhow::Result<()> { + let res = Request::new() + .target(("our", "sqlite", "sys", "uqbar")) + .ipc(serde_json::to_vec(&SqliteRequest { + package_id, + db, + action: SqliteAction::Write { statement, tx_id }, + })?) + .payload_bytes(serde_json::to_vec(¶ms)?) + .send_and_await_response(5)?; + + match res { + Ok(Message::Response { ipc, .. }) => { + let resp = serde_json::from_slice::(&ipc).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + + if let SqliteResponse::Ok = resp { + Ok(()) + } else { + Err(anyhow::anyhow!("sqlite: unexpected response: {:?}", resp)) + } + }, + _ => return Err(anyhow::anyhow!("sqlite: unexpected response")), + } +} + +pub fn begin_tx( + package_id: PackageId, + db: String, +) -> anyhow::Result { + let res = Request::new() + .target(("our", "sqlite", "sys", "uqbar")) + .ipc(serde_json::to_vec(&SqliteRequest { + package_id, + db, + action: SqliteAction::BeginTx, + })?) + .send_and_await_response(5)?; + + match res { + Ok(Message::Response { ipc, .. }) => { + let resp = serde_json::from_slice::(&ipc).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + + if let SqliteResponse::BeginTx { tx_id } = resp { + Ok(tx_id) + } else { + Err(anyhow::anyhow!("sqlite: unexpected response: {:?}", resp)) + } + }, + _ => return Err(anyhow::anyhow!("sqlite: unexpected response")), + } +} + +pub fn commit_tx( + package_id: PackageId, + db: String, + tx_id: u64, +) -> anyhow::Result<()> { + let res = Request::new() + .target(("our", "sqlite", "sys", "uqbar")) + .ipc(serde_json::to_vec(&SqliteRequest { + package_id, + db, + action: SqliteAction::Commit { tx_id }, + })?) + .send_and_await_response(5)?; + + match res { + Ok(Message::Response { ipc, .. }) => { + let resp = serde_json::from_slice::(&ipc).map_err(|e| SqliteError::InputError { + error: format!("sqlite: gave unparsable response: {}", e), + })?; + + if let SqliteResponse::Ok = resp { + Ok(()) + } else { + Err(anyhow::anyhow!("sqlite: unexpected response: {:?}", resp)) + } + }, + _ => return Err(anyhow::anyhow!("sqlite: unexpected response")), + } +} \ No newline at end of file From e6ec39103539997e0c420fd79e92bb10978724ce Mon Sep 17 00:00:00 2001 From: bitful-pannul Date: Wed, 20 Dec 2023 18:36:46 -0300 Subject: [PATCH 2/2] sqlite: json input hotfix --- src/sqlite.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sqlite.rs b/src/sqlite.rs index 812c61b..2f8c336 100644 --- a/src/sqlite.rs +++ b/src/sqlite.rs @@ -142,7 +142,7 @@ pub fn write( package_id: PackageId, db: String, statement: String, - params: Vec, + params: Vec, tx_id: Option, ) -> anyhow::Result<()> { let res = Request::new()