refactor: extensions_ -> policy_; added policy_fulfilment
This commit is contained in:
parent
dd60d9b984
commit
52106eea42
@ -113,7 +113,8 @@ static struct Table tables[] = {
|
|||||||
{ .rt = TALER_EXCHANGEDB_RT_RECOUP},
|
{ .rt = TALER_EXCHANGEDB_RT_RECOUP},
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_RECOUP_REFRESH },
|
{ .rt = TALER_EXCHANGEDB_RT_RECOUP_REFRESH },
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_EXTENSIONS},
|
{ .rt = TALER_EXCHANGEDB_RT_EXTENSIONS},
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS },
|
{ .rt = TALER_EXCHANGEDB_RT_POLICY_DETAILS },
|
||||||
|
{ .rt = TALER_EXCHANGEDB_RT_POLICY_FULFILMENTS },
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_PURSE_REQUESTS},
|
{ .rt = TALER_EXCHANGEDB_RT_PURSE_REQUESTS},
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_PURSE_REFUNDS},
|
{ .rt = TALER_EXCHANGEDB_RT_PURSE_REFUNDS},
|
||||||
{ .rt = TALER_EXCHANGEDB_RT_PURSE_MERGES},
|
{ .rt = TALER_EXCHANGEDB_RT_PURSE_MERGES},
|
||||||
|
@ -170,23 +170,6 @@ deposit_transaction (void *cls,
|
|||||||
if (qs < 0)
|
if (qs < 0)
|
||||||
return qs;
|
return qs;
|
||||||
|
|
||||||
/* Check and apply policies, if applicable */
|
|
||||||
if (NULL != dc->policy_extension)
|
|
||||||
{
|
|
||||||
const struct TALER_Extension *ext = dc->policy_extension;
|
|
||||||
struct TALER_ExtensionsPolicySerialID serialID;
|
|
||||||
struct GNUNET_TIME_Timestamp deadline;
|
|
||||||
GNUNET_assert (ext->parse_policy_details);
|
|
||||||
|
|
||||||
qs = ext->parse_policy_details (dc->deposit->policy_details,
|
|
||||||
&serialID,
|
|
||||||
&deadline);
|
|
||||||
|
|
||||||
if (qs < 0)
|
|
||||||
return qs;
|
|
||||||
|
|
||||||
blocked_by_policy = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
qs = TEH_plugin->do_deposit (TEH_plugin->cls,
|
qs = TEH_plugin->do_deposit (TEH_plugin->cls,
|
||||||
dc->deposit,
|
dc->deposit,
|
||||||
@ -351,6 +334,39 @@ TEH_handler_deposit (struct MHD_Connection *connection,
|
|||||||
&h_wire);
|
&h_wire);
|
||||||
dc.deposit = &deposit;
|
dc.deposit = &deposit;
|
||||||
|
|
||||||
|
/* TODO: extract policy information */
|
||||||
|
#if 0
|
||||||
|
if (! deposit.no_policy_details)
|
||||||
|
{
|
||||||
|
const struct TALER_Extension *ext;
|
||||||
|
struct TALER_ExtensionsPolicySerialID serialID;
|
||||||
|
struct GNUNET_TIME_Timestamp deadline;
|
||||||
|
enum GNUNET_GenericReturnValue ret;
|
||||||
|
GNUNET_assert (ext->parse_policy_details);
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"DEBUG calling parse_policy_details on extension '%s' with details '%s'\n",
|
||||||
|
ext->name,
|
||||||
|
json_dumps (dc->deposit->policy_details, JSON_INDENT (2)));
|
||||||
|
|
||||||
|
ret = ext->parse_policy_details (dc->deposit->policy_details,
|
||||||
|
&serialID,
|
||||||
|
&deadline);
|
||||||
|
|
||||||
|
if (GNUNET_OK != ret)
|
||||||
|
{
|
||||||
|
TALER_LOG_WARNING ("Failed to parse policy details\n");
|
||||||
|
*mhd_ret = TALER_MHD_reply_with_error (connection,
|
||||||
|
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
||||||
|
TALER_EC_GENERIC_DB_STORE_FAILED,
|
||||||
|
"deposit");
|
||||||
|
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||||
|
}
|
||||||
|
blocked_by_policy = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* new deposit */
|
/* new deposit */
|
||||||
dc.exchange_timestamp = GNUNET_TIME_timestamp_get ();
|
dc.exchange_timestamp = GNUNET_TIME_timestamp_get ();
|
||||||
/* check denomination exists and is valid */
|
/* check denomination exists and is valid */
|
||||||
|
@ -885,8 +885,8 @@ BEGIN
|
|||||||
',wire_salt BYTEA NOT NULL CHECK (LENGTH(wire_salt)=16)'
|
',wire_salt BYTEA NOT NULL CHECK (LENGTH(wire_salt)=16)'
|
||||||
',wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)'
|
',wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)'
|
||||||
',done BOOLEAN NOT NULL DEFAULT FALSE'
|
',done BOOLEAN NOT NULL DEFAULT FALSE'
|
||||||
',extension_blocked BOOLEAN NOT NULL DEFAULT FALSE'
|
',policy_blocked BOOLEAN NOT NULL DEFAULT FALSE'
|
||||||
',extension_details_serial_id INT8' -- REFERENCES extension_details (extension_details_serial_id) ON DELETE CASCADE'
|
',policy_details_serial_id INT8' -- REFERENCES policy_details (policy_details_serial_id) ON DELETE CASCADE'
|
||||||
') %s ;'
|
') %s ;'
|
||||||
,table_name
|
,table_name
|
||||||
,'PARTITION BY HASH (coin_pub)'
|
,'PARTITION BY HASH (coin_pub)'
|
||||||
@ -2617,7 +2617,7 @@ BEGIN
|
|||||||
|
|
||||||
ALTER TABLE IF EXISTS deposits
|
ALTER TABLE IF EXISTS deposits
|
||||||
DROP CONSTRAINT IF EXISTS deposits_pkey CASCADE
|
DROP CONSTRAINT IF EXISTS deposits_pkey CASCADE
|
||||||
,DROP CONSTRAINT IF EXISTS deposits_extension_details_serial_id_fkey
|
,DROP CONSTRAINT IF EXISTS deposits_policy_details_serial_id_fkey
|
||||||
,DROP CONSTRAINT IF EXISTS deposits_coin_pub_merchant_pub_h_contract_terms_key CASCADE
|
,DROP CONSTRAINT IF EXISTS deposits_coin_pub_merchant_pub_h_contract_terms_key CASCADE
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -432,14 +432,14 @@ COMMENT ON TABLE signkey_revocations
|
|||||||
CREATE TABLE IF NOT EXISTS extensions
|
CREATE TABLE IF NOT EXISTS extensions
|
||||||
(extension_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
|
(extension_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
|
||||||
,name VARCHAR NOT NULL UNIQUE
|
,name VARCHAR NOT NULL UNIQUE
|
||||||
,config BYTEA
|
,manifest BYTEA
|
||||||
);
|
);
|
||||||
COMMENT ON TABLE extensions
|
COMMENT ON TABLE extensions
|
||||||
IS 'Configurations of the activated extensions';
|
IS 'Configurations of the activated extensions';
|
||||||
COMMENT ON COLUMN extensions.name
|
COMMENT ON COLUMN extensions.name
|
||||||
IS 'Name of the extension';
|
IS 'Name of the extension';
|
||||||
COMMENT ON COLUMN extensions.config
|
COMMENT ON COLUMN extensions.manifest
|
||||||
IS 'Configuration of the extension as JSON-blob, maybe NULL';
|
IS 'Manifest of the extension as JSON-blob, maybe NULL';
|
||||||
|
|
||||||
|
|
||||||
-- ------------------------------ known_coins ----------------------------------------
|
-- ------------------------------ known_coins ----------------------------------------
|
||||||
@ -536,22 +536,46 @@ CREATE TABLE IF NOT EXISTS refresh_transfer_keys_default
|
|||||||
SELECT add_constraints_to_refresh_transfer_keys_partition('default');
|
SELECT add_constraints_to_refresh_transfer_keys_partition('default');
|
||||||
|
|
||||||
|
|
||||||
-- ------------------------------ extension_details ----------------------------------------
|
-- ------------------------------ policy_fulfilments -------------------------------------
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS extension_details
|
CREATE TABLE IF NOT EXISTS policy_fulfilments
|
||||||
(extension_details_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
|
(policy_fulfilments_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
|
||||||
,extension_options VARCHAR)
|
,fulfilment_timestamp INT8 NOT NULL
|
||||||
PARTITION BY HASH (extension_details_serial_id);
|
,fulfilment_proof VARCHAR)
|
||||||
COMMENT ON TABLE extension_details
|
PARTITION BY HASH (policy_fulfilments_serial_id);
|
||||||
IS 'Extensions that were provided with deposits (not yet used).';
|
COMMENT ON TABLE policy_fulfilments
|
||||||
COMMENT ON COLUMN extension_details.extension_options
|
IS 'Proofs of fulfilment of policies that were set in deposits';
|
||||||
IS 'JSON object with options set that the exchange needs to consider when executing a deposit. Supported details depend on the extensions supported by the exchange.';
|
COMMENT ON COLUMN policy_fulfilments.fulfilment_timestamp
|
||||||
|
IS 'Timestamp of the arrival of a proof of fulfilment';
|
||||||
|
COMMENT ON COLUMN policy_fulfilments.fulfilment_proof
|
||||||
|
IS 'JSON object with a proof of the fulfilment of a policy. Supported details depend on the policy extensions supported by the exchange.';
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS extension_details_default
|
CREATE TABLE IF NOT EXISTS policy_fulfilments_default
|
||||||
PARTITION OF extension_details
|
PARTITION OF policy_fulfilments
|
||||||
FOR VALUES WITH (MODULUS 1, REMAINDER 0);
|
FOR VALUES WITH (MODULUS 1, REMAINDER 0);
|
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------ policy_details ----------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS policy_details
|
||||||
|
(policy_details_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY
|
||||||
|
,serial_id BYTEA PRIMARY KEY CHECK(LENGTH(serial_id)=64)
|
||||||
|
,policy_options VARCHAR
|
||||||
|
,fulfilment_serial_id BIGINT REFERENCES policy_fulfilments(policy_fulfilments_serial_id) ON DELETE CASCADE)
|
||||||
|
PARTITION BY HASH (serial_id);
|
||||||
|
COMMENT ON TABLE policy_details
|
||||||
|
IS 'Policies that were provided with deposits via policy extensions.';
|
||||||
|
COMMENT ON COLUMN policy_details.serial_id
|
||||||
|
IS 'ID (GNUNET_HashCode) that identifies a policy. Will be calculated by the policy extension based on the content';
|
||||||
|
COMMENT ON COLUMN policy_details.policy_options
|
||||||
|
IS 'JSON object with options set that the exchange needs to consider when executing a deposit. Supported details depend on the policy extensions supported by the exchange.';
|
||||||
|
COMMENT ON COLUMN policy_details.fulfilment_serial_id
|
||||||
|
IS 'If not NULL, refers to the proof of fulfilment of this policy';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS policy_details_default
|
||||||
|
PARTITION OF policy_details
|
||||||
|
FOR VALUES WITH (MODULUS 1, REMAINDER 0);
|
||||||
|
|
||||||
-- ------------------------------ deposits ----------------------------------------
|
-- ------------------------------ deposits ----------------------------------------
|
||||||
|
|
||||||
SELECT create_table_deposits();
|
SELECT create_table_deposits();
|
||||||
@ -568,10 +592,10 @@ COMMENT ON COLUMN deposits.wire_salt
|
|||||||
IS 'Salt used when hashing the payto://-URI to get the h_wire';
|
IS 'Salt used when hashing the payto://-URI to get the h_wire';
|
||||||
COMMENT ON COLUMN deposits.done
|
COMMENT ON COLUMN deposits.done
|
||||||
IS 'Set to TRUE once we have included this deposit in some aggregate wire transfer to the merchant';
|
IS 'Set to TRUE once we have included this deposit in some aggregate wire transfer to the merchant';
|
||||||
COMMENT ON COLUMN deposits.extension_blocked
|
COMMENT ON COLUMN deposits.policy_blocked
|
||||||
IS 'True if the aggregation of the deposit is currently blocked by some extension mechanism. Used to filter out deposits that must not be processed by the canonical deposit logic.';
|
IS 'True if the aggregation of the deposit is currently blocked by some policy extension mechanism. Used to filter out deposits that must not be processed by the canonical deposit logic.';
|
||||||
COMMENT ON COLUMN deposits.extension_details_serial_id
|
COMMENT ON COLUMN deposits.policy_details_serial_id
|
||||||
IS 'References extensions table, NULL if extensions are not used';
|
IS 'References policy extensions table, NULL if policy extensions are not used';
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS deposits_default
|
CREATE TABLE IF NOT EXISTS deposits_default
|
||||||
PARTITION OF deposits
|
PARTITION OF deposits
|
||||||
@ -607,7 +631,7 @@ CREATE OR REPLACE FUNCTION deposits_insert_trigger()
|
|||||||
DECLARE
|
DECLARE
|
||||||
is_ready BOOLEAN;
|
is_ready BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
is_ready = NOT (NEW.done OR NEW.extension_blocked);
|
is_ready = NOT (NEW.done OR NEW.policy_blocked);
|
||||||
|
|
||||||
IF (is_ready)
|
IF (is_ready)
|
||||||
THEN
|
THEN
|
||||||
@ -651,8 +675,8 @@ DECLARE
|
|||||||
DECLARE
|
DECLARE
|
||||||
is_ready BOOLEAN;
|
is_ready BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
was_ready = NOT (OLD.done OR OLD.extension_blocked);
|
was_ready = NOT (OLD.done OR OLD.policy_blocked);
|
||||||
is_ready = NOT (NEW.done OR NEW.extension_blocked);
|
is_ready = NOT (NEW.done OR NEW.policy_blocked);
|
||||||
IF (was_ready AND NOT is_ready)
|
IF (was_ready AND NOT is_ready)
|
||||||
THEN
|
THEN
|
||||||
DELETE FROM exchange.deposits_by_ready
|
DELETE FROM exchange.deposits_by_ready
|
||||||
@ -706,7 +730,7 @@ CREATE OR REPLACE FUNCTION deposits_delete_trigger()
|
|||||||
DECLARE
|
DECLARE
|
||||||
was_ready BOOLEAN;
|
was_ready BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
was_ready = NOT (OLD.done OR OLD.extension_blocked);
|
was_ready = NOT (OLD.done OR OLD.policy_blocked);
|
||||||
|
|
||||||
IF (was_ready)
|
IF (was_ready)
|
||||||
THEN
|
THEN
|
||||||
|
@ -669,11 +669,11 @@ irbt_cb_table_deposits (struct PostgresClosure *pg,
|
|||||||
GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.wire_salt),
|
GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.wire_salt),
|
||||||
GNUNET_PQ_query_param_auto_from_type (
|
GNUNET_PQ_query_param_auto_from_type (
|
||||||
&td->details.deposits.wire_target_h_payto),
|
&td->details.deposits.wire_target_h_payto),
|
||||||
GNUNET_PQ_query_param_bool (td->details.deposits.extension_blocked),
|
GNUNET_PQ_query_param_bool (td->details.deposits.policy_blocked),
|
||||||
0 == td->details.deposits.extension_details_serial_id
|
0 == td->details.deposits.policy_details_serial_id
|
||||||
? GNUNET_PQ_query_param_null ()
|
? GNUNET_PQ_query_param_null ()
|
||||||
: GNUNET_PQ_query_param_uint64 (
|
: GNUNET_PQ_query_param_uint64 (
|
||||||
&td->details.deposits.extension_details_serial_id),
|
&td->details.deposits.policy_details_serial_id),
|
||||||
GNUNET_PQ_query_param_end
|
GNUNET_PQ_query_param_end
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -905,9 +905,9 @@ irbt_cb_table_extensions (struct PostgresClosure *pg,
|
|||||||
struct GNUNET_PQ_QueryParam params[] = {
|
struct GNUNET_PQ_QueryParam params[] = {
|
||||||
GNUNET_PQ_query_param_uint64 (&td->serial),
|
GNUNET_PQ_query_param_uint64 (&td->serial),
|
||||||
GNUNET_PQ_query_param_string (td->details.extensions.name),
|
GNUNET_PQ_query_param_string (td->details.extensions.name),
|
||||||
NULL == td->details.extensions.config ?
|
NULL == td->details.extensions.manifest ?
|
||||||
GNUNET_PQ_query_param_null () :
|
GNUNET_PQ_query_param_null () :
|
||||||
GNUNET_PQ_query_param_string (td->details.extensions.config),
|
GNUNET_PQ_query_param_string (td->details.extensions.manifest),
|
||||||
GNUNET_PQ_query_param_end
|
GNUNET_PQ_query_param_end
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -918,27 +918,27 @@ irbt_cb_table_extensions (struct PostgresClosure *pg,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called with extension_details records to insert into table.
|
* Function called with policy_details records to insert into table.
|
||||||
*
|
*
|
||||||
* @param pg plugin context
|
* @param pg plugin context
|
||||||
* @param td record to insert
|
* @param td record to insert
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
irbt_cb_table_extension_details (struct PostgresClosure *pg,
|
irbt_cb_table_policy_details (struct PostgresClosure *pg,
|
||||||
const struct TALER_EXCHANGEDB_TableData *td)
|
const struct TALER_EXCHANGEDB_TableData *td)
|
||||||
{
|
{
|
||||||
struct GNUNET_PQ_QueryParam params[] = {
|
struct GNUNET_PQ_QueryParam params[] = {
|
||||||
GNUNET_PQ_query_param_uint64 (&td->serial),
|
GNUNET_PQ_query_param_uint64 (&td->serial),
|
||||||
NULL ==
|
NULL ==
|
||||||
td->details.extension_details.extension_options ?
|
td->details.policy_details.policy_options ?
|
||||||
GNUNET_PQ_query_param_null () :
|
GNUNET_PQ_query_param_null () :
|
||||||
GNUNET_PQ_query_param_string (
|
GNUNET_PQ_query_param_string (
|
||||||
td->details.extension_details.extension_options),
|
td->details.policy_details.policy_options),
|
||||||
GNUNET_PQ_query_param_end
|
GNUNET_PQ_query_param_end
|
||||||
};
|
};
|
||||||
|
|
||||||
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
|
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
|
||||||
"insert_into_table_extension_details",
|
"insert_into_table_policy_details",
|
||||||
params);
|
params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -895,7 +895,7 @@ lrbt_cb_table_deposits (void *cls,
|
|||||||
|
|
||||||
for (unsigned int i = 0; i<num_results; i++)
|
for (unsigned int i = 0; i<num_results; i++)
|
||||||
{
|
{
|
||||||
bool no_extension;
|
bool no_policy;
|
||||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
GNUNET_PQ_result_spec_uint64 (
|
GNUNET_PQ_result_spec_uint64 (
|
||||||
"serial",
|
"serial",
|
||||||
@ -940,13 +940,13 @@ lrbt_cb_table_deposits (void *cls,
|
|||||||
"wire_target_h_payto",
|
"wire_target_h_payto",
|
||||||
&td.details.deposits.wire_target_h_payto),
|
&td.details.deposits.wire_target_h_payto),
|
||||||
GNUNET_PQ_result_spec_auto_from_type (
|
GNUNET_PQ_result_spec_auto_from_type (
|
||||||
"extension_blocked",
|
"policy_blocked",
|
||||||
&td.details.deposits.extension_blocked),
|
&td.details.deposits.policy_blocked),
|
||||||
GNUNET_PQ_result_spec_allow_null (
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
GNUNET_PQ_result_spec_uint64 (
|
GNUNET_PQ_result_spec_uint64 (
|
||||||
"extension_details_serial_id",
|
"policy_details_serial_id",
|
||||||
&td.details.deposits.extension_details_serial_id),
|
&td.details.deposits.policy_details_serial_id),
|
||||||
&no_extension),
|
&no_policy),
|
||||||
GNUNET_PQ_result_spec_end
|
GNUNET_PQ_result_spec_end
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1400,8 +1400,8 @@ lrbt_cb_table_extensions (void *cls,
|
|||||||
GNUNET_PQ_result_spec_string ("name",
|
GNUNET_PQ_result_spec_string ("name",
|
||||||
&td.details.extensions.name),
|
&td.details.extensions.name),
|
||||||
GNUNET_PQ_result_spec_allow_null (
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
GNUNET_PQ_result_spec_string ("config",
|
GNUNET_PQ_result_spec_string ("manifest",
|
||||||
&td.details.extensions.config),
|
&td.details.extensions.manifest),
|
||||||
&no_config),
|
&no_config),
|
||||||
GNUNET_PQ_result_spec_end
|
GNUNET_PQ_result_spec_end
|
||||||
};
|
};
|
||||||
@ -1423,33 +1423,95 @@ lrbt_cb_table_extensions (void *cls,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called with extension_details table entries.
|
* Function called with policy_details table entries.
|
||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param result the postgres result
|
* @param result the postgres result
|
||||||
* @param num_results the number of results in @a result
|
* @param num_results the number of results in @a result
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
lrbt_cb_table_extension_details (void *cls,
|
lrbt_cb_table_policy_details (void *cls,
|
||||||
PGresult *result,
|
PGresult *result,
|
||||||
unsigned int num_results)
|
unsigned int num_results)
|
||||||
{
|
{
|
||||||
struct LookupRecordsByTableContext *ctx = cls;
|
struct LookupRecordsByTableContext *ctx = cls;
|
||||||
struct TALER_EXCHANGEDB_TableData td = {
|
struct TALER_EXCHANGEDB_TableData td = {
|
||||||
.table = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS
|
.table = TALER_EXCHANGEDB_RT_POLICY_DETAILS
|
||||||
};
|
};
|
||||||
|
|
||||||
for (unsigned int i = 0; i<num_results; i++)
|
for (unsigned int i = 0; i<num_results; i++)
|
||||||
{
|
{
|
||||||
bool no_config = false;
|
bool no_config = false;
|
||||||
|
bool no_fulfilment = false;
|
||||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
GNUNET_PQ_result_spec_uint64 ("extension_details_serial_id",
|
GNUNET_PQ_result_spec_uint64 ("policy_details_serial_id",
|
||||||
|
&td.serial),
|
||||||
|
GNUNET_PQ_result_spec_auto_from_type ("serial_id",
|
||||||
|
&td.details.policy_details.
|
||||||
|
serial_id),
|
||||||
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
|
GNUNET_PQ_result_spec_string ("policy_options",
|
||||||
|
&td.details.policy_details.
|
||||||
|
policy_options),
|
||||||
|
&no_config),
|
||||||
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
|
GNUNET_PQ_result_spec_uint64 ("fulfilment_serial_id",
|
||||||
|
&td.details.policy_details.
|
||||||
|
fulfilment_serial_id),
|
||||||
|
&no_fulfilment),
|
||||||
|
GNUNET_PQ_result_spec_end
|
||||||
|
};
|
||||||
|
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
GNUNET_PQ_extract_result (result,
|
||||||
|
rs,
|
||||||
|
i))
|
||||||
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
|
ctx->error = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ctx->cb (ctx->cb_cls,
|
||||||
|
&td);
|
||||||
|
GNUNET_PQ_cleanup_result (rs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function called with policy_fulfilments table entries.
|
||||||
|
*
|
||||||
|
* @param cls closure
|
||||||
|
* @param result the postgres result
|
||||||
|
* @param num_results the number of results in @a result
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
lrbt_cb_table_policy_fulfilments (void *cls,
|
||||||
|
PGresult *result,
|
||||||
|
unsigned int num_results)
|
||||||
|
{
|
||||||
|
struct LookupRecordsByTableContext *ctx = cls;
|
||||||
|
struct TALER_EXCHANGEDB_TableData td = {
|
||||||
|
.table = TALER_EXCHANGEDB_RT_POLICY_FULFILMENTS
|
||||||
|
};
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i<num_results; i++)
|
||||||
|
{
|
||||||
|
bool no_config = false;
|
||||||
|
bool no_timestamp = false;
|
||||||
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
|
GNUNET_PQ_result_spec_uint64 ("policy_fulfilment_serial_id",
|
||||||
&td.serial),
|
&td.serial),
|
||||||
GNUNET_PQ_result_spec_allow_null (
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
GNUNET_PQ_result_spec_string ("extension_options",
|
GNUNET_PQ_result_spec_string ("fulfilment_proof",
|
||||||
&td.details.extension_details.
|
&td.details.policy_fulfilments.
|
||||||
extension_options),
|
fulfilment_proof),
|
||||||
&no_config),
|
&no_config),
|
||||||
|
GNUNET_PQ_result_spec_allow_null (
|
||||||
|
GNUNET_PQ_result_spec_timestamp ("fulfilment_timestamp",
|
||||||
|
&td.details.policy_fulfilments.
|
||||||
|
fulfilment_timestamp),
|
||||||
|
&no_timestamp),
|
||||||
GNUNET_PQ_result_spec_end
|
GNUNET_PQ_result_spec_end
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2993,11 +2993,11 @@ prepare_statements (struct PostgresClosure *pg)
|
|||||||
" LIMIT 1;",
|
" LIMIT 1;",
|
||||||
0),
|
0),
|
||||||
GNUNET_PQ_make_prepare (
|
GNUNET_PQ_make_prepare (
|
||||||
"select_serial_by_table_extension_details",
|
"select_serial_by_table_policy_details",
|
||||||
"SELECT"
|
"SELECT"
|
||||||
" extension_details_serial_id AS serial"
|
" policy_details_serial_id AS serial"
|
||||||
" FROM extension_details"
|
" FROM policy_details"
|
||||||
" ORDER BY extension_details_serial_id DESC"
|
" ORDER BY policy_details_serial_id DESC"
|
||||||
" LIMIT 1;",
|
" LIMIT 1;",
|
||||||
0),
|
0),
|
||||||
GNUNET_PQ_make_prepare (
|
GNUNET_PQ_make_prepare (
|
||||||
@ -3318,8 +3318,8 @@ prepare_statements (struct PostgresClosure *pg)
|
|||||||
",wire_salt"
|
",wire_salt"
|
||||||
",wire_target_h_payto"
|
",wire_target_h_payto"
|
||||||
",done"
|
",done"
|
||||||
",extension_blocked"
|
",policy_blocked"
|
||||||
",extension_details_serial_id"
|
",policy_details_serial_id"
|
||||||
" FROM deposits"
|
" FROM deposits"
|
||||||
" WHERE deposit_serial_id > $1"
|
" WHERE deposit_serial_id > $1"
|
||||||
" ORDER BY deposit_serial_id ASC;",
|
" ORDER BY deposit_serial_id ASC;",
|
||||||
@ -3821,8 +3821,8 @@ prepare_statements (struct PostgresClosure *pg)
|
|||||||
",coin_sig"
|
",coin_sig"
|
||||||
",wire_salt"
|
",wire_salt"
|
||||||
",wire_target_h_payto"
|
",wire_target_h_payto"
|
||||||
",extension_blocked"
|
",policy_blocked"
|
||||||
",extension_details_serial_id"
|
",policy_details_serial_id"
|
||||||
") VALUES "
|
") VALUES "
|
||||||
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
|
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
|
||||||
" $11, $12, $13, $14, $15, $16, $17);",
|
" $11, $12, $13, $14, $15, $16, $17);",
|
||||||
@ -3927,14 +3927,24 @@ prepare_statements (struct PostgresClosure *pg)
|
|||||||
"($1, $2, $3);",
|
"($1, $2, $3);",
|
||||||
3),
|
3),
|
||||||
GNUNET_PQ_make_prepare (
|
GNUNET_PQ_make_prepare (
|
||||||
"insert_into_table_extension_details",
|
"insert_into_table_policy_details",
|
||||||
"INSERT INTO extension_details"
|
"INSERT INTO policy_details"
|
||||||
"(extension_details_serial_id"
|
"(policy_details_serial_id"
|
||||||
",extension_options"
|
",serial_id"
|
||||||
|
",policy_options"
|
||||||
|
",fulfilment_serial_id"
|
||||||
") VALUES "
|
") VALUES "
|
||||||
"($1, $2);",
|
"($1, $2, $3, $4);",
|
||||||
2),
|
4),
|
||||||
|
GNUNET_PQ_make_prepare (
|
||||||
|
"insert_into_table_policy_fulfilments",
|
||||||
|
"INSERT INTO policy_fulfilments"
|
||||||
|
"(policy_fulfilments_serial_id"
|
||||||
|
",fulfilment_timestamp"
|
||||||
|
",fulfilment_proof"
|
||||||
|
") VALUES "
|
||||||
|
"($1, $2, $3);",
|
||||||
|
3),
|
||||||
GNUNET_PQ_make_prepare (
|
GNUNET_PQ_make_prepare (
|
||||||
"insert_into_table_purse_requests",
|
"insert_into_table_purse_requests",
|
||||||
"INSERT INTO purse_requests"
|
"INSERT INTO purse_requests"
|
||||||
@ -6230,7 +6240,7 @@ compute_shard (const struct TALER_MerchantPublicKeyP *merchant_pub)
|
|||||||
* @param deposit deposit operation details
|
* @param deposit deposit operation details
|
||||||
* @param known_coin_id row of the coin in the known_coins table
|
* @param known_coin_id row of the coin in the known_coins table
|
||||||
* @param h_payto hash of the merchant's bank account details
|
* @param h_payto hash of the merchant's bank account details
|
||||||
* @param extension_blocked true if an extension is blocking the wire transfer
|
* @param policy_blocked true if an extension is blocking the wire transfer
|
||||||
* @param[in,out] exchange_timestamp time to use for the deposit (possibly updated)
|
* @param[in,out] exchange_timestamp time to use for the deposit (possibly updated)
|
||||||
* @param[out] balance_ok set to true if the balance was sufficient
|
* @param[out] balance_ok set to true if the balance was sufficient
|
||||||
* @param[out] in_conflict set to true if the deposit conflicted
|
* @param[out] in_conflict set to true if the deposit conflicted
|
||||||
@ -6242,7 +6252,7 @@ postgres_do_deposit (
|
|||||||
const struct TALER_EXCHANGEDB_Deposit *deposit,
|
const struct TALER_EXCHANGEDB_Deposit *deposit,
|
||||||
uint64_t known_coin_id,
|
uint64_t known_coin_id,
|
||||||
const struct TALER_PaytoHashP *h_payto,
|
const struct TALER_PaytoHashP *h_payto,
|
||||||
bool extension_blocked,
|
bool policy_blocked,
|
||||||
struct GNUNET_TIME_Timestamp *exchange_timestamp,
|
struct GNUNET_TIME_Timestamp *exchange_timestamp,
|
||||||
bool *balance_ok,
|
bool *balance_ok,
|
||||||
bool *in_conflict)
|
bool *in_conflict)
|
||||||
@ -6264,7 +6274,7 @@ postgres_do_deposit (
|
|||||||
GNUNET_PQ_query_param_auto_from_type (&deposit->coin.coin_pub),
|
GNUNET_PQ_query_param_auto_from_type (&deposit->coin.coin_pub),
|
||||||
GNUNET_PQ_query_param_auto_from_type (&deposit->csig),
|
GNUNET_PQ_query_param_auto_from_type (&deposit->csig),
|
||||||
GNUNET_PQ_query_param_uint64 (&deposit_shard),
|
GNUNET_PQ_query_param_uint64 (&deposit_shard),
|
||||||
GNUNET_PQ_query_param_bool (extension_blocked),
|
GNUNET_PQ_query_param_bool (policy_blocked),
|
||||||
(NULL == deposit->policy_details)
|
(NULL == deposit->policy_details)
|
||||||
? GNUNET_PQ_query_param_null ()
|
? GNUNET_PQ_query_param_null ()
|
||||||
: TALER_PQ_query_param_json (deposit->policy_details),
|
: TALER_PQ_query_param_json (deposit->policy_details),
|
||||||
@ -14225,8 +14235,8 @@ postgres_lookup_serial_by_table (void *cls,
|
|||||||
case TALER_EXCHANGEDB_RT_EXTENSIONS:
|
case TALER_EXCHANGEDB_RT_EXTENSIONS:
|
||||||
statement = "select_serial_by_table_extensions";
|
statement = "select_serial_by_table_extensions";
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
|
case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
|
||||||
statement = "select_serial_by_table_extension_details";
|
statement = "select_serial_by_table_policy_details";
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
||||||
statement = "select_serial_by_table_purse_requests";
|
statement = "select_serial_by_table_purse_requests";
|
||||||
@ -14437,9 +14447,13 @@ postgres_lookup_records_by_table (void *cls,
|
|||||||
statement = "select_above_serial_by_table_extensions";
|
statement = "select_above_serial_by_table_extensions";
|
||||||
rh = &lrbt_cb_table_extensions;
|
rh = &lrbt_cb_table_extensions;
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
|
case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
|
||||||
statement = "select_above_serial_by_table_extension_details";
|
statement = "select_above_serial_by_table_policy_details";
|
||||||
rh = &lrbt_cb_table_extension_details;
|
rh = &lrbt_cb_table_policy_details;
|
||||||
|
break;
|
||||||
|
case TALER_EXCHANGEDB_RT_POLICY_FULFILMENTS:
|
||||||
|
statement = "select_above_serial_by_table_policy_fulfilments";
|
||||||
|
rh = &lrbt_cb_table_policy_fulfilments;
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
||||||
statement = "select_above_serial_by_table_purse_requests";
|
statement = "select_above_serial_by_table_purse_requests";
|
||||||
@ -14620,8 +14634,8 @@ postgres_insert_records_by_table (void *cls,
|
|||||||
case TALER_EXCHANGEDB_RT_EXTENSIONS:
|
case TALER_EXCHANGEDB_RT_EXTENSIONS:
|
||||||
rh = &irbt_cb_table_extensions;
|
rh = &irbt_cb_table_extensions;
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
|
case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
|
||||||
rh = &irbt_cb_table_extension_details;
|
rh = &irbt_cb_table_policy_details;
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
|
||||||
rh = &irbt_cb_table_purse_requests;
|
rh = &irbt_cb_table_purse_requests;
|
||||||
|
@ -510,8 +510,8 @@ CREATE OR REPLACE FUNCTION exchange_do_deposit(
|
|||||||
IN in_coin_pub BYTEA,
|
IN in_coin_pub BYTEA,
|
||||||
IN in_coin_sig BYTEA,
|
IN in_coin_sig BYTEA,
|
||||||
IN in_shard INT8,
|
IN in_shard INT8,
|
||||||
IN in_extension_blocked BOOLEAN,
|
IN in_policy_blocked BOOLEAN,
|
||||||
IN in_extension_details VARCHAR,
|
IN in_policy_details VARCHAR,
|
||||||
OUT out_exchange_timestamp INT8,
|
OUT out_exchange_timestamp INT8,
|
||||||
OUT out_balance_ok BOOLEAN,
|
OUT out_balance_ok BOOLEAN,
|
||||||
OUT out_conflict BOOLEAN)
|
OUT out_conflict BOOLEAN)
|
||||||
@ -522,18 +522,18 @@ DECLARE
|
|||||||
DECLARE
|
DECLARE
|
||||||
xdi INT8; -- eXstension details serial id
|
xdi INT8; -- eXstension details serial id
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Shards: INSERT extension_details (by extension_details_serial_id)
|
-- Shards: INSERT policy_details (by policy_details_serial_id)
|
||||||
-- INSERT wire_targets (by h_payto), on CONFLICT DO NOTHING;
|
-- INSERT wire_targets (by h_payto), on CONFLICT DO NOTHING;
|
||||||
-- INSERT deposits (by coin_pub, shard), ON CONFLICT DO NOTHING;
|
-- INSERT deposits (by coin_pub, shard), ON CONFLICT DO NOTHING;
|
||||||
-- UPDATE known_coins (by coin_pub)
|
-- UPDATE known_coins (by coin_pub)
|
||||||
|
|
||||||
IF NOT NULL in_extension_details
|
IF NOT NULL in_policy_details
|
||||||
THEN
|
THEN
|
||||||
INSERT INTO exchange.extension_details
|
INSERT INTO exchange.policy_details
|
||||||
(extension_options)
|
(policy_options)
|
||||||
VALUES
|
VALUES
|
||||||
(in_extension_details)
|
(in_policy_details)
|
||||||
RETURNING extension_details_serial_id INTO xdi;
|
RETURNING policy_details_serial_id INTO xdi;
|
||||||
ELSE
|
ELSE
|
||||||
xdi=NULL;
|
xdi=NULL;
|
||||||
END IF;
|
END IF;
|
||||||
@ -572,8 +572,8 @@ INSERT INTO exchange.deposits
|
|||||||
,coin_sig
|
,coin_sig
|
||||||
,wire_salt
|
,wire_salt
|
||||||
,wire_target_h_payto
|
,wire_target_h_payto
|
||||||
,extension_blocked
|
,policy_blocked
|
||||||
,extension_details_serial_id
|
,policy_details_serial_id
|
||||||
)
|
)
|
||||||
VALUES
|
VALUES
|
||||||
(in_shard
|
(in_shard
|
||||||
@ -590,7 +590,7 @@ INSERT INTO exchange.deposits
|
|||||||
,in_coin_sig
|
,in_coin_sig
|
||||||
,in_wire_salt
|
,in_wire_salt
|
||||||
,in_h_payto
|
,in_h_payto
|
||||||
,in_extension_blocked
|
,in_policy_blocked
|
||||||
,xdi)
|
,xdi)
|
||||||
ON CONFLICT DO NOTHING;
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
@ -221,7 +221,8 @@ enum TALER_EXCHANGEDB_ReplicatedTable
|
|||||||
TALER_EXCHANGEDB_RT_RECOUP,
|
TALER_EXCHANGEDB_RT_RECOUP,
|
||||||
TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
|
TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
|
||||||
TALER_EXCHANGEDB_RT_EXTENSIONS,
|
TALER_EXCHANGEDB_RT_EXTENSIONS,
|
||||||
TALER_EXCHANGEDB_RT_EXTENSION_DETAILS,
|
TALER_EXCHANGEDB_RT_POLICY_DETAILS,
|
||||||
|
TALER_EXCHANGEDB_RT_POLICY_FULFILMENTS,
|
||||||
TALER_EXCHANGEDB_RT_PURSE_REQUESTS,
|
TALER_EXCHANGEDB_RT_PURSE_REQUESTS,
|
||||||
TALER_EXCHANGEDB_RT_PURSE_REFUNDS,
|
TALER_EXCHANGEDB_RT_PURSE_REFUNDS,
|
||||||
TALER_EXCHANGEDB_RT_PURSE_MERGES,
|
TALER_EXCHANGEDB_RT_PURSE_MERGES,
|
||||||
@ -448,8 +449,8 @@ struct TALER_EXCHANGEDB_TableData
|
|||||||
struct TALER_CoinSpendSignatureP coin_sig;
|
struct TALER_CoinSpendSignatureP coin_sig;
|
||||||
struct TALER_WireSaltP wire_salt;
|
struct TALER_WireSaltP wire_salt;
|
||||||
struct TALER_PaytoHashP wire_target_h_payto;
|
struct TALER_PaytoHashP wire_target_h_payto;
|
||||||
bool extension_blocked;
|
bool policy_blocked;
|
||||||
uint64_t extension_details_serial_id;
|
uint64_t policy_details_serial_id;
|
||||||
} deposits;
|
} deposits;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
@ -521,13 +522,22 @@ struct TALER_EXCHANGEDB_TableData
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
char *config;
|
char *manifest;
|
||||||
} extensions;
|
} extensions;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char *extension_options;
|
char *policy_options;
|
||||||
} extension_details;
|
struct GNUNET_HashCode serial_id;
|
||||||
|
struct GNUNET_TIME_Timestamp deadline;
|
||||||
|
uint64_t fulfilment_serial_id;
|
||||||
|
} policy_details;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char *fulfilment_proof;
|
||||||
|
struct GNUNET_TIME_Timestamp fulfilment_timestamp;
|
||||||
|
} policy_fulfilments;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -3313,7 +3323,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
* @param deposit deposit operation details
|
* @param deposit deposit operation details
|
||||||
* @param known_coin_id row of the coin in the known_coins table
|
* @param known_coin_id row of the coin in the known_coins table
|
||||||
* @param h_payto hash of the merchant's payto URI
|
* @param h_payto hash of the merchant's payto URI
|
||||||
* @param extension_blocked true if an extension is blocking the wire transfer
|
* @param policy_blocked true if an policy extension is blocking the wire transfer
|
||||||
* @param[in,out] exchange_timestamp time to use for the deposit (possibly updated)
|
* @param[in,out] exchange_timestamp time to use for the deposit (possibly updated)
|
||||||
* @param[out] balance_ok set to true if the balance was sufficient
|
* @param[out] balance_ok set to true if the balance was sufficient
|
||||||
* @param[out] in_conflict set to true if the deposit conflicted
|
* @param[out] in_conflict set to true if the deposit conflicted
|
||||||
@ -3325,7 +3335,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
const struct TALER_EXCHANGEDB_Deposit *deposit,
|
const struct TALER_EXCHANGEDB_Deposit *deposit,
|
||||||
uint64_t known_coin_id,
|
uint64_t known_coin_id,
|
||||||
const struct TALER_PaytoHashP *h_payto,
|
const struct TALER_PaytoHashP *h_payto,
|
||||||
bool extension_blocked,
|
bool policy_blocked,
|
||||||
struct GNUNET_TIME_Timestamp *exchange_timestamp,
|
struct GNUNET_TIME_Timestamp *exchange_timestamp,
|
||||||
bool *balance_ok,
|
bool *balance_ok,
|
||||||
bool *in_conflict);
|
bool *in_conflict);
|
||||||
@ -5246,7 +5256,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
(*set_extension_manifest)(void *cls,
|
(*set_extension_manifest)(void *cls,
|
||||||
const char *extension_name,
|
const char *extension_name,
|
||||||
const char *config);
|
const char *manifest);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user