tests for refunds_by_coin and ready_deposit
This commit is contained in:
parent
a273b176da
commit
54fa07f5c7
@ -296,7 +296,7 @@ check_PROGRAMS = \
|
||||
perf-exchangedb-reserves-in-insert-postgres\
|
||||
test-exchangedb-by-j-postgres\
|
||||
test-exchangedb-batch-reserves-in-insert-postgres\
|
||||
test-exchangedb-populate-table-postgres\
|
||||
test-exchangedb-populate-select-refunds-by-coin-postgres\
|
||||
test-exchangedb-populate-link-data-postgres\
|
||||
test-exchangedb-populate-ready-deposit-postgres
|
||||
|
||||
@ -306,7 +306,7 @@ TESTS = \
|
||||
test-exchangedb-by-j-postgres\
|
||||
perf-exchangedb-reserves-in-insert-postgres\
|
||||
test-exchangedb-batch-reserves-in-insert-postgres\
|
||||
test-exchangedb-populate-table-postgres\
|
||||
test-exchangedb-populate-select-refunds-by-coin-postgres\
|
||||
test-exchangedb-populate-link-data-postgres\
|
||||
test-exchangedb-populate-ready-deposit-postgres
|
||||
test_exchangedb_postgres_SOURCES = \
|
||||
@ -369,9 +369,9 @@ test_exchangedb_batch_reserves_in_insert_postgres_LDADD = \
|
||||
-lgnunetutil \
|
||||
$(XLIB)
|
||||
|
||||
test_exchangedb_populate_table_postgres_SOURCES = \
|
||||
test_exchangedb_populate_table.c
|
||||
test_exchangedb_populate_table_postgres_LDADD = \
|
||||
test_exchangedb_populate_select_refunds_by_coin_postgres_SOURCES = \
|
||||
test_exchangedb_populate_select_refunds_by_coin.c
|
||||
test_exchangedb_populate_select_refunds_by_coin_postgres_LDADD = \
|
||||
libtalerexchangedb.la \
|
||||
$(top_builddir)/src/json/libtalerjson.la \
|
||||
$(top_builddir)/src/util/libtalerutil.la \
|
||||
|
64
src/exchangedb/exchange_do_get_ready_deposit.sql
Normal file
64
src/exchangedb/exchange_do_get_ready_deposit.sql
Normal file
@ -0,0 +1,64 @@
|
||||
--
|
||||
-- This file is part of TALER
|
||||
-- Copyright (C) 2014--2022 Taler Systems SA
|
||||
--
|
||||
-- TALER is free software; you can redistribute it and/or modify it under the
|
||||
-- terms of the GNU General Public License as published by the Free Software
|
||||
-- Foundation; either version 3, or (at your option) any later version.
|
||||
--
|
||||
-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
-- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License along with
|
||||
-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||
--
|
||||
CREATE OR REPLACE FUNCTION exchange_do_get_ready_deposit(
|
||||
IN in_now INT8,
|
||||
IN in_start_shard_now INT8,
|
||||
IN in_end_shard_now INT8,
|
||||
OUT out_payto_uri VARCHAR,
|
||||
OUT out_merchant_pub BYTEA
|
||||
)
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
var_wire_target_h_payto BYTEA;
|
||||
DECLARE
|
||||
var_coin_pub BYTEA;
|
||||
DECLARE
|
||||
var_deposit_serial_id INT8;
|
||||
BEGIN
|
||||
|
||||
SELECT
|
||||
coin_pub
|
||||
,deposit_serial_id
|
||||
INTO
|
||||
var_coin_pub
|
||||
,var_deposit_serial_id
|
||||
FROM deposits_by_ready
|
||||
WHERE wire_deadline <= in_now
|
||||
AND shard >= in_start_shard_now
|
||||
AND shard <=in_end_shard_now
|
||||
ORDER BY
|
||||
wire_deadline ASC
|
||||
,shard ASC;
|
||||
|
||||
SELECT
|
||||
merchant_pub
|
||||
,wire_target_h_payto
|
||||
INTO
|
||||
out_merchant_pub
|
||||
,var_wire_target_h_payto
|
||||
FROM deposits
|
||||
WHERE coin_pub=var_coin_pub
|
||||
AND deposit_serial_id=var_deposit_serial_id;
|
||||
|
||||
SELECT
|
||||
payto_uri
|
||||
INTO out_payto_uri
|
||||
FROM wire_targets
|
||||
WHERE wire_target_h_payto=var_wire_target_h_payto;
|
||||
|
||||
RETURN;
|
||||
END $$;
|
94
src/exchangedb/exchange_do_refund_by_coin.sql
Normal file
94
src/exchangedb/exchange_do_refund_by_coin.sql
Normal file
@ -0,0 +1,94 @@
|
||||
--
|
||||
-- This file is part of TALER
|
||||
-- Copyright (C) 2014--2022 Taler Systems SA
|
||||
--
|
||||
-- TALER is free software; you can redistribute it and/or modify it under the
|
||||
-- terms of the GNU General Public License as published by the Free Software
|
||||
-- Foundation; either version 3, or (at your option) any later version.
|
||||
--
|
||||
-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
-- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License along with
|
||||
-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||
--
|
||||
/*DROP FUNCTION exchange_do_refund_by_coin(
|
||||
IN in_coin_pub BYTEA,
|
||||
IN in_merchant_pub BYTEA,
|
||||
IN in_h_contract BYTEA
|
||||
);*/
|
||||
CREATE OR REPLACE FUNCTION exchange_do_refund_by_coin(
|
||||
IN in_coin_pub BYTEA,
|
||||
IN in_merchant_pub BYTEA,
|
||||
IN in_h_contract BYTEA
|
||||
)
|
||||
RETURNS SETOF record
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
curs CURSOR
|
||||
FOR
|
||||
SELECT
|
||||
amount_with_fee_val
|
||||
,amount_with_fee_frac
|
||||
,deposit_serial_id
|
||||
FROM refunds
|
||||
WHERE coin_pub=in_coin_pub;
|
||||
DECLARE
|
||||
i RECORD;
|
||||
BEGIN
|
||||
OPEN curs;
|
||||
LOOP
|
||||
FETCH NEXT FROM curs INTO i;
|
||||
EXIT WHEN NOT FOUND;
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
i.amount_with_fee_val
|
||||
,i.amount_with_fee_frac
|
||||
FROM deposits
|
||||
WHERE
|
||||
coin_pub=in_coin_pub
|
||||
AND merchant_pub=in_merchant_pub
|
||||
AND h_contract_terms=in_h_contract
|
||||
AND i.deposit_serial_id = deposit_serial_id;
|
||||
END LOOP;
|
||||
CLOSE curs;
|
||||
END $$;
|
||||
|
||||
/*RETURNS TABLE(amount_with_fee_val INT8, amount_with_fee_frac INT4)
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
curs CURSOR
|
||||
FOR
|
||||
SELECT
|
||||
r.amount_with_fee_val
|
||||
,r.amount_with_fee_frac
|
||||
,r.deposit_serial_id
|
||||
FROM refunds r
|
||||
WHERE r.coin_pub=in_coin_pub;
|
||||
DECLARE
|
||||
i RECORD;
|
||||
BEGIN
|
||||
OPEN curs;
|
||||
LOOP
|
||||
FETCH NEXT FROM curs INTO i;
|
||||
IF FOUND
|
||||
THEN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
i.amount_with_fee_val
|
||||
,i.amount_with_fee_frac
|
||||
FROM deposits
|
||||
WHERE
|
||||
merchant_pub=in_merchant_pub
|
||||
AND h_contract_terms=in_h_contract
|
||||
AND i.deposit_serial_id = deposit_serial_id;
|
||||
END IF;
|
||||
EXIT WHEN NOT FOUND;
|
||||
END LOOP;
|
||||
CLOSE curs;
|
||||
|
||||
END $$;
|
||||
*/
|
@ -41,6 +41,7 @@ TEH_PG_get_ready_deposit (void *cls,
|
||||
GNUNET_PQ_query_param_uint64 (&end_shard_row),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
|
||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||
GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
|
||||
merchant_pub),
|
||||
@ -57,26 +58,180 @@ TEH_PG_get_ready_deposit (void *cls,
|
||||
"Finding ready deposits by deadline %s (%llu)\n",
|
||||
GNUNET_TIME_absolute2s (now),
|
||||
(unsigned long long) now.abs_value_us);
|
||||
PREPARE (pg,
|
||||
"deposits_get_ready",
|
||||
"SELECT"
|
||||
" payto_uri"
|
||||
",merchant_pub"
|
||||
" FROM deposits_by_ready dbr"
|
||||
" JOIN deposits dep"
|
||||
" ON (dbr.coin_pub = dep.coin_pub AND"
|
||||
" dbr.deposit_serial_id = dep.deposit_serial_id)"
|
||||
" JOIN wire_targets wt"
|
||||
" USING (wire_target_h_payto)"
|
||||
" WHERE dbr.wire_deadline<=$1"
|
||||
" AND dbr.shard >= $2"
|
||||
" AND dbr.shard <= $3"
|
||||
" ORDER BY "
|
||||
" dbr.wire_deadline ASC"
|
||||
" ,dbr.shard ASC"
|
||||
" LIMIT 1;");
|
||||
int choose_mode =-2;
|
||||
const char *query;
|
||||
|
||||
if (-2 == choose_mode)
|
||||
{
|
||||
const char *mode = getenv ("NEW_LOGIC");
|
||||
char dummy;
|
||||
if ( (NULL==mode) ||
|
||||
(1 != sscanf (mode,
|
||||
"%d%c",
|
||||
&choose_mode,
|
||||
&dummy)) )
|
||||
{
|
||||
if (NULL != mode)
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Bad mode `%s' specified\n",
|
||||
mode);
|
||||
}
|
||||
if (NULL==mode)
|
||||
choose_mode=0;
|
||||
|
||||
|
||||
}
|
||||
switch (choose_mode)
|
||||
{
|
||||
case 0:
|
||||
query="deposits_get_ready";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"SELECT"
|
||||
" payto_uri"
|
||||
",merchant_pub"
|
||||
" FROM deposits_by_ready dbr"
|
||||
" JOIN deposits dep"
|
||||
" ON (dbr.coin_pub = dep.coin_pub AND"
|
||||
" dbr.deposit_serial_id = dep.deposit_serial_id)"
|
||||
" JOIN wire_targets wt"
|
||||
" USING (wire_target_h_payto)"
|
||||
" WHERE dbr.wire_deadline<=$1"
|
||||
" AND dbr.shard >= $2"
|
||||
" AND dbr.shard <= $3"
|
||||
" ORDER BY "
|
||||
" dbr.wire_deadline ASC"
|
||||
" ,dbr.shard ASC"
|
||||
" LIMIT 1;");
|
||||
break;
|
||||
case 1:
|
||||
query="deposits_get_ready_v1";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED ("
|
||||
" SELECT"
|
||||
" coin_pub"
|
||||
",deposit_serial_id"
|
||||
" FROM deposits_by_ready"
|
||||
" WHERE"
|
||||
" wire_deadline<=$1"
|
||||
" AND shard >= $2"
|
||||
" AND shard <= $3"
|
||||
" ORDER BY "
|
||||
" wire_deadline ASC"
|
||||
" ,shard ASC"
|
||||
" LIMIT 1"
|
||||
")"
|
||||
"SELECT"
|
||||
" wt.payto_uri"
|
||||
",dep.merchant_pub"
|
||||
" FROM ("
|
||||
" SELECT"
|
||||
" wire_target_h_payto"
|
||||
",merchant_pub"
|
||||
" FROM deposits"
|
||||
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
|
||||
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
|
||||
") dep"
|
||||
" JOIN wire_targets wt"
|
||||
" ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
|
||||
);
|
||||
|
||||
break;
|
||||
case 2:
|
||||
query = "stored_procedure_get_ready_deposit";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"SELECT"
|
||||
" out_payto_uri AS payto_uri"
|
||||
",out_merchant_pub AS merchant_pub"
|
||||
" FROM"
|
||||
" exchange_do_get_ready_deposit"
|
||||
" ($1, $2, $3) ");
|
||||
break;
|
||||
case 3:
|
||||
query="deposits_get_ready_v3";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED ("
|
||||
" SELECT"
|
||||
" coin_pub"
|
||||
",deposit_serial_id"
|
||||
" FROM deposits_by_ready"
|
||||
" WHERE"
|
||||
" wire_deadline<=$1"
|
||||
" AND shard >= $2"
|
||||
" AND shard <= $3"
|
||||
" ORDER BY "
|
||||
" wire_deadline ASC"
|
||||
" ,shard ASC"
|
||||
" LIMIT 1"
|
||||
")"
|
||||
"SELECT"
|
||||
" wt.payto_uri"
|
||||
",dep.merchant_pub"
|
||||
" FROM ("
|
||||
" SELECT"
|
||||
" wire_target_h_payto"
|
||||
",merchant_pub"
|
||||
",coin_pub"
|
||||
" FROM deposits"
|
||||
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
|
||||
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
|
||||
") dep"
|
||||
" JOIN wire_targets wt"
|
||||
" ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
|
||||
" JOIN rc"
|
||||
" ON (dep.coin_pub=rc.coin_pub)"
|
||||
);
|
||||
|
||||
break;
|
||||
case 4:
|
||||
query="deposits_get_ready_v4";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED ("
|
||||
" SELECT"
|
||||
" coin_pub"
|
||||
",deposit_serial_id"
|
||||
" FROM deposits_by_ready"
|
||||
" WHERE"
|
||||
" wire_deadline<=$1"
|
||||
" AND shard >= $2"
|
||||
" AND shard <= $3"
|
||||
" ORDER BY "
|
||||
" wire_deadline ASC"
|
||||
" ,shard ASC"
|
||||
" LIMIT 1"
|
||||
"),"
|
||||
"WITH rv AS MATERIALIZED ("
|
||||
" SELECT"
|
||||
" payto_uri"
|
||||
",wire_target_h_payto"
|
||||
" FROM wire_targets"
|
||||
")"
|
||||
"SELECT"
|
||||
" rv.payto_uri"
|
||||
",dep.merchant_pub"
|
||||
" FROM ("
|
||||
" SELECT"
|
||||
" wire_target_h_payto"
|
||||
",merchant_pub"
|
||||
" FROM deposits"
|
||||
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
|
||||
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
|
||||
") dep"
|
||||
" JOIN rv"
|
||||
" ON (rv.wire_target_h_payto=dep.wire_target_h_payto)"
|
||||
);
|
||||
break;
|
||||
default:
|
||||
GNUNET_break (0);
|
||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||
}
|
||||
|
||||
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
|
||||
"deposits_get_ready",
|
||||
query,
|
||||
params,
|
||||
rs);
|
||||
}
|
||||
|
@ -112,17 +112,47 @@ TEH_PG_select_refunds_by_coin (
|
||||
GNUNET_PQ_query_param_auto_from_type (h_contract),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
struct GNUNET_PQ_QueryParam params5[] = {
|
||||
GNUNET_PQ_query_param_auto_from_type (coin_pub),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
|
||||
struct SelectRefundContext srctx = {
|
||||
.cb = cb,
|
||||
.cb_cls = cb_cls,
|
||||
.pg = pg,
|
||||
.status = GNUNET_OK
|
||||
};
|
||||
static int percent_refund = -2;
|
||||
const char *query;
|
||||
struct GNUNET_PQ_QueryParam *xparams = params;
|
||||
|
||||
if (NULL == getenv ("NEW_LOGIC"))
|
||||
if (-2 == percent_refund)
|
||||
{
|
||||
const char *mode = getenv ("NEW_LOGIC");
|
||||
char dummy;
|
||||
|
||||
if ( (NULL==mode) ||
|
||||
(1 != sscanf (mode,
|
||||
"%d%c",
|
||||
&percent_refund,
|
||||
&dummy)) )
|
||||
{
|
||||
if (NULL != mode)
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Bad mode `%s' specified\n",
|
||||
mode);
|
||||
}
|
||||
if (NULL==mode)
|
||||
percent_refund=0;
|
||||
}
|
||||
|
||||
switch (percent_refund)
|
||||
{
|
||||
case 0:
|
||||
query = "get_refunds_by_coin_and_contract-v0";
|
||||
PREPARE (pg,
|
||||
"get_refunds_by_coin_and_contract",
|
||||
query,
|
||||
"SELECT"
|
||||
" ref.amount_with_fee_val"
|
||||
",ref.amount_with_fee_frac"
|
||||
@ -132,12 +162,26 @@ TEH_PG_select_refunds_by_coin (
|
||||
" WHERE ref.coin_pub=$1"
|
||||
" AND dep.merchant_pub=$2"
|
||||
" AND dep.h_contract_terms=$3;");
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME-Joseph
|
||||
break;
|
||||
case 1:
|
||||
query = "get_refunds_by_coin_and_contract-v1";
|
||||
PREPARE (pg,
|
||||
"get_refunds_by_coin_and_contract",
|
||||
query,
|
||||
"SELECT"
|
||||
" ref.amount_with_fee_val"
|
||||
",ref.amount_with_fee_frac"
|
||||
" FROM refunds ref"
|
||||
" LEFT JOIN deposits dep"
|
||||
" ON dep.coin_pub = ref.coin_pub"
|
||||
" AND ref.deposit_serial_id = dep.deposit_serial_id"
|
||||
" WHERE ref.coin_pub=$1"
|
||||
" AND dep.merchant_pub=$2"
|
||||
" AND dep.h_contract_terms=$3;");
|
||||
break;
|
||||
case 2:
|
||||
query = "get_refunds_by_coin_and_contract-v2";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED("
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
@ -149,21 +193,139 @@ TEH_PG_select_refunds_by_coin (
|
||||
"SELECT"
|
||||
" rc.amount_with_fee_val"
|
||||
" ,rc.amount_with_fee_frac"
|
||||
" FROM "
|
||||
"(SELECT"
|
||||
" FROM deposits dep"
|
||||
" JOIN rc"
|
||||
" ON rc.deposit_serial_id = dep.deposit_serial_id"
|
||||
" WHERE"
|
||||
" dep.coin_pub = $1"
|
||||
" AND dep.merchant_pub = $2"
|
||||
" AND dep.h_contract_terms = $3");
|
||||
break;
|
||||
case 3:
|
||||
query = "get_refunds_by_coin_and_contract-v3";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED("
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
",deposit_serial_id"
|
||||
" FROM refunds"
|
||||
" WHERE coin_pub=$1)"
|
||||
"SELECT"
|
||||
" rc.amount_with_fee_val"
|
||||
" ,rc.amount_with_fee_frac"
|
||||
" FROM deposits dep"
|
||||
" FROM ("
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
" FROM deposits depos"
|
||||
" WHERE"
|
||||
" dep.coin_pub = $1" // optional...
|
||||
" AND dep.merchant_pub = $2"
|
||||
" AND dep.h_contract_terms = $3) dep"
|
||||
" JOIN rc"
|
||||
" USING (coin_pub,deposit_serial_id)");
|
||||
" depos.coin_pub = $1"
|
||||
" AND depos.merchant_pub = $2"
|
||||
" AND depos.h_contract_terms = $3) dep, rc;");
|
||||
break;
|
||||
case 4:
|
||||
query = "get_refunds_by_coin_and_contract-v4";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH rc AS MATERIALIZED("
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
",coin_pub"
|
||||
",deposit_serial_id"
|
||||
" FROM refunds ref"
|
||||
" WHERE ref.coin_pub=$1)"
|
||||
"SELECT"
|
||||
" rc.amount_with_fee_val"
|
||||
" ,rc.amount_with_fee_frac"
|
||||
" ,deposit_serial_id"
|
||||
" FROM ("
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
" FROM deposits depos"
|
||||
" WHERE"
|
||||
" depos.merchant_pub = $2"
|
||||
" AND depos.h_contract_terms = $3) dep JOIN rc "
|
||||
"USING(deposit_serial_id, coin_pub);");
|
||||
break;
|
||||
case 5:
|
||||
query = "get_refunds_by_coin_and_contract-v-broken";
|
||||
xparams = params5;
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"SELECT"
|
||||
" amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
",coin_pub"
|
||||
",deposit_serial_id"
|
||||
" FROM refunds"
|
||||
" WHERE coin_pub=$1;");
|
||||
break;
|
||||
case 8:
|
||||
query = "get_refunds_by_coin_and_contract-v8";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"WITH"
|
||||
" rc AS MATERIALIZED("
|
||||
" SELECT"
|
||||
" amount_with_fee_val"
|
||||
" ,amount_with_fee_frac"
|
||||
" ,coin_pub"
|
||||
" ,deposit_serial_id"
|
||||
" FROM refunds"
|
||||
" WHERE coin_pub=$1),"
|
||||
" dep AS MATERIALIZED("
|
||||
" SELECT"
|
||||
" deposit_serial_id"
|
||||
" FROM deposits"
|
||||
" WHERE coin_pub = $1"
|
||||
" AND merchant_pub = $2"
|
||||
" AND h_contract_terms = $3"
|
||||
")"
|
||||
"SELECT"
|
||||
" rc.amount_with_fee_val"
|
||||
" ,rc.amount_with_fee_frac"
|
||||
" FROM "
|
||||
" rc JOIN dep USING (deposit_serial_id);");
|
||||
break;
|
||||
case 9:
|
||||
query = "get_refunds_by_coin_and_contract-v9-broken";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"SELECT"
|
||||
" ref.amount_with_fee_val"
|
||||
" ,ref.amount_with_fee_frac"
|
||||
" FROM deposits dep"
|
||||
" JOIN refunds ref USING(deposit_serial_id)"
|
||||
" WHERE dep.coin_pub IN ("
|
||||
" SELECT coin_pub"
|
||||
" FROM refunds"
|
||||
" WHERE coin_pub=$1)"
|
||||
" AND merchant_pub = $2"
|
||||
" AND h_contract_terms = $3;");
|
||||
break;
|
||||
case 10:
|
||||
query = "get_refunds_by_coin_and_contract-v10-broken";
|
||||
PREPARE (pg,
|
||||
query,
|
||||
"SELECT"
|
||||
" *"
|
||||
" FROM"
|
||||
" exchange_do_refund_by_coin"
|
||||
" ($1, $2, $3) "
|
||||
" AS (amount_with_fee_val INT8, amount_with_fee_frac INT4);");
|
||||
break;
|
||||
default:
|
||||
GNUNET_break (0);
|
||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||
}
|
||||
|
||||
qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
|
||||
"get_refunds_by_coin_and_contract",
|
||||
params,
|
||||
query,
|
||||
xparams,
|
||||
&get_refunds_cb,
|
||||
&srctx);
|
||||
if (GNUNET_SYSERR == srctx.status)
|
||||
|
@ -44,5 +44,7 @@ SET search_path TO exchange;
|
||||
#include "exchange_do_batch2_reserves_in_insert.sql"
|
||||
#include "exchange_do_batch4_reserves_in_insert.sql"
|
||||
#include "exchange_do_batch8_reserves_in_insert.sql"
|
||||
#include "exchange_do_refund_by_coin.sql"
|
||||
#include "exchange_do_get_ready_deposit.sql"
|
||||
|
||||
COMMIT;
|
||||
|
@ -24,14 +24,6 @@
|
||||
#include "taler_exchangedb_plugin.h"
|
||||
#include "math.h"
|
||||
|
||||
|
||||
#define NUM_ROWS 1000
|
||||
|
||||
/**
|
||||
* Global result from the testcase.
|
||||
*/
|
||||
static int result;
|
||||
|
||||
/**
|
||||
* Report line of error if @a cond is true, and jump to label "drop".
|
||||
*/
|
||||
@ -55,22 +47,10 @@ static int result;
|
||||
#define ZR_BLK(ptr) \
|
||||
memset (ptr, 0, sizeof (*ptr))
|
||||
|
||||
|
||||
/**
|
||||
* Currency we use. Must match test-exchange-db-*.conf.
|
||||
*/
|
||||
#define CURRENCY "EUR"
|
||||
|
||||
/**
|
||||
* How big do we make the RSA keys?
|
||||
*/
|
||||
#define RSA_KEY_SIZE 1024
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
|
||||
static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
|
||||
|
||||
static struct TALER_TransferPublicKeyP tpub;
|
||||
#define ROUNDS 10
|
||||
#define NUM_ROWS 1000
|
||||
#define MELT_NEW_COINS 5
|
||||
#define MELT_NOREVEAL_INDEX 1
|
||||
/**
|
||||
@ -82,7 +62,10 @@ static struct TALER_DenomFeeSet fees;
|
||||
* Denomination keys used for fresh coins in melt test.
|
||||
*/
|
||||
static struct DenomKeyPair **new_dkp;
|
||||
|
||||
static int result;
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
|
||||
static struct TALER_TransferPublicKeyP tpub;
|
||||
struct DenomKeyPair
|
||||
{
|
||||
struct TALER_DenominationPrivateKey priv;
|
||||
@ -222,8 +205,6 @@ handle_link_data_cb (void *cls,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Main function that will be run by the scheduler.
|
||||
*
|
||||
|
@ -24,9 +24,6 @@
|
||||
#include "taler_exchangedb_plugin.h"
|
||||
#include "math.h"
|
||||
|
||||
|
||||
#define NUM_ROWS 1000
|
||||
|
||||
/**
|
||||
* Global result from the testcase.
|
||||
*/
|
||||
@ -55,20 +52,13 @@ static int result;
|
||||
#define ZR_BLK(ptr) \
|
||||
memset (ptr, 0, sizeof (*ptr))
|
||||
|
||||
|
||||
/**
|
||||
* Currency we use. Must match test-exchange-db-*.conf.
|
||||
*/
|
||||
#define CURRENCY "EUR"
|
||||
|
||||
/**
|
||||
* How big do we make the RSA keys?
|
||||
*/
|
||||
#define RSA_KEY_SIZE 1024
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
|
||||
|
||||
#define ROUNDS 100
|
||||
#define NUM_ROWS 1000000
|
||||
#define ROUNDS 10000
|
||||
#define MELT_NEW_COINS 5
|
||||
#define MELT_NOREVEAL_INDEX 1
|
||||
/**
|
||||
@ -81,7 +71,7 @@ static struct TALER_MerchantWireHashP h_wire_wt;
|
||||
* Denomination keys used for fresh coins in melt test.
|
||||
*/
|
||||
static struct DenomKeyPair **new_dkp;
|
||||
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
struct DenomKeyPair
|
||||
{
|
||||
struct TALER_DenominationPrivateKey priv;
|
||||
@ -389,7 +379,6 @@ run (void *cls)
|
||||
&nonce_ok,
|
||||
&ruuid));
|
||||
}
|
||||
|
||||
{
|
||||
/* ENSURE_COIN_KNOWN */
|
||||
uint64_t known_coin_id;
|
||||
@ -408,23 +397,23 @@ run (void *cls)
|
||||
refresh.noreveal_index = MELT_NOREVEAL_INDEX;
|
||||
}
|
||||
/*STORE INTO DEPOSIT*/
|
||||
{
|
||||
struct GNUNET_TIME_Timestamp now;
|
||||
now = GNUNET_TIME_timestamp_get ();
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
plugin->insert_deposit (plugin->cls,
|
||||
now,
|
||||
&depos[i]));
|
||||
}
|
||||
if (ROUNDS == i)
|
||||
TALER_denom_sig_free (&depos[i].coin.denom_sig);
|
||||
{
|
||||
struct GNUNET_TIME_Timestamp now;
|
||||
now = GNUNET_TIME_timestamp_get ();
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
plugin->insert_deposit (plugin->cls,
|
||||
now,
|
||||
&depos[i]));
|
||||
}
|
||||
if (ROUNDS == i)
|
||||
TALER_denom_sig_free (&depos[i].coin.denom_sig);
|
||||
}
|
||||
/* End of benchmark setup */
|
||||
GNUNET_free(perm);
|
||||
// commit
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
|
||||
plugin->commit (plugin->cls));
|
||||
/**** CALL GET LINK DATA ****/
|
||||
/**** CALL GET READY DEPOSIT ****/
|
||||
for (unsigned int r=0; r< ROUNDS; r++)
|
||||
{
|
||||
struct GNUNET_TIME_Absolute time;
|
||||
|
@ -24,8 +24,6 @@
|
||||
#include "taler_exchangedb_plugin.h"
|
||||
#include "math.h"
|
||||
|
||||
#define NUM_ROWS 10000
|
||||
|
||||
/**
|
||||
* Global result from the testcase.
|
||||
*/
|
||||
@ -41,7 +39,6 @@ static int result;
|
||||
goto drop; \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
* Initializes @a ptr with random data.
|
||||
*/
|
||||
@ -54,16 +51,13 @@ static int result;
|
||||
#define ZR_BLK(ptr) \
|
||||
memset (ptr, 0, sizeof (*ptr))
|
||||
|
||||
|
||||
/**
|
||||
* Currency we use. Must match test-exchange-db-*.conf.
|
||||
*/
|
||||
#define CURRENCY "EUR"
|
||||
/**
|
||||
* How big do we make the RSA keys?
|
||||
*/
|
||||
#define RSA_KEY_SIZE 1024
|
||||
#define ROUNDS 1000
|
||||
#define ROUNDS 10000
|
||||
#define NUM_ROWS 1000000
|
||||
#define MELT_NEW_COINS 5
|
||||
#define MELT_NOREVEAL_INDEX 1
|
||||
/**
|
||||
@ -72,14 +66,14 @@ static int result;
|
||||
static struct TALER_EXCHANGEDB_Plugin *plugin;
|
||||
static struct TALER_DenomFeeSet fees;
|
||||
static struct TALER_MerchantWireHashP h_wire_wt;
|
||||
|
||||
static struct DenomKeyPair **new_dkp;
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
struct DenomKeyPair
|
||||
{
|
||||
struct TALER_DenominationPrivateKey priv;
|
||||
struct TALER_DenominationPublicKey pub;
|
||||
};
|
||||
static struct DenomKeyPair **new_dkp;
|
||||
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
|
||||
|
||||
/**
|
||||
* Destroy a denomination key pair. The key is not necessarily removed from the DB.
|
||||
*
|
||||
@ -185,7 +179,6 @@ check_refund_cb (void *cls,
|
||||
const struct TALER_Amount *amount_with_fee)
|
||||
{
|
||||
const struct TALER_EXCHANGEDB_Refund *refund = cls;
|
||||
|
||||
if (0 != TALER_amount_cmp (amount_with_fee,
|
||||
&refund->details.refund_amount))
|
||||
{
|
||||
@ -207,7 +200,6 @@ run (void *cls)
|
||||
{
|
||||
struct GNUNET_CONFIGURATION_Handle *cfg = cls;
|
||||
const uint32_t num_partitions = 10;
|
||||
struct DenomKeyPair *dkp = NULL;
|
||||
struct GNUNET_TIME_Timestamp ts;
|
||||
struct TALER_EXCHANGEDB_Deposit *depos=NULL;
|
||||
struct GNUNET_TIME_Timestamp deadline;
|
||||
@ -226,6 +218,8 @@ run (void *cls)
|
||||
struct TALER_CoinSpendPublicKeyP coin_pub;
|
||||
struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin;
|
||||
struct TALER_DenominationPublicKey *new_denom_pubs = NULL;
|
||||
unsigned int count=0;
|
||||
|
||||
ref = GNUNET_new_array (ROUNDS +1,
|
||||
struct TALER_EXCHANGEDB_Refund);
|
||||
depos = GNUNET_new_array (ROUNDS +1,
|
||||
@ -400,18 +394,72 @@ run (void *cls)
|
||||
now,
|
||||
&depos[i]));
|
||||
}
|
||||
|
||||
/* 100% Refund */
|
||||
{
|
||||
bool not_found;
|
||||
bool refund_ok;
|
||||
bool gone;
|
||||
bool conflict;
|
||||
ref[i].coin = depos[i].coin;
|
||||
ref[i].details.merchant_pub = depos[i].merchant_pub;
|
||||
unsigned int refund_percent=0;
|
||||
switch (refund_percent){
|
||||
case 2 ://100% refund
|
||||
ref[i].coin = depos[i].coin;
|
||||
ref[i].details.merchant_pub = depos[i].merchant_pub;
|
||||
RND_BLK(&ref[i].details.merchant_sig);
|
||||
ref[i].details.h_contract_terms = depos[i].h_contract_terms;
|
||||
ref[i].coin.coin_pub = depos[i].coin.coin_pub;
|
||||
ref[i].details.rtransaction_id = i;
|
||||
ref[i].details.refund_amount = value;
|
||||
ref[i].details.refund_fee = fees.refund;
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
plugin->do_refund (plugin->cls,
|
||||
&ref[i],
|
||||
&fees.deposit,
|
||||
known_coin_id,
|
||||
¬_found,
|
||||
&refund_ok,
|
||||
&gone,
|
||||
&conflict));
|
||||
break;
|
||||
case 1 ://10% refund
|
||||
if (count < (NUM_ROWS/10))
|
||||
{
|
||||
ref[i].coin = depos[i].coin;
|
||||
ref[i].details.merchant_pub = depos[i].merchant_pub;
|
||||
RND_BLK(&ref[i].details.merchant_sig);
|
||||
ref[i].details.h_contract_terms = depos[i].h_contract_terms;
|
||||
ref[i].coin.coin_pub = depos[i].coin.coin_pub;
|
||||
ref[i].details.rtransaction_id = i;
|
||||
ref[i].details.refund_amount = value;
|
||||
ref[i].details.refund_fee = fees.refund;
|
||||
}
|
||||
else
|
||||
{
|
||||
ref[i].coin = depos[i].coin;
|
||||
RND_BLK(&ref[i].details.merchant_pub);
|
||||
RND_BLK(&ref[i].details.merchant_sig);
|
||||
RND_BLK(&ref[i].details.h_contract_terms);
|
||||
RND_BLK(&ref[i].coin.coin_pub);
|
||||
ref[i].details.rtransaction_id = i;
|
||||
ref[i].details.refund_amount = value;
|
||||
ref[i].details.refund_fee = fees.refund;
|
||||
}
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
plugin->do_refund (plugin->cls,
|
||||
&ref[i],
|
||||
&fees.deposit,
|
||||
known_coin_id,
|
||||
¬_found,
|
||||
&refund_ok,
|
||||
&gone,
|
||||
&conflict));
|
||||
count++;
|
||||
break;
|
||||
case 0://no refund
|
||||
ref[i].coin=depos[i].coin;
|
||||
RND_BLK(&ref[i].details.merchant_pub);
|
||||
RND_BLK(&ref[i].details.merchant_sig);
|
||||
ref[i].details.h_contract_terms = depos[i].h_contract_terms;
|
||||
ref[i].coin.coin_pub = depos[i].coin.coin_pub;
|
||||
RND_BLK(&ref[i].details.h_contract_terms);
|
||||
RND_BLK(&ref[i].coin.coin_pub);
|
||||
ref[i].details.rtransaction_id = i;
|
||||
ref[i].details.refund_amount = value;
|
||||
ref[i].details.refund_fee = fees.refund;
|
||||
@ -424,10 +472,8 @@ run (void *cls)
|
||||
&refund_ok,
|
||||
&gone,
|
||||
&conflict));
|
||||
|
||||
/* FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
plugin->insert_refund (plugin->cls,
|
||||
&ref[i]));*/
|
||||
break;
|
||||
}/* END OF SWITCH CASE */
|
||||
}
|
||||
if (ROUNDS == i)
|
||||
TALER_denom_sig_free (&depos[i].coin.denom_sig);
|
||||
@ -443,7 +489,7 @@ run (void *cls)
|
||||
struct GNUNET_TIME_Relative duration;
|
||||
|
||||
time = GNUNET_TIME_absolute_get ();
|
||||
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||
FAILIF (0 >
|
||||
plugin->select_refunds_by_coin (plugin->cls,
|
||||
&ref[r].coin.coin_pub,
|
||||
&ref[r].details.merchant_pub,
|
||||
@ -476,10 +522,8 @@ run (void *cls)
|
||||
result = 0;
|
||||
drop:
|
||||
GNUNET_break (GNUNET_OK ==
|
||||
plugin->drop_tables (plugin->cls));
|
||||
plugin->drop_tables (plugin->cls));
|
||||
cleanup:
|
||||
if (NULL != dkp)
|
||||
destroy_denom_key_pair (dkp);
|
||||
if (NULL != revealed_coins)
|
||||
{
|
||||
for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++)
|
||||
@ -502,7 +546,6 @@ cleanup:
|
||||
}
|
||||
GNUNET_free(depos);
|
||||
GNUNET_free(ref);
|
||||
dkp = NULL;
|
||||
TALER_EXCHANGEDB_plugin_unload (plugin);
|
||||
plugin = NULL;
|
||||
}
|
Loading…
Reference in New Issue
Block a user