gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] 05/07: fix #5010 for /track/transaction


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] 05/07: fix #5010 for /track/transaction
Date: Mon, 19 Jun 2017 21:18:03 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

commit 703c54a279af8441e1a1e686f71d26bcd69bfd7d
Author: Christian Grothoff <address@hidden>
AuthorDate: Mon Jun 19 20:46:24 2017 +0200

    fix #5010 for /track/transaction
---
 src/exchange/taler-exchange-httpd_admin.c          |  75 ++++++-
 src/exchange/taler-exchange-httpd_db.c             |  64 ------
 src/exchange/taler-exchange-httpd_db.h             |  22 ---
 .../taler-exchange-httpd_track_transaction.c       | 219 +++++++++++----------
 src/exchangedb/plugin_exchangedb_postgres.c        | 159 ++++++---------
 src/exchangedb/test_exchangedb.c                   |   4 +-
 src/include/taler_exchangedb_plugin.h              |   5 +-
 7 files changed, 248 insertions(+), 300 deletions(-)

diff --git a/src/exchange/taler-exchange-httpd_admin.c 
b/src/exchange/taler-exchange-httpd_admin.c
index 8bb4b49..e40775f 100644
--- a/src/exchange/taler-exchange-httpd_admin.c
+++ b/src/exchange/taler-exchange-httpd_admin.c
@@ -27,6 +27,69 @@
 #include "taler-exchange-httpd_validation.h"
 
 
+/**
+ * Add an incoming transaction to the database.  Checks if the
+ * transaction is fresh (not a duplicate) and if so adds it to
+ * the database.
+ *
+ * @param connection the MHD connection to handle
+ * @param reserve_pub public key of the reserve
+ * @param amount amount to add to the reserve
+ * @param execution_time when did we receive the wire transfer
+ * @param sender_account_details which account send the funds
+ * @param transfer_details information that uniquely identifies the transfer
+ * @return MHD result code
+ */
+static int
+execute_admin_add_incoming (struct MHD_Connection *connection,
+                           const struct TALER_ReservePublicKeyP *reserve_pub,
+                           const struct TALER_Amount *amount,
+                           struct GNUNET_TIME_Absolute execution_time,
+                           const json_t *sender_account_details,
+                           const json_t *transfer_details)
+{
+  struct TALER_EXCHANGEDB_Session *session;
+  int ret;
+  void *json_str;
+
+  if (NULL == (session = TEH_plugin->get_session (TEH_plugin->cls)))
+  {
+    GNUNET_break (0);
+    return TEH_RESPONSE_reply_internal_db_error (connection,
+                                                TALER_EC_DB_SETUP_FAILED);
+  }
+  json_str = json_dumps (transfer_details,
+                         JSON_INDENT(2));
+  if (NULL == json_str)
+  {
+    GNUNET_break (0);
+    return TEH_RESPONSE_reply_internal_db_error (connection,
+                                                TALER_EC_PARSER_OUT_OF_MEMORY);
+  }
+  ret = TEH_plugin->reserves_in_insert (TEH_plugin->cls,
+                                        session,
+                                        reserve_pub,
+                                        amount,
+                                        execution_time,
+                                        sender_account_details,
+                                        json_str,
+                                        strlen (json_str));
+  free (json_str);
+  if (GNUNET_SYSERR == ret)
+  {
+    GNUNET_break (0);
+    return TEH_RESPONSE_reply_internal_db_error (connection,
+                                                
TALER_EC_ADMIN_ADD_INCOMING_DB_STORE);
+  }
+  return TEH_RESPONSE_reply_json_pack (connection,
+                                       MHD_HTTP_OK,
+                                       "{s:s}",
+                                       "status",
+                                       (GNUNET_OK == ret)
+                                       ? "NEW"
+                                       : "DUP");
+}
+
 
 /**
  * Handle a "/admin/add/incoming" request.  Parses the
@@ -108,12 +171,12 @@ TEH_ADMIN_handler_admin_add_incoming (struct 
TEH_RequestHandler *rh,
                                           
TALER_EC_ADMIN_ADD_INCOMING_CURRENCY_UNSUPPORTED,
                                            "amount:currency");
   }
-  res = TEH_DB_execute_admin_add_incoming (connection,
-                                           &reserve_pub,
-                                           &amount,
-                                           at,
-                                           sender_account_details,
-                                           transfer_details);
+  res = execute_admin_add_incoming (connection,
+                                   &reserve_pub,
+                                   &amount,
+                                   at,
+                                   sender_account_details,
+                                   transfer_details);
   GNUNET_JSON_parse_free (spec);
   return res;
 }
diff --git a/src/exchange/taler-exchange-httpd_db.c 
b/src/exchange/taler-exchange-httpd_db.c
index bed2a7f..9871b7f 100644
--- a/src/exchange/taler-exchange-httpd_db.c
+++ b/src/exchange/taler-exchange-httpd_db.c
@@ -1145,68 +1145,4 @@ TEH_DB_execute_refresh_link (struct MHD_Connection 
*connection,
 }
 
 
-/**
- * Add an incoming transaction to the database.  Checks if the
- * transaction is fresh (not a duplicate) and if so adds it to
- * the database.
- *
- * @param connection the MHD connection to handle
- * @param reserve_pub public key of the reserve
- * @param amount amount to add to the reserve
- * @param execution_time when did we receive the wire transfer
- * @param sender_account_details which account send the funds
- * @param transfer_details information that uniquely identifies the transfer
- * @return MHD result code
- */
-int
-TEH_DB_execute_admin_add_incoming (struct MHD_Connection *connection,
-                                   const struct TALER_ReservePublicKeyP 
*reserve_pub,
-                                   const struct TALER_Amount *amount,
-                                   struct GNUNET_TIME_Absolute execution_time,
-                                   const json_t *sender_account_details,
-                                   const json_t *transfer_details)
-{
-  struct TALER_EXCHANGEDB_Session *session;
-  int ret;
-  void *json_str;
-
-  if (NULL == (session = TEH_plugin->get_session (TEH_plugin->cls)))
-  {
-    GNUNET_break (0);
-    return TEH_RESPONSE_reply_internal_db_error (connection,
-                                                TALER_EC_DB_SETUP_FAILED);
-  }
-  json_str = json_dumps (transfer_details,
-                         JSON_INDENT(2));
-  if (NULL == json_str)
-  {
-    GNUNET_break (0);
-    return TEH_RESPONSE_reply_internal_db_error (connection,
-                                                TALER_EC_PARSER_OUT_OF_MEMORY);
-  }
-  ret = TEH_plugin->reserves_in_insert (TEH_plugin->cls,
-                                        session,
-                                        reserve_pub,
-                                        amount,
-                                        execution_time,
-                                        sender_account_details,
-                                        json_str,
-                                        strlen (json_str));
-  free (json_str);
-  if (GNUNET_SYSERR == ret)
-  {
-    GNUNET_break (0);
-    return TEH_RESPONSE_reply_internal_db_error (connection,
-                                                
TALER_EC_ADMIN_ADD_INCOMING_DB_STORE);
-  }
-  return TEH_RESPONSE_reply_json_pack (connection,
-                                       MHD_HTTP_OK,
-                                       "{s:s}",
-                                       "status",
-                                       (GNUNET_OK == ret)
-                                       ? "NEW"
-                                       : "DUP");
-}
-
-
 /* end of taler-exchange-httpd_db.c */
diff --git a/src/exchange/taler-exchange-httpd_db.h 
b/src/exchange/taler-exchange-httpd_db.h
index 662f034..85a1604 100644
--- a/src/exchange/taler-exchange-httpd_db.h
+++ b/src/exchange/taler-exchange-httpd_db.h
@@ -175,27 +175,5 @@ int
 TEH_DB_execute_refresh_link (struct MHD_Connection *connection,
                              const struct TALER_CoinSpendPublicKeyP *coin_pub);
 
-
-
-/**
- * Add an incoming transaction to the database.
- *
- * @param connection the MHD connection to handle
- * @param reserve_pub public key of the reserve
- * @param amount amount to add to the reserve
- * @param execution_time when did we receive the wire transfer
- * @param sender_account_details which account send the funds
- * @param transfer_details information that uniquely identifies the transfer
- * @return MHD result code
- */
-int
-TEH_DB_execute_admin_add_incoming (struct MHD_Connection *connection,
-                                   const struct TALER_ReservePublicKeyP 
*reserve_pub,
-                                   const struct TALER_Amount *amount,
-                                   struct GNUNET_TIME_Absolute execution_time,
-                                   const json_t *sender_account_details,
-                                   const json_t *transfer_details);
-
-
 #endif
 /* TALER_EXCHANGE_HTTPD_DB_H */
diff --git a/src/exchange/taler-exchange-httpd_track_transaction.c 
b/src/exchange/taler-exchange-httpd_track_transaction.c
index b617021..7c4052f 100644
--- a/src/exchange/taler-exchange-httpd_track_transaction.c
+++ b/src/exchange/taler-exchange-httpd_track_transaction.c
@@ -44,14 +44,14 @@
  * @param exec_time execution time of the wire transfer
  * @return MHD result code
  */
-int
-TEH_RESPONSE_reply_track_transaction (struct MHD_Connection *connection,
-                                      const struct GNUNET_HashCode 
*h_contract_terms,
-                                      const struct GNUNET_HashCode *h_wire,
-                                      const struct TALER_CoinSpendPublicKeyP 
*coin_pub,
-                                      const struct TALER_Amount 
*coin_contribution,
-                                      const struct 
TALER_WireTransferIdentifierRawP *wtid,
-                                      struct GNUNET_TIME_Absolute exec_time)
+static int
+reply_track_transaction (struct MHD_Connection *connection,
+                        const struct GNUNET_HashCode *h_contract_terms,
+                        const struct GNUNET_HashCode *h_wire,
+                        const struct TALER_CoinSpendPublicKeyP *coin_pub,
+                        const struct TALER_Amount *coin_contribution,
+                        const struct TALER_WireTransferIdentifierRawP *wtid,
+                        struct GNUNET_TIME_Absolute exec_time)
 {
   struct TALER_ConfirmWirePS cw;
   struct TALER_ExchangePublicKeyP pub;
@@ -87,29 +87,47 @@ struct DepositWtidContext
 {
 
   /**
-   * Where should we send the reply?
+   * Deposit details.
    */
-  struct MHD_Connection *connection;
+  const struct TALER_DepositTrackPS *tps;
 
   /**
-   * Hash of the proposal data we are looking up.
+   * Public key of the merchant.
    */
-  struct GNUNET_HashCode h_contract_terms;
+  const struct TALER_MerchantPublicKeyP *merchant_pub;
+  
+  /**
+   * Set by #handle_wtid data to the wire transfer ID.
+   */ 
+  struct TALER_WireTransferIdentifierRawP wtid;
+  
+  /**
+   * Set by #handle_wtid data to the coin's contribution to the wire transfer.
+   */ 
+  struct TALER_Amount coin_contribution;
+  
+  /**
+   * Set by #handle_wtid data to the fee charged to the coin.
+   */ 
+  struct TALER_Amount coin_fee;
 
   /**
-   * Hash of the wire transfer details we are looking up.
-   */
-  struct GNUNET_HashCode h_wire;
+   * Set by #handle_wtid data to the wire transfer execution time.
+   */ 
+  struct GNUNET_TIME_Absolute execution_time;
 
   /**
-   * Public key we are looking up.
+   * Set by #handle_wtid to the coin contribution to the transaction
+   * (that is, @e coin_contribution minus @e coin_fee).
    */
-  struct TALER_CoinSpendPublicKeyP coin_pub;
+  struct TALER_Amount coin_delta;
 
   /**
-   * MHD result code to return.
+   * Set to #GNUNET_YES by #handle_wtid if the wire transfer is still pending
+   * (and the above were not set).
+   * Set to #GNUNET_SYSERR if there was a serious error.
    */
-  int res;
+  int pending;
 };
 
 
@@ -136,35 +154,26 @@ handle_wtid_data (void *cls,
                  struct GNUNET_TIME_Absolute execution_time)
 {
   struct DepositWtidContext *ctx = cls;
-  struct TALER_Amount coin_delta;
 
   if (NULL == wtid)
   {
-    ctx->res = TEH_RESPONSE_reply_transfer_pending (ctx->connection,
-                                                    execution_time);
+    ctx->pending = GNUNET_YES;
+    ctx->execution_time = execution_time;
+    return;
   }
-  else
+  if (GNUNET_SYSERR ==
+      TALER_amount_subtract (&ctx->coin_delta,
+                            coin_contribution,
+                            coin_fee))
   {
-    if (GNUNET_SYSERR ==
-        TALER_amount_subtract (&coin_delta,
-                               coin_contribution,
-                               coin_fee))
-    {
-      GNUNET_break (0);
-      ctx->res = TEH_RESPONSE_reply_internal_db_error (ctx->connection,
-                                                      
TALER_EC_TRACK_TRANSACTION_DB_FEE_INCONSISTENT);
-    }
-    else
-    {
-      ctx->res = TEH_RESPONSE_reply_track_transaction (ctx->connection,
-                                                       &ctx->h_contract_terms,
-                                                       &ctx->h_wire,
-                                                       &ctx->coin_pub,
-                                                       &coin_delta,
-                                                       wtid,
-                                                       execution_time);
-    }
+    GNUNET_break (0);
+    ctx->pending = GNUNET_SYSERR;
+    return;
   }
+  ctx->wtid = *wtid;
+  ctx->execution_time = execution_time;
+  ctx->coin_contribution = *coin_contribution;
+  ctx->coin_fee = *coin_fee;
 }
 
 
@@ -172,64 +181,53 @@ handle_wtid_data (void *cls,
  * Execute a "/track/transaction".  Returns the transfer information
  * associated with the given deposit.
  *
- * @param connection the MHD connection to handle
- * @param h_contract_terms hash of the proposal data
- * @param h_wire hash of the wire details
- * @param coin_pub public key of the coin to link
- * @param merchant_pub public key of the merchant
- * @return MHD result code
+ * If it returns a non-error code, the transaction logic MUST
+ * NOT queue a MHD response.  IF it returns an hard error, the
+ * transaction logic MUST queue a MHD response and set @a mhd_ret.  IF
+ * it returns the soft error code, the function MAY be called again to
+ * retry and MUST not queue a MHD response.
+ *
+ * @param cls closure of type `struct DepositWtidContext *`
+ * @param connection MHD request which triggered the transaction
+ * @param session database session to use
+ * @param[out] mhd_ret set to MHD response status for @a connection,
+ *             if transaction failed (!)
+ * @return transaction status
  */
-int
-TEH_DB_execute_track_transaction (struct MHD_Connection *connection,
-                                  const struct GNUNET_HashCode 
*h_contract_terms,
-                                  const struct GNUNET_HashCode *h_wire,
-                                  const struct TALER_CoinSpendPublicKeyP 
*coin_pub,
-                                  const struct TALER_MerchantPublicKeyP 
*merchant_pub)
+static enum GNUNET_DB_QueryStatus
+track_transaction_transaction (void *cls,
+                              struct MHD_Connection *connection,
+                              struct TALER_EXCHANGEDB_Session *session,
+                              int *mhd_ret)
 {
-  int ret;
-  struct DepositWtidContext ctx;
-  struct TALER_EXCHANGEDB_Session *session;
+  struct DepositWtidContext *ctx = cls;
+  enum GNUNET_DB_QueryStatus qs;
 
-  if (NULL == (session = TEH_plugin->get_session (TEH_plugin->cls)))
-  {
-    GNUNET_break (0);
-    return TEH_RESPONSE_reply_internal_db_error (connection,
-                                                TALER_EC_DB_SETUP_FAILED);
-  }
-  ctx.connection = connection;
-  ctx.h_contract_terms = *h_contract_terms;
-  ctx.h_wire = *h_wire;
-  ctx.coin_pub = *coin_pub;
-  ctx.res = GNUNET_SYSERR;
-  ret = TEH_plugin->wire_lookup_deposit_wtid (TEH_plugin->cls,
-                                              session,
-                                             h_contract_terms,
-                                             h_wire,
-                                             coin_pub,
-                                             merchant_pub,
-                                             &handle_wtid_data,
-                                             &ctx);
-  if (GNUNET_SYSERR == ret)
-  {
-    GNUNET_break (0);
-    GNUNET_break (GNUNET_SYSERR == ctx.res);
-    return TEH_RESPONSE_reply_internal_db_error (connection,
-                                                
TALER_EC_TRACK_TRANSACTION_DB_FETCH_FAILED);
-  }
-  if (GNUNET_NO == ret)
+  qs = TEH_plugin->wire_lookup_deposit_wtid (TEH_plugin->cls,
+                                            session,
+                                            &ctx->tps->h_contract_terms,
+                                            &ctx->tps->h_wire,
+                                            &ctx->tps->coin_pub,
+                                            ctx->merchant_pub,
+                                            &handle_wtid_data,
+                                            ctx);
+  if (0 > qs)
   {
-    GNUNET_break (GNUNET_SYSERR == ctx.res);
-    return TEH_RESPONSE_reply_transaction_unknown (connection,
-                                                  
TALER_EC_TRACK_TRANSACTION_NOT_FOUND);
+    if (GNUNET_DB_STATUS_HARD_ERROR == qs)
+    {
+      GNUNET_break (0);
+      *mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
+                                                      
TALER_EC_TRACK_TRANSACTION_DB_FETCH_FAILED);
+    }
+    return qs;
   }
-  if (GNUNET_SYSERR == ctx.res)
+  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
   {
-    GNUNET_break (0);
-    return TEH_RESPONSE_reply_internal_error (connection,
-                                             
TALER_EC_TRACK_TRANSACTION_WTID_RESOLUTION_ERROR,
-                                              "bug resolving deposit wtid");
+    *mhd_ret = TEH_RESPONSE_reply_transaction_unknown (connection,
+                                                      
TALER_EC_TRACK_TRANSACTION_NOT_FOUND);
+    return GNUNET_DB_STATUS_HARD_ERROR;
   }
-  return ctx.res;
+  return qs;
 }
 
 
@@ -246,9 +244,12 @@ TEH_DB_execute_track_transaction (struct MHD_Connection 
*connection,
 static int
 check_and_handle_track_transaction_request (struct MHD_Connection *connection,
                                             const struct TALER_DepositTrackPS 
*tps,
-                                            struct TALER_MerchantPublicKeyP 
*merchant_pub,
-                                            struct TALER_MerchantSignatureP 
*merchant_sig)
+                                            const struct 
TALER_MerchantPublicKeyP *merchant_pub,
+                                            const struct 
TALER_MerchantSignatureP *merchant_sig)
 {
+  struct DepositWtidContext ctx;
+  int mhd_ret;
+
   if (GNUNET_OK !=
       GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
                                  &tps->purpose,
@@ -260,11 +261,29 @@ check_and_handle_track_transaction_request (struct 
MHD_Connection *connection,
                                                 
TALER_EC_TRACK_TRANSACTION_MERCHANT_SIGNATURE_INVALID,
                                                 "merchant_sig");
   }
-  return TEH_DB_execute_track_transaction (connection,
-                                           &tps->h_contract_terms,
-                                           &tps->h_wire,
-                                           &tps->coin_pub,
-                                           merchant_pub);
+  ctx.pending = GNUNET_NO;
+  ctx.tps = tps;
+  ctx.merchant_pub = merchant_pub;
+  
+  if (GNUNET_OK !=
+      TEH_DB_run_transaction (connection,
+                             &mhd_ret,
+                             &track_transaction_transaction,
+                             &ctx))
+    return mhd_ret;
+  if (GNUNET_YES == ctx.pending)
+    return TEH_RESPONSE_reply_transfer_pending (connection,
+                                               ctx.execution_time);
+  if (GNUNET_SYSERR == ctx.pending)
+    return TEH_RESPONSE_reply_internal_db_error (connection,
+                                                
TALER_EC_TRACK_TRANSACTION_DB_FEE_INCONSISTENT);
+  return reply_track_transaction (connection,
+                                 &tps->h_contract_terms,
+                                 &tps->h_wire,
+                                 &tps->coin_pub,
+                                 &ctx.coin_delta,
+                                 &ctx.wtid,
+                                 ctx.execution_time);
 }
 
 
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 2f05c02..b029db5 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -4584,10 +4584,9 @@ postgres_lookup_wire_transfer (void *cls,
  * @param merchant_pub merchant public key
  * @param cb function to call with the result
  * @param cb_cls closure to pass to @a cb
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on DB errors,
- *         #GNUNET_NO if nothing was found
+ * @return transaction status code
  */
-static int
+static enum GNUNET_DB_QueryStatus
 postgres_wire_lookup_deposit_wtid (void *cls,
                                    struct TALER_EXCHANGEDB_Session *session,
                                   const struct GNUNET_HashCode 
*h_contract_terms,
@@ -4597,7 +4596,7 @@ postgres_wire_lookup_deposit_wtid (void *cls,
                                   TALER_EXCHANGEDB_TrackTransactionCallback cb,
                                   void *cb_cls)
 {
-  PGresult *result;
+  enum GNUNET_DB_QueryStatus qs;
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (coin_pub),
     GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
@@ -4605,122 +4604,76 @@ postgres_wire_lookup_deposit_wtid (void *cls,
     GNUNET_PQ_query_param_auto_from_type (merchant_pub),
     GNUNET_PQ_query_param_end
   };
-  int nrows;
-
+  struct TALER_WireTransferIdentifierRawP wtid;
+  struct GNUNET_TIME_Absolute exec_time;
+  struct TALER_Amount amount_with_fee;
+  struct TALER_Amount deposit_fee;
+  struct GNUNET_PQ_ResultSpec rs[] = {
+    GNUNET_PQ_result_spec_auto_from_type ("wtid_raw", &wtid),
+    GNUNET_PQ_result_spec_absolute_time ("execution_date", &exec_time),
+    TALER_PQ_result_spec_amount ("amount_with_fee", &amount_with_fee),
+    TALER_PQ_result_spec_amount ("fee_deposit", &deposit_fee),
+    GNUNET_PQ_result_spec_end
+  };
+  
   /* check if the melt record exists and get it */
-  result = GNUNET_PQ_exec_prepared (session->conn,
-                                    "lookup_deposit_wtid",
-                                    params);
-  if (PGRES_TUPLES_OK != PQresultStatus (result))
+  qs = GNUNET_PQ_eval_prepared_singleton_select (session->conn,
+                                                "lookup_deposit_wtid",
+                                                params,
+                                                rs);
+  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
   {
-    BREAK_DB_ERR (result, session->conn);
-    PQclear (result);
-    return GNUNET_SYSERR;
+    cb (cb_cls,
+        &wtid,
+        &amount_with_fee,
+        &deposit_fee,
+        exec_time);
+    return qs;
   }
-  nrows = PQntuples (result);
-  if (0 == nrows)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "lookup_deposit_wtid returned 0 matching rows\n");
-    PQclear (result);
+  if (0 > qs)
+    return qs;
 
+  GNUNET_assert (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "lookup_deposit_wtid returned 0 matching rows\n");
+  {
     /* Check if transaction exists in deposits, so that we just
        do not have a WTID yet, if so, do call the CB with a NULL wtid
        and return #GNUNET_YES! */
-    {
-      struct GNUNET_PQ_QueryParam params2[] = {
-        GNUNET_PQ_query_param_auto_from_type (coin_pub),
-        GNUNET_PQ_query_param_auto_from_type (merchant_pub),
-        GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
-        GNUNET_PQ_query_param_auto_from_type (h_wire),
-        GNUNET_PQ_query_param_end
-      };
-
-      result = GNUNET_PQ_exec_prepared (session->conn,
-                                        "get_deposit_for_wtid",
-                                        params2);
-      if (PGRES_TUPLES_OK != PQresultStatus (result))
-      {
-        BREAK_DB_ERR (result, session->conn);
-        PQclear (result);
-        return GNUNET_SYSERR;
-      }
-    }
-    nrows = PQntuples (result);
-    if (0 == nrows)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "get_deposit_for_wtid returned 0 matching rows\n");
-      PQclear (result);
-      return GNUNET_NO;
-    }
-
-    /* Ok, we're aware of the transaction, but it has not yet been
-       executed */
-    {
-      struct GNUNET_TIME_Absolute exec_time;
-      struct TALER_Amount amount_with_fee;
-      struct TALER_Amount deposit_fee;
-      struct GNUNET_PQ_ResultSpec rs[] = {
-        TALER_PQ_result_spec_amount ("amount_with_fee", &amount_with_fee),
-        TALER_PQ_result_spec_amount ("fee_deposit", &deposit_fee),
-        GNUNET_PQ_result_spec_absolute_time ("wire_deadline", &exec_time),
-        GNUNET_PQ_result_spec_end
-      };
-
-      if (GNUNET_OK !=
-          GNUNET_PQ_extract_result (result,
-                                    rs,
-                                    0))
-      {
-        GNUNET_break (0);
-        PQclear (result);
-        return GNUNET_SYSERR;
-      }
-      cb (cb_cls,
-          NULL,
-          &amount_with_fee,
-          &deposit_fee,
-          exec_time);
-      PQclear (result);
-      return GNUNET_YES;
-    }
-  }
-  if (1 != nrows)
-  {
-    GNUNET_break (0);
-    PQclear (result);
-    return GNUNET_SYSERR;
-  }
-  {
-    struct TALER_WireTransferIdentifierRawP wtid;
+    struct GNUNET_PQ_QueryParam params2[] = {
+      GNUNET_PQ_query_param_auto_from_type (coin_pub),
+      GNUNET_PQ_query_param_auto_from_type (merchant_pub),
+      GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
+      GNUNET_PQ_query_param_auto_from_type (h_wire),
+      GNUNET_PQ_query_param_end
+    };
     struct GNUNET_TIME_Absolute exec_time;
     struct TALER_Amount amount_with_fee;
     struct TALER_Amount deposit_fee;
-    struct GNUNET_PQ_ResultSpec rs[] = {
-      GNUNET_PQ_result_spec_auto_from_type ("wtid_raw", &wtid),
-      GNUNET_PQ_result_spec_absolute_time ("execution_date", &exec_time),
+    struct GNUNET_PQ_ResultSpec rs2[] = {
       TALER_PQ_result_spec_amount ("amount_with_fee", &amount_with_fee),
       TALER_PQ_result_spec_amount ("fee_deposit", &deposit_fee),
+      GNUNET_PQ_result_spec_absolute_time ("wire_deadline", &exec_time),
       GNUNET_PQ_result_spec_end
     };
-    if (GNUNET_OK !=
-        GNUNET_PQ_extract_result (result,
-                                  rs,
-                                  0))
+
+    qs = GNUNET_PQ_eval_prepared_singleton_select (session->conn,
+                                                  "get_deposit_for_wtid",
+                                                  params2,
+                                                  rs2);
+    if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
     {
-      GNUNET_break (0);
-      PQclear (result);
-      return GNUNET_SYSERR;
+      /* Ok, we're aware of the transaction, but it has not yet been
+        executed */
+      cb (cb_cls,
+          NULL,
+          &amount_with_fee,
+          &deposit_fee,
+          exec_time);
+      return qs;
     }
-    cb (cb_cls,
-        &wtid,
-        &amount_with_fee,
-        &deposit_fee,
-        exec_time);
+    return qs;
   }
-  PQclear (result);
-  return GNUNET_OK;
 }
 
 
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index 5c33418..9a58a38 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1313,7 +1313,7 @@ test_wire_out (struct TALER_EXCHANGEDB_Session *session,
     struct GNUNET_HashCode h_contract_terms_wt2 = h_contract_terms_wt;
 
     h_contract_terms_wt2.bits[0]++;
-    FAILIF (GNUNET_NO !=
+    FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
             plugin->wire_lookup_deposit_wtid (plugin->cls,
                                               session,
                                               &h_contract_terms_wt2,
@@ -1350,7 +1350,7 @@ test_wire_out (struct TALER_EXCHANGEDB_Session *session,
                                         &wire_out_wtid,
                                         &cb_wt_check,
                                         &cb_wt_never));
-  FAILIF (GNUNET_OK !=
+  FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
           plugin->wire_lookup_deposit_wtid (plugin->cls,
                                             session,
                                             &h_contract_terms_wt,
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index 8795811..23e80c0 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -1754,10 +1754,9 @@ struct TALER_EXCHANGEDB_Plugin
    * @param merchant_pub merchant public key
    * @param cb function to call with the result
    * @param cb_cls closure to pass to @a cb
-   * @return #GNUNET_OK on success, #GNUNET_SYSERR on DB errors,
-   *         #GNUNET_NO if nothing was found
+   * @return transaction status code
    */
-  int
+  enum GNUNET_DB_QueryStatus
   (*wire_lookup_deposit_wtid)(void *cls,
                               struct TALER_EXCHANGEDB_Session *session,
                              const struct GNUNET_HashCode *h_contract_terms,

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]