diff options
| author | Christian Grothoff <christian@grothoff.org> | 2017-06-23 14:37:53 +0200 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2017-06-23 14:37:53 +0200 | 
| commit | 6acb0271d6413b250cf78b42aed52a9cb0d0869c (patch) | |
| tree | bad5474df053edbbe6ad877468365f6387ab9c73 /src | |
| parent | ff8633910d90d7c5299016bce7a8ea49e12510a7 (diff) | |
address #5010 for wirewatch
Diffstat (limited to 'src')
| -rw-r--r-- | src/exchange/taler-exchange-wirewatch.c | 54 | ||||
| -rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 52 | ||||
| -rw-r--r-- | src/exchangedb/test_exchangedb.c | 8 | ||||
| -rw-r--r-- | src/include/taler_exchangedb_plugin.h | 8 | 
4 files changed, 54 insertions, 68 deletions
| diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c index f019f9bc..312f8ac5 100644 --- a/src/exchange/taler-exchange-wirewatch.c +++ b/src/exchange/taler-exchange-wirewatch.c @@ -223,7 +223,7 @@ history_cb (void *cls,  	    const struct TALER_WIRE_TransferDetails *details)  {    struct TALER_EXCHANGEDB_Session *session = cls; -  int ret; +  enum GNUNET_DB_QueryStatus qs;    if (TALER_BANK_DIRECTION_NONE == dir)    { @@ -231,9 +231,9 @@ history_cb (void *cls,      GNUNET_log (GNUNET_ERROR_TYPE_INFO,                  "End of list. Committing progress!\n"); -    ret = db_plugin->commit (db_plugin->cls, -			     session); -    if (GNUNET_OK == ret) +    qs = db_plugin->commit (db_plugin->cls, +			    session); +    if (0 <= qs)      {        GNUNET_free_non_null (start_off);        start_off = last_row_off; @@ -258,18 +258,25 @@ history_cb (void *cls,                "Adding wire transfer over %s with subject `%s'\n",                TALER_amount2s (&details->amount),                TALER_B2S (&details->reserve_pub)); -  ret = db_plugin->reserves_in_insert (db_plugin->cls, -				       session, -				       &details->reserve_pub, -				       &details->amount, -				       details->execution_date, -				       details->account_details, -                                       row_off, -                                       row_off_size); -  if (GNUNET_OK != ret) +  qs = db_plugin->reserves_in_insert (db_plugin->cls, +				      session, +				      &details->reserve_pub, +				      &details->amount, +				      details->execution_date, +				      details->account_details, +				      row_off, +				      row_off_size); +  if (GNUNET_DB_STATUS_HARD_ERROR == qs)    {      GNUNET_break (0);      db_plugin->rollback (db_plugin->cls, +			 session); +    GNUNET_SCHEDULER_shutdown (); +    return GNUNET_SYSERR; +  } +  if (GNUNET_DB_STATUS_SOFT_ERROR == qs) +  { +    db_plugin->rollback (db_plugin->cls,                           session);      /* try again */      task = GNUNET_SCHEDULER_add_now (&find_transfers, @@ -298,7 +305,7 @@ static void  find_transfers (void *cls)  {    struct TALER_EXCHANGEDB_Session *session; -  int ret; +  enum GNUNET_DB_QueryStatus qs;    task = NULL;    GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -322,11 +329,11 @@ find_transfers (void *cls)      GNUNET_SCHEDULER_shutdown ();      return;    } -  ret = db_plugin->get_latest_reserve_in_reference (db_plugin->cls, -                                                    session, -                                                    &start_off, -                                                    &start_off_size); -  if (GNUNET_SYSERR == ret) +  qs = db_plugin->get_latest_reserve_in_reference (db_plugin->cls, +						   session, +						   &start_off, +						   &start_off_size); +  if (GNUNET_DB_STATUS_HARD_ERROR == qs)    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,                  "Failed to obtain starting point for montoring from database!\n"); @@ -334,6 +341,15 @@ find_transfers (void *cls)      GNUNET_SCHEDULER_shutdown ();      return;    } +  if (GNUNET_DB_STATUS_SOFT_ERROR == qs) +  { +    /* try again */ +    db_plugin->rollback (db_plugin->cls, +                         session); +    task = GNUNET_SCHEDULER_add_now (&find_transfers, +				     NULL); +    return; +  }    delay = GNUNET_YES;    hh = wire_plugin->get_history (wire_plugin->cls,  				 TALER_BANK_DIRECTION_CREDIT, diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 6758a308..a41b1966 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -2092,56 +2092,28 @@ postgres_reserves_in_insert (void *cls,   * @param session the database session handle   * @param[out] wire_reference set to unique reference identifying the wire transfer (binary blob)   * @param[out] wire_reference_size set to number of bytes in @a wire_reference - * @return #GNUNET_OK upon success; #GNUNET_NO if we never got any incoming transfers - *         #GNUNET_SYSERR upon failures (DB error) + * @return transaction status code   */ -static int +static enum GNUNET_DB_QueryStatus  postgres_get_latest_reserve_in_reference (void *cls,                                            struct TALER_EXCHANGEDB_Session *session,                                            void **wire_reference,                                            size_t *wire_reference_size)  { -  PGresult *result;    struct GNUNET_PQ_QueryParam params[] = {      GNUNET_PQ_query_param_end    }; -  int ret; - -  ret = GNUNET_SYSERR; -  result = GNUNET_PQ_exec_prepared (session->conn, -                                    "reserves_in_get_latest_wire_reference", -                                    params); -  if (PGRES_TUPLES_OK != PQresultStatus (result)) -  { -    QUERY_ERR (result, session->conn); -    goto cleanup; -  } -  if (0 == PQntuples (result)) -  { -    ret = GNUNET_NO; -    goto cleanup; -  } -  { -    struct GNUNET_PQ_ResultSpec rs[] = { -      GNUNET_PQ_result_spec_variable_size ("wire_reference", -                                           wire_reference, -                                           wire_reference_size), -      GNUNET_PQ_result_spec_end -    }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_variable_size ("wire_reference", +					 wire_reference, +					 wire_reference_size), +    GNUNET_PQ_result_spec_end +  }; -    if (GNUNET_OK != -        GNUNET_PQ_extract_result (result, -                                  rs, -                                  0)) -    { -      GNUNET_break (0); -      goto cleanup; -    } -  } -  ret = GNUNET_OK; - cleanup: -  PQclear (result); -  return ret; +  return GNUNET_PQ_eval_prepared_singleton_select (session->conn, +						   "reserves_in_get_latest_wire_reference", +						   params, +						   rs);  } diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 701c20c7..ae0c8213 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -1518,7 +1518,7 @@ run (void *cls)    result = 4;    sndr = json_loads ("{ \"account\":\"1\" }", 0, NULL);    GNUNET_assert (NULL != sndr); -  FAILIF (GNUNET_NO != +  FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=            plugin->get_latest_reserve_in_reference (plugin->cls,                                                     session,                                                     &rr, @@ -1532,7 +1532,7 @@ run (void *cls)                                        sndr,                                        "TEST",                                        4)); -  FAILIF (GNUNET_OK != +  FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=            plugin->get_latest_reserve_in_reference (plugin->cls,                                                     session,                                                     &rr, @@ -1555,12 +1555,12 @@ run (void *cls)  				      sndr,                                        "TEST2",                                        5)); -  FAILIF (GNUNET_OK != +  FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=            plugin->get_latest_reserve_in_reference (plugin->cls,                                                     session,                                                     &rr,                                                     &rr_size)); -  FAILIF (GNUNET_OK != +  FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=            plugin->get_latest_reserve_in_reference (plugin->cls,                                                     session,                                                     &rr, diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 7c245e22..9a97b5f3 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -1107,8 +1107,7 @@ struct TALER_EXCHANGEDB_Plugin     *     * @param cls the @e cls of this struct with the plugin-specific state     * @param session connection to use -   * @return #GNUNET_OK on success, #GNUNET_NO if the transaction -   *         can be retried, #GNUNET_SYSERR on hard failures +   * @return transaction status     */    enum GNUNET_DB_QueryStatus    (*commit) (void *cls, @@ -1210,10 +1209,9 @@ struct TALER_EXCHANGEDB_Plugin     * @param db the database connection handle     * @param[out] wire_reference set to unique reference identifying the wire transfer (binary blob)     * @param[out] wire_reference_size set to number of bytes in @a wire_reference -   * @return #GNUNET_OK upon success; #GNUNET_NO if we never got any incoming transfers -   *         #GNUNET_SYSERR upon failures (DB error) +   * @return transaction status code     */ -  int +  enum GNUNET_DB_QueryStatus     (*get_latest_reserve_in_reference)(void *cls,                                       struct TALER_EXCHANGEDB_Session *db,                                       void **wire_reference, | 
