summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph <Joseph.xu@efrei.net>2022-12-20 09:09:03 -0500
committerJoseph <Joseph.xu@efrei.net>2022-12-21 05:29:47 -0500
commit802dbaefc984807c54000bd9f695254690dbdcd5 (patch)
treed72b0ff8f2c00c526e4314055a5f0cb06da69789 /src
parent287370b4cbcd3062da83bed9b4b6935532899992 (diff)
downloadexchange-802dbaefc984807c54000bd9f695254690dbdcd5.tar.gz
exchange-802dbaefc984807c54000bd9f695254690dbdcd5.tar.bz2
exchange-802dbaefc984807c54000bd9f695254690dbdcd5.zip
add batch8
Diffstat (limited to 'src')
-rw-r--r--src/exchangedb/exchange_do_batch4_reserves_in_insert.sql153
-rw-r--r--src/exchangedb/exchange_do_batch_reserves_update.sql4
-rw-r--r--src/exchangedb/pg_batch2_reserves_in_insert.c291
-rw-r--r--src/exchangedb/procedures.sql.in2
-rw-r--r--src/exchangedb/test_exchangedb_by_j.c8
5 files changed, 332 insertions, 126 deletions
diff --git a/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql b/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql
index ece926989..bf3b2eaa2 100644
--- a/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql
+++ b/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql
@@ -72,15 +72,10 @@ LANGUAGE plpgsql
AS $$
DECLARE
curs_reserve_exist refcursor;
-
DECLARE
- curs_transaction_exist CURSOR
- FOR SELECT reserve_pub
- FROM reserves_in
- WHERE in_reserve_pub = reserves_in.reserve_pub
- OR in2_reserve_pub = reserves_in.reserve_pub
- OR in3_reserve_pub = reserves_in.reserve_pub
- OR in4_reserve_pub = reserves_in.reserve_pub;
+ k INT8;
+DECLARE
+ curs_transaction_exist refcursor;
DECLARE
i RECORD;
@@ -98,7 +93,7 @@ BEGIN
ruuid2=0;
ruuid3=0;
ruuid4=0;
-
+ k=0;
--SIMPLE INSERT ON CONFLICT DO NOTHING
INSERT INTO wire_targets
(wire_target_h_payto
@@ -147,104 +142,41 @@ BEGIN
RETURNING reserve_uuid,reserve_pub)
SELECT * FROM reserve_changes;
- FETCH FROM curs_reserve_exist INTO i;
- IF FOUND
- THEN
- IF in_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found = FALSE;
- ruuid = i.reserve_uuid;
- END IF;
- IF in2_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found2 = FALSE;
- ruuid2 = i.reserve_uuid;
- END IF;
- IF in3_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found3 = FALSE;
- ruuid3 = i.reserve_uuid;
- END IF;
- IF in4_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found4 = FALSE;
- ruuid4 = i.reserve_uuid;
- END IF;
+ WHILE k < 4 LOOP
FETCH FROM curs_reserve_exist INTO i;
IF FOUND
THEN
IF in_reserve_pub = i.reserve_pub
THEN
- out_reserve_found = FALSE;
- ruuid = i.reserve_uuid;
- END IF;
- IF in2_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found2 = FALSE;
- ruuid2 = i.reserve_uuid;
- END IF;
- IF in3_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found3 = FALSE;
- ruuid3 = i.reserve_uuid;
- END IF;
- IF in4_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found4 = FALSE;
- ruuid4 = i.reserve_uuid;
- END IF;
- END IF;
- FETCH FROM curs_reserve_exist INTO i;
- IF FOUND
- THEN
- IF in_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found = FALSE;
- ruuid = i.reserve_uuid;
+ out_reserve_found = FALSE;
+ ruuid = i.reserve_uuid;
+ k = k+1;
END IF;
IF in2_reserve_pub = i.reserve_pub
THEN
out_reserve_found2 = FALSE;
ruuid2 = i.reserve_uuid;
+ k=k+1;
END IF;
IF in3_reserve_pub = i.reserve_pub
THEN
out_reserve_found3 = FALSE;
ruuid3 = i.reserve_uuid;
+ k=k+1;
END IF;
IF in4_reserve_pub = i.reserve_pub
THEN
out_reserve_found4 = FALSE;
ruuid4 = i.reserve_uuid;
+ k=k+1;
END IF;
END IF;
- FETCH FROM curs_reserve_exist INTO i;
- IF FOUND
- THEN
- IF in_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found = FALSE;
- ruuid = i.reserve_uuid;
- END IF;
- IF in2_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found2 = FALSE;
- ruuid2 = i.reserve_uuid;
- END IF;
- IF in3_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found3 = FALSE;
- ruuid3 = i.reserve_uuid;
- END IF;
- IF in4_reserve_pub = i.reserve_pub
- THEN
- out_reserve_found4 = FALSE;
- ruuid4 = i.reserve_uuid;
- END IF;
- END IF;
- END IF;
+ END LOOP;
CLOSE curs_reserve_exist;
- IF out_reserve_found AND out_reserve_found2 AND out_reserve_found3 AND out_reserve_found4
+ IF out_reserve_found
+ AND out_reserve_found2
+ AND out_reserve_found3
+ AND out_reserve_found4
THEN
RETURN;
END IF;
@@ -254,7 +186,10 @@ BEGIN
PERFORM pg_notify(in3_notify, NULL);
PERFORM pg_notify(in4_notify, NULL);
- INSERT INTO reserves_in
+ k=0;
+ OPEN curs_transaction_exist FOR
+ WITH reserve_in_changes AS (
+ INSERT INTO reserves_in
(reserve_pub
,wire_reference
,credit_val
@@ -262,7 +197,7 @@ BEGIN
,exchange_account_section
,wire_source_h_payto
,execution_date)
- VALUES
+ VALUES
(in_reserve_pub
,in_wire_ref
,in_credit_val
@@ -291,43 +226,39 @@ BEGIN
,in4_exchange_account_name
,in4_wire_source_h_payto
,in_expiration_date)
- ON CONFLICT DO NOTHING;
- IF FOUND
- THEN
- transaction_duplicate = FALSE; /*HAPPY PATH THERE IS NO DUPLICATE TRANS AND NEW RESERVE*/
- transaction_duplicate2 = FALSE;
- transaction_duplicate3 = FALSE;
- transaction_duplicate4 = FALSE;
- RETURN;
- ELSE
- FOR l IN curs_transaction_exist
- LOOP
- IF in_reserve_pub = l.reserve_pub
+ ON CONFLICT DO NOTHING
+ RETURNING reserve_pub)
+ SELECT * FROM reserve_in_changes;
+ WHILE k < 4 LOOP
+ FETCH FROM curs_transaction_exist INTO i;
+ IF FOUND
+ THEN
+ IF in_reserve_pub = i.reserve_pub
THEN
transaction_duplicate = TRUE;
+ k=k+1;
END IF;
-
- IF in2_reserve_pub = l.reserve_pub
+ IF in2_reserve_pub = i.reserve_pub
THEN
transaction_duplicate2 = TRUE;
+ k=k+1;
END IF;
- IF in3_reserve_pub = l.reserve_pub
+ IF in3_reserve_pub = i.reserve_pub
THEN
transaction_duplicate3 = TRUE;
+ k=k+1;
END IF;
- IF in4_reserve_pub = l.reserve_pub
+ IF in4_reserve_pub = i.reserve_pub
THEN
transaction_duplicate4 = TRUE;
+ k=k+1;
END IF;
-
- IF transaction_duplicate AND transaction_duplicate2 AND transaction_duplicate3 AND transaction_duplicate4
- THEN
- RETURN;
- END IF;
- END LOOP;
- END IF;
-
- CLOSE curs_reserve_exist;
+ END IF;
+ END LOOP;
CLOSE curs_transaction_exist;
+
RETURN;
+
+
+
END $$;
diff --git a/src/exchangedb/exchange_do_batch_reserves_update.sql b/src/exchangedb/exchange_do_batch_reserves_update.sql
index f6b972c67..a6b7122d5 100644
--- a/src/exchangedb/exchange_do_batch_reserves_update.sql
+++ b/src/exchangedb/exchange_do_batch_reserves_update.sql
@@ -23,7 +23,7 @@ CREATE OR REPLACE PROCEDURE exchange_do_batch_reserves_update(
IN in_exchange_account_name VARCHAR,
IN in_reserve_found BOOLEAN,
IN in_wire_source_h_payto BYTEA,
- IN in_notify text) ---h_payto
+ IN in_notify text)
LANGUAGE plpgsql
AS $$
BEGIN
@@ -48,7 +48,7 @@ BEGIN
--IF THE INSERTION WAS A SUCCESS IT MEANS NO DUPLICATED TRANSACTION
IF FOUND
THEN
--- transaction_duplicate = FALSE;
+
IF in_reserve_found
THEN
UPDATE reserves
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,
diff --git a/src/exchangedb/procedures.sql.in b/src/exchangedb/procedures.sql.in
index 8ddc0ee26..b775639bf 100644
--- a/src/exchangedb/procedures.sql.in
+++ b/src/exchangedb/procedures.sql.in
@@ -39,4 +39,6 @@ SET search_path TO exchange;
#include "exchange_do_batch_reserves_update.sql"
#include "exchange_do_batch2_reserves_in_insert.sql"
#include "exchange_do_batch4_reserves_in_insert.sql"
+#include "exchange_do_batch8_reserves_in_insert.sql"
+
COMMIT;
diff --git a/src/exchangedb/test_exchangedb_by_j.c b/src/exchangedb/test_exchangedb_by_j.c
index 8e0b413b3..c114f59ce 100644
--- a/src/exchangedb/test_exchangedb_by_j.c
+++ b/src/exchangedb/test_exchangedb_by_j.c
@@ -23,7 +23,7 @@
#include "taler_json_lib.h"
#include "taler_exchangedb_plugin.h"
#include "math.h"
-#define ROUNDS 100
+#define ROUNDS 10
/**
* Global result from the testcase.
@@ -73,7 +73,7 @@ static struct TALER_EXCHANGEDB_Plugin *plugin;
static void
run (void *cls)
{
- static const unsigned int batches[] = {1, 2, 3, 4, 16 };
+ static const unsigned int batches[] = {1, 2, 3, 4, 8, 16 };
struct GNUNET_TIME_Relative times[sizeof (batches)/sizeof(*batches)];
unsigned long long sqrs[sizeof (batches)/sizeof(*batches)];
struct GNUNET_CONFIGURATION_Handle *cfg = cls;
@@ -102,7 +102,7 @@ run (void *cls)
memset (sqrs, 0, sizeof (sqrs));
for (unsigned int r = 0; r < ROUNDS; r++)
{
- for (unsigned int i = 0; i< 5; i++)
+ for (unsigned int i = 0; i< 6; i++)
{
const char *sndr = "payto://x-taler-bank/localhost:8080/1";
struct TALER_Amount value;
@@ -153,7 +153,7 @@ run (void *cls)
system ("./test.sh"); //DELETE AFTER TIMER
}
}
- for (unsigned int i = 0; i< 5; i++)
+ for (unsigned int i = 0; i< 6; i++)
{
struct GNUNET_TIME_Relative avg;
double avg_dbl;