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:
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 {