diff options
author | Joseph <Joseph.xu@efrei.net> | 2022-12-20 09:09:03 -0500 |
---|---|---|
committer | Joseph <Joseph.xu@efrei.net> | 2022-12-21 05:29:47 -0500 |
commit | 802dbaefc984807c54000bd9f695254690dbdcd5 (patch) | |
tree | d72b0ff8f2c00c526e4314055a5f0cb06da69789 /src/exchangedb/pg_batch2_reserves_in_insert.c | |
parent | 287370b4cbcd3062da83bed9b4b6935532899992 (diff) | |
download | exchange-802dbaefc984807c54000bd9f695254690dbdcd5.tar.xz |
add batch8
Diffstat (limited to 'src/exchangedb/pg_batch2_reserves_in_insert.c')
-rw-r--r-- | src/exchangedb/pg_batch2_reserves_in_insert.c | 291 |
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, + ¬ify_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, |