aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-06-18 15:02:35 +0200
committerChristian Grothoff <christian@grothoff.org>2017-06-19 00:17:15 +0200
commitd66a29e383d1a6985906136c9606fcd18cb1c124 (patch)
tree8671d89eca7185bfd233e24b8644609ccaf326d9
parent75b0879f4e5d0feb16f5cee6c775a587c9d47ecf (diff)
convert another function for #5010
-rw-r--r--src/exchange/taler-exchange-aggregator.c75
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c24
-rw-r--r--src/exchangedb/test_exchangedb.c2
-rw-r--r--src/include/taler_exchangedb_plugin.h6
4 files changed, 67 insertions, 40 deletions
diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c
index 89f72dea5..10240190b 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -577,6 +577,8 @@ deposit_cb (void *cls,
struct GNUNET_TIME_Absolute wire_deadline,
const json_t *wire)
{
+ enum GNUNET_DB_QueryStatus qs;
+
au->merchant_pub = *merchant_pub;
if (GNUNET_OK !=
TALER_amount_subtract (&au->total_amount,
@@ -623,11 +625,12 @@ deposit_cb (void *cls,
GNUNET_break (0);
return GNUNET_SYSERR;
}
- if (GNUNET_OK !=
- db_plugin->mark_deposit_done (db_plugin->cls,
- au->session,
- row_id))
+ qs = db_plugin->mark_deposit_done (db_plugin->cls,
+ au->session,
+ row_id);
+ if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
+ /* FIXME #5010 */
GNUNET_break (0);
au->failed = GNUNET_YES;
return GNUNET_SYSERR;
@@ -664,6 +667,7 @@ aggregate_cb (void *cls,
const json_t *wire)
{
struct TALER_Amount delta;
+ enum GNUNET_DB_QueryStatus qs;
GNUNET_break (0 ==
memcmp (&au->merchant_pub,
@@ -714,11 +718,12 @@ aggregate_cb (void *cls,
GNUNET_break (0);
return GNUNET_SYSERR;
}
- if (GNUNET_OK !=
- db_plugin->mark_deposit_done (db_plugin->cls,
- au->session,
- row_id))
+ qs = db_plugin->mark_deposit_done (db_plugin->cls,
+ au->session,
+ row_id);
+ if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
+ /* FIXME: #5010 */
GNUNET_break (0);
au->failed = GNUNET_YES;
return GNUNET_SYSERR;
@@ -1102,7 +1107,7 @@ run_aggregation (void *cls)
{
static int swap;
struct TALER_EXCHANGEDB_Session *session;
- unsigned int i;
+ enum GNUNET_DB_QueryStatus qs;
int ret;
const struct GNUNET_SCHEDULER_TaskContext *tc;
@@ -1246,18 +1251,46 @@ run_aggregation (void *cls)
}
/* Mark transactions by row_id as minor */
ret = GNUNET_OK;
- if (GNUNET_OK !=
- db_plugin->mark_deposit_tiny (db_plugin->cls,
- session,
- au->row_id))
- ret = GNUNET_SYSERR;
- else
- for (i=0;i<au->rows_offset;i++)
- if (GNUNET_OK !=
- db_plugin->mark_deposit_tiny (db_plugin->cls,
- session,
- au->additional_rows[i]))
- ret = GNUNET_SYSERR;
+ qs = db_plugin->mark_deposit_tiny (db_plugin->cls,
+ session,
+ au->row_id);
+ if (0 <= qs)
+ {
+ for (unsigned int i=0;i<au->rows_offset;i++)
+ {
+ qs = db_plugin->mark_deposit_tiny (db_plugin->cls,
+ session,
+ au->additional_rows[i]);
+ if (0 > qs)
+ break;
+ }
+ }
+ if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+ {
+ db_plugin->rollback (db_plugin->cls,
+ session);
+ GNUNET_free_non_null (au->additional_rows);
+ if (NULL != au->wire)
+ json_decref (au->wire);
+ GNUNET_free (au);
+ au = NULL;
+ /* start again */
+ task = GNUNET_SCHEDULER_add_now (&run_aggregation,
+ NULL);
+ return;
+ }
+ if (GNUNET_DB_STATUS_HARD_ERROR == qs)
+ {
+ db_plugin->rollback (db_plugin->cls,
+ session);
+ GNUNET_free_non_null (au->additional_rows);
+ if (NULL != au->wire)
+ json_decref (au->wire);
+ GNUNET_free (au);
+ au = NULL;
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
/* commit */
(void) commit_or_warn (session);
GNUNET_free_non_null (au->additional_rows);
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index c2f4ffa5a..37db30d9e 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -2793,11 +2793,9 @@ postgres_have_deposit (void *cls,
* @param cls the @e cls of this struct with the plugin-specific state
* @param session connection to the database
* @param rowid identifies the deposit row to modify
- * @return #GNUNET_OK on success,
- * #GNUNET_NO on transient error
- * #GNUNET_SYSERR on error
+ * @return query result status
*/
-static int
+static enum GNUNET_DB_QueryStatus
postgres_mark_deposit_tiny (void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t rowid)
@@ -2807,9 +2805,9 @@ postgres_mark_deposit_tiny (void *cls,
GNUNET_PQ_query_param_end
};
- return execute_prepared_non_select (session,
- "mark_deposit_tiny",
- params);
+ return GNUNET_PQ_eval_prepared_non_select (session->conn,
+ "mark_deposit_tiny",
+ params);
}
@@ -2890,11 +2888,9 @@ postgres_test_deposit_done (void *cls,
* @param cls the @e cls of this struct with the plugin-specific state
* @param session connection to the database
* @param rowid identifies the deposit row to modify
- * @return #GNUNET_OK on success,
- * #GNUNET_NO on transient error,
- * #GNUNET_SYSERR on error
+ * @return query result status
*/
-static int
+static enum GNUNET_DB_QueryStatus
postgres_mark_deposit_done (void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t rowid)
@@ -2904,9 +2900,9 @@ postgres_mark_deposit_done (void *cls,
GNUNET_PQ_query_param_end
};
- return execute_prepared_non_select (session,
- "mark_deposit_done",
- params);
+ return GNUNET_PQ_eval_prepared_non_select (session->conn,
+ "mark_deposit_done",
+ params);
}
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index adb723757..28e089cf7 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1801,7 +1801,7 @@ run (void *cls)
FAILIF (GNUNET_OK !=
plugin->start (plugin->cls,
session));
- FAILIF (GNUNET_OK !=
+ FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->mark_deposit_tiny (plugin->cls,
session,
deposit_rowid));
diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h
index 924bfe7bb..eed43217c 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -1343,11 +1343,9 @@ struct TALER_EXCHANGEDB_Plugin
* @param cls the @e cls of this struct with the plugin-specific state
* @param session connection to the database
* @param deposit_rowid identifies the deposit row to modify
- * @return #GNUNET_OK on success
- * #GNUNET_NO on transient error
- * #GNUNET_SYSERR on error
+ * @return query result status
*/
- int
+ enum GNUNET_DB_QueryStatus
(*mark_deposit_tiny) (void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t rowid);