taler-rust

GNU Taler code in Rust. Largely core banking integrations.
Log | Files | Refs | Submodules | README | LICENSE

commit 17f8dea6a098ca7bffb8813b0802f555680da502
parent f5d4d0f3e81d2648b26a16264df01d3d379278c9
Author: Antoine A <>
Date:   Tue, 10 Mar 2026 12:10:37 +0100

common: db get_flag for cleaner procedure code

Diffstat:
Mcommon/taler-api/db/taler-api-procedures.sql | 2--
Mcommon/taler-api/src/db.rs | 8++++++++
Mcommon/taler-api/tests/common/db.rs | 6+++---
Mtaler-cyclos/db/cyclos-procedures.sql | 3---
Mtaler-cyclos/src/db.rs | 8++++----
Mtaler-magnet-bank/db/magnet-bank-procedures.sql | 3---
Mtaler-magnet-bank/src/db.rs | 8++++----
7 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/common/taler-api/db/taler-api-procedures.sql b/common/taler-api/db/taler-api-procedures.sql @@ -65,10 +65,8 @@ SELECT (amount != in_amount FROM transfer WHERE request_uid = in_request_uid; IF FOUND THEN - out_wtid_reuse=FALSE; RETURN; END IF; -out_request_uid_reuse=FALSE; -- Check for wtid reuse out_wtid_reuse = EXISTS(SELECT FROM transfer WHERE wtid=in_wtid); IF out_wtid_reuse THEN diff --git a/common/taler-api/src/db.rs b/common/taler-api/src/db.rs @@ -217,6 +217,9 @@ pub trait TypeHelper { } fn try_get_amount(&self, index: &str, currency: &Currency) -> sqlx::Result<Amount>; fn try_get_amount_i(&self, index: usize, currency: &Currency) -> sqlx::Result<Amount>; + + /** Flag consider NULL and false to be the same */ + fn try_get_flag<I: sqlx::ColumnIndex<Self>>(&self, index: I) -> sqlx::Result<bool>; } impl TypeHelper for PgRow { @@ -264,4 +267,9 @@ impl TypeHelper for PgRow { self.try_get_decimal(index, index + 1)?, )) } + + fn try_get_flag<I: sqlx::ColumnIndex<Self>>(&self, index: I) -> sqlx::Result<bool> { + let opt_bool: Option<bool> = self.try_get(index)?; + Ok(opt_bool.unwrap_or(false)) + } } diff --git a/common/taler-api/tests/common/db.rs b/common/taler-api/tests/common/db.rs @@ -68,9 +68,9 @@ pub async fn transfer(db: &PgPool, transfer: TransferRequest) -> sqlx::Result<Tr .bind(transfer.wtid.as_slice()) .bind_timestamp(&Timestamp::now()) .try_map(|r: PgRow| { - Ok(if r.try_get("out_request_uid_reuse")? { + Ok(if r.try_get_flag("out_request_uid_reuse")? { TransferResult::RequestUidReuse - } else if r.try_get("out_wtid_reuse")? { + } else if r.try_get_flag("out_wtid_reuse")? { TransferResult::WtidReuse } else { TransferResult::Success(TransferResponse { @@ -226,7 +226,7 @@ pub async fn add_incoming( .bind(key.as_ref().as_slice()) .bind_timestamp(timestamp) .try_map(|r: PgRow| { - Ok(if r.try_get("out_reserve_pub_reuse")? { + Ok(if r.try_get_flag("out_reserve_pub_reuse")? { AddIncomingResult::ReservePubReuse } else { AddIncomingResult::Success { diff --git a/taler-cyclos/db/cyclos-procedures.sql b/taler-cyclos/db/cyclos-procedures.sql @@ -66,7 +66,6 @@ WHERE (in_transfer_id IS NOT NULL AND transfer_id = in_transfer_id) -- Cyclos tr OR (in_transfer_id IS NULL AND amount = in_amount AND debit_account = in_debit_account AND subject = in_subject); -- Admin transaction out_new = NOT found; IF NOT out_new THEN - out_reserve_pub_reuse=false; RETURN; END IF; @@ -272,10 +271,8 @@ INTO out_request_uid_reuse, out_initiated_row_id, out_initiated_at FROM transfer JOIN initiated USING (initiated_id) WHERE request_uid = in_request_uid; IF FOUND THEN - out_wtid_reuse=FALSE; RETURN; END IF; -out_request_uid_reuse=FALSE; -- Check for wtid reuse out_wtid_reuse = EXISTS(SELECT FROM transfer WHERE wtid=in_wtid); IF out_wtid_reuse THEN diff --git a/taler-cyclos/src/db.rs b/taler-cyclos/src/db.rs @@ -222,7 +222,7 @@ pub async fn register_tx_in_admin( .bind(tx.metadata.ty()) .bind(tx.metadata.key()) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { AddIncomingResult::ReservePubReuse } else { AddIncomingResult::Success { @@ -259,7 +259,7 @@ pub async fn register_tx_in( .bind(subject.as_ref().map(|it| it.key())) .bind(now.as_microsecond()) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { AddIncomingResult::ReservePubReuse } else { AddIncomingResult::Success { @@ -378,9 +378,9 @@ pub async fn make_transfer<'a>( .bind(&tx.creditor_name) .bind_timestamp(now) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { TransferResult::RequestUidReuse - } else if r.try_get(1)? { + } else if r.try_get_flag(1)? { TransferResult::WtidReuse } else { TransferResult::Success { diff --git a/taler-magnet-bank/db/magnet-bank-procedures.sql b/taler-magnet-bank/db/magnet-bank-procedures.sql @@ -65,7 +65,6 @@ WHERE (in_code IS NOT NULL AND magnet_code = in_code) -- Magnet transaction OR (in_code IS NULL AND amount = in_amount AND debit_account = in_debit_account AND subject = in_subject); -- Admin transaction out_new = NOT found; IF NOT out_new THEN - out_reserve_pub_reuse=false; RETURN; END IF; @@ -263,10 +262,8 @@ INTO out_request_uid_reuse, out_initiated_row_id, out_initiated_at FROM transfer JOIN initiated USING (initiated_id) WHERE request_uid = in_request_uid; IF FOUND THEN - out_wtid_reuse=FALSE; RETURN; END IF; -out_request_uid_reuse=FALSE; -- Check for wtid reuse out_wtid_reuse = EXISTS(SELECT FROM transfer WHERE wtid=in_wtid); IF out_wtid_reuse THEN diff --git a/taler-magnet-bank/src/db.rs b/taler-magnet-bank/src/db.rs @@ -209,7 +209,7 @@ pub async fn register_tx_in_admin( .bind(tx.metadata.ty()) .bind(tx.metadata.key()) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { AddIncomingResult::ReservePubReuse } else { AddIncomingResult::Success { @@ -245,7 +245,7 @@ pub async fn register_tx_in( .bind(subject.as_ref().map(|it| it.key())) .bind_timestamp(now) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { AddIncomingResult::ReservePubReuse } else { AddIncomingResult::Success { @@ -396,9 +396,9 @@ pub async fn make_transfer<'a>( .bind(&tx.creditor.name) .bind_timestamp(now) .try_map(|r: PgRow| { - Ok(if r.try_get(0)? { + Ok(if r.try_get_flag(0)? { TransferResult::RequestUidReuse - } else if r.try_get(1)? { + } else if r.try_get_flag(1)? { TransferResult::WtidReuse } else { TransferResult::Success {