aboutsummaryrefslogtreecommitdiff
path: root/src/exchangedb/pg_batch2_reserves_in_insert.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/exchangedb/pg_batch2_reserves_in_insert.c')
-rw-r--r--src/exchangedb/pg_batch2_reserves_in_insert.c291
1 files changed, 282 insertions, 9 deletions
diff --git a/src/exchangedb/pg_batch2_reserves_in_insert.c b/src/exchangedb/pg_batch2_reserves_in_insert.c
index 5518b2c6c..f80f7ea07 100644
--- a/src/exchangedb/pg_batch2_reserves_in_insert.c
+++ b/src/exchangedb/pg_batch2_reserves_in_insert.c
@@ -217,7 +217,10 @@ insert2 (struct PostgresClosure *pg,
? GNUNET_DB_STATUS_SUCCESS_NO_RESULTS
: GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;*/
- if (((conflict[0]) && (transaction_duplicate[0])) ||((conflict[1]) && (transaction_duplicate[1])))
+ if (
+ ((conflict[0]) && (transaction_duplicate[0]))
+ ||((conflict[1]) && (transaction_duplicate[1]))
+ )
{
GNUNET_break (0);
TEH_PG_rollback (pg);
@@ -358,7 +361,12 @@ insert4 (struct PostgresClosure *pg,
? GNUNET_DB_STATUS_SUCCESS_NO_RESULTS
: GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;*/
- if (((conflict[0]) && (transaction_duplicate[0])) ||((conflict[1]) && (transaction_duplicate[1])) ||((conflict[2]) && (transaction_duplicate[2])) ||((conflict[3]) && (transaction_duplicate[3])))
+ if (
+ ((conflict[0]) && (transaction_duplicate[0]))
+ ||((conflict[1]) && (transaction_duplicate[1]))
+ ||((conflict[2]) && (transaction_duplicate[2]))
+ ||((conflict[3]) && (transaction_duplicate[3]))
+ )
{
GNUNET_break (0);
TEH_PG_rollback (pg);
@@ -368,6 +376,238 @@ insert4 (struct PostgresClosure *pg,
}
+static enum GNUNET_DB_QueryStatus
+insert8 (struct PostgresClosure *pg,
+ const struct TALER_EXCHANGEDB_ReserveInInfo reserves[8],
+ struct GNUNET_TIME_Timestamp expiry,
+ struct GNUNET_TIME_Timestamp gc,
+ struct TALER_PaytoHashP h_payto,
+ char *const*notify_s,
+ struct GNUNET_TIME_Timestamp reserve_expiration,
+ bool *transaction_duplicate,
+ bool *conflict,
+ uint64_t *reserve_uuid)
+{
+ enum GNUNET_DB_QueryStatus qs3;
+ PREPARE (pg,
+ "batch8_reserve_create",
+ "SELECT "
+ "out_reserve_found AS conflicted"
+ ",out_reserve_found2 AS conflicted2"
+ ",out_reserve_found3 AS conflicted3"
+ ",out_reserve_found4 AS conflicted4"
+ ",out_reserve_found5 AS conflicted5"
+ ",out_reserve_found6 AS conflicted6"
+ ",out_reserve_found7 AS conflicted7"
+ ",out_reserve_found8 AS conflicted8"
+ ",transaction_duplicate"
+ ",transaction_duplicate2"
+ ",transaction_duplicate3"
+ ",transaction_duplicate4"
+ ",transaction_duplicate5"
+ ",transaction_duplicate6"
+ ",transaction_duplicate7"
+ ",transaction_duplicate8"
+ ",ruuid AS reserve_uuid"
+ ",ruuid2 AS reserve_uuid2"
+ ",ruuid3 AS reserve_uuid3"
+ ",ruuid4 AS reserve_uuid4"
+ ",ruuid5 AS reserve_uuid5"
+ ",ruuid6 AS reserve_uuid6"
+ ",ruuid7 AS reserve_uuid7"
+ ",ruuid8 AS reserve_uuid8"
+ " FROM exchange_do_batch8_reserves_insert"
+ " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39, $40, $41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$80,$81,$82);");
+
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (reserves[0].reserve_pub),
+ GNUNET_PQ_query_param_timestamp (&expiry),
+ GNUNET_PQ_query_param_timestamp (&gc),
+ GNUNET_PQ_query_param_uint64 (&reserves[0].wire_reference),
+ TALER_PQ_query_param_amount (reserves[0].balance),
+ GNUNET_PQ_query_param_string (reserves[0].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[0].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[0].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+ GNUNET_PQ_query_param_string (notify_s[0]),
+ GNUNET_PQ_query_param_string (notify_s[1]),
+ GNUNET_PQ_query_param_string (notify_s[2]),
+ GNUNET_PQ_query_param_string (notify_s[3]),
+ GNUNET_PQ_query_param_string (notify_s[4]),
+ GNUNET_PQ_query_param_string (notify_s[5]),
+ GNUNET_PQ_query_param_string (notify_s[6]),
+ GNUNET_PQ_query_param_string (notify_s[7]),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[1].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[1].wire_reference),
+ TALER_PQ_query_param_amount (reserves[1].balance),
+ GNUNET_PQ_query_param_string (reserves[1].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[1].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[1].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[2].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[2].wire_reference),
+ TALER_PQ_query_param_amount (reserves[2].balance),
+ GNUNET_PQ_query_param_string (reserves[2].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[2].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[2].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[3].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[3].wire_reference),
+ TALER_PQ_query_param_amount (reserves[3].balance),
+ GNUNET_PQ_query_param_string (reserves[3].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[3].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[3].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[4].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[4].wire_reference),
+ TALER_PQ_query_param_amount (reserves[4].balance),
+ GNUNET_PQ_query_param_string (reserves[4].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[4].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[4].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[5].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[5].wire_reference),
+ TALER_PQ_query_param_amount (reserves[5].balance),
+ GNUNET_PQ_query_param_string (reserves[5].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[5].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[5].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[6].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[6].wire_reference),
+ TALER_PQ_query_param_amount (reserves[6].balance),
+ GNUNET_PQ_query_param_string (reserves[6].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[6].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[6].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_auto_from_type (reserves[7].reserve_pub),
+ GNUNET_PQ_query_param_uint64 (&reserves[7].wire_reference),
+ TALER_PQ_query_param_amount (reserves[7].balance),
+ GNUNET_PQ_query_param_string (reserves[7].exchange_account_name),
+ GNUNET_PQ_query_param_timestamp (&reserves[7].execution_time),
+ GNUNET_PQ_query_param_auto_from_type (&h_payto),
+ GNUNET_PQ_query_param_string (reserves[7].sender_account_details),
+ GNUNET_PQ_query_param_timestamp (&reserve_expiration),
+
+ GNUNET_PQ_query_param_end
+ };
+
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ GNUNET_PQ_result_spec_bool ("conflicted",
+ &conflict[0]),
+ GNUNET_PQ_result_spec_bool ("conflicted2",
+ &conflict[1]),
+ GNUNET_PQ_result_spec_bool ("conflicted3",
+ &conflict[2]),
+ GNUNET_PQ_result_spec_bool ("conflicted4",
+ &conflict[3]),
+ GNUNET_PQ_result_spec_bool ("conflicted5",
+ &conflict[4]),
+ GNUNET_PQ_result_spec_bool ("conflicted6",
+ &conflict[5]),
+ GNUNET_PQ_result_spec_bool ("conflicted7",
+ &conflict[6]),
+ GNUNET_PQ_result_spec_bool ("conflicted8",
+ &conflict[7]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate",
+ &transaction_duplicate[0]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate2",
+ &transaction_duplicate[1]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate3",
+ &transaction_duplicate[2]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate4",
+ &transaction_duplicate[3]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate5",
+ &transaction_duplicate[4]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate6",
+ &transaction_duplicate[5]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate7",
+ &transaction_duplicate[6]),
+ GNUNET_PQ_result_spec_bool ("transaction_duplicate8",
+ &transaction_duplicate[7]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid",
+ &reserve_uuid[0]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid2",
+ &reserve_uuid[1]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid3",
+ &reserve_uuid[2]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid4",
+ &reserve_uuid[3]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid5",
+ &reserve_uuid[4]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid6",
+ &reserve_uuid[5]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid7",
+ &reserve_uuid[6]),
+ GNUNET_PQ_result_spec_uint64 ("reserve_uuid8",
+ &reserve_uuid[7]),
+ GNUNET_PQ_result_spec_end
+ };
+
+ TALER_payto_hash (reserves[0].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[1].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[2].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[3].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[4].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[5].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[6].sender_account_details,
+ &h_payto);
+ TALER_payto_hash (reserves[7].sender_account_details,
+ &h_payto);
+
+ qs3 = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
+ "batch8_reserve_create",
+ params,
+ rs);
+ if (qs3 < 0)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Failed to create reserves8 (%d)\n",
+ qs3);
+ return qs3;
+ }
+
+ GNUNET_assert (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != qs3);
+ /* results[i] = (transaction_duplicate)
+ ? GNUNET_DB_STATUS_SUCCESS_NO_RESULTS
+ : GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;*/
+
+ if (
+ ((conflict[0]) && (transaction_duplicate[0]))
+ ||((conflict[1]) && (transaction_duplicate[1]))
+ ||((conflict[2]) && (transaction_duplicate[2]))
+ ||((conflict[3]) && (transaction_duplicate[3]))
+ ||((conflict[4]) && (transaction_duplicate[4]))
+ ||((conflict[5]) && (transaction_duplicate[5]))
+ ||((conflict[6]) && (transaction_duplicate[6]))
+ ||((conflict[7]) && (transaction_duplicate[7]))
+ )
+ {
+ GNUNET_break (0);
+ TEH_PG_rollback (pg);
+ return GNUNET_DB_STATUS_HARD_ERROR;
+ }
+ return qs3;
+}
enum GNUNET_DB_QueryStatus
TEH_PG_batch2_reserves_in_insert (void *cls,
@@ -377,7 +617,7 @@ TEH_PG_batch2_reserves_in_insert (void *cls,
enum GNUNET_DB_QueryStatus *results)
{
struct PostgresClosure *pg = cls;
- // enum GNUNET_DB_QueryStatus qs1;
+ enum GNUNET_DB_QueryStatus qs1;
enum GNUNET_DB_QueryStatus qs2;
enum GNUNET_DB_QueryStatus qs4;
enum GNUNET_DB_QueryStatus qs5;
@@ -437,9 +677,45 @@ TEH_PG_batch2_reserves_in_insert (void *cls,
{
unsigned int bs = GNUNET_MIN (batch_size,
reserves_length - i);
- if (bs >= 4)
+ if (bs >= 8)
{
- // fprintf(stdout, "batch4");
+ // fprintf(stdout, "batch8");
+ qs1=insert8(pg,
+ &reserves[i],
+ expiry,
+ gc,
+ h_payto,
+ &notify_s[i],
+ reserve_expiration,
+ &transaction_duplicate[i],
+ &conflicts[i],
+ &reserve_uuid[i]);
+
+ if (qs1<0)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Failed to update reserves8 (%d)\n",
+ qs1);
+ return qs1;
+ }
+ // fprintf(stdout, "%ld %ld %ld %ld %ld %ld %ld %ld\n", reserve_uuid[i], reserve_uuid[i+1], reserve_uuid[i+2], reserve_uuid[i+3], reserve_uuid[i+4], reserve_uuid[i+5], reserve_uuid[i+6],reserve_uuid[]);
+ need_update |= conflicts[i];
+ need_update |= conflicts[i+1];
+ need_update |= conflicts[i+2];
+ need_update |= conflicts[i+3];
+ need_update |= conflicts[i+4];
+ need_update |= conflicts[i+5];
+ need_update |= conflicts[i+6];
+ need_update |= conflicts[i+7];
+ i+=8;
+ continue;
+ }
+ switch (bs)
+ {
+ case 7:
+ case 6 :
+ case 5:
+ case 4 :
qs4=insert4(pg,
&reserves[i],
expiry,
@@ -465,10 +741,7 @@ TEH_PG_batch2_reserves_in_insert (void *cls,
// fprintf(stdout, "%ld %ld %ld %ld\n", reserve_uuid[i], reserve_uuid[i+1], reserve_uuid[i+2], reserve_uuid[i+3]);
//fprintf(stdout, "%d %d %d %d\n", transaction_duplicate[i], transaction_duplicate[i+1], transaction_duplicate[i+2], transaction_duplicate[i+3]);
i += 4;
- continue;
- }
- switch (bs)
- {
+ break;
case 3:
case 2:
qs5=insert2(pg,