fixing #3816: adding 'id' field to uniquely identify each deposit

This commit is contained in:
Christian Grothoff 2015-09-19 20:02:21 +02:00
parent 37a84c5af7
commit f8a730a0ab
2 changed files with 71 additions and 10 deletions

View File

@ -516,6 +516,31 @@ struct TALER_MINTDB_MeltCommitment
struct TALER_MINTDB_Session; struct TALER_MINTDB_Session;
/**
* Function called with details about deposits that
* have been made, with the goal of executing the
* corresponding wire transaction.
*
* @param cls closure
* @param id transaction ID (used as future `min_id` to avoid
* iterating over transactions more than once)
* @param amount_with_fee amount that was deposited including fee
* @param deposit_fee amount the mint gets to keep as transaction fees
* @param transaction_id unique transaction ID chosen by the merchant
* @param h_contract hash of the contract between merchant and customer
* @param wire wire details for the merchant
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
typedef int
(*TALER_MINTDB_DepositIterator)(void *cls,
uint64_t id,
const struct TALER_Amount *amount_with_fee,
const struct TALER_Amount *deposit_fee,
uint64_t transaction_id,
const struct GNUNET_HashCode *h_contract,
const char *wire);
/** /**
* Function called with the session hashes and transfer secret * Function called with the session hashes and transfer secret
* information for a given coin. * information for a given coin.
@ -780,8 +805,7 @@ struct TALER_MINTDB_Plugin
/** /**
* Insert information about deposited coin into the * Insert information about deposited coin into the database.
* database.
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param sesssion connection to the database * @param sesssion connection to the database
@ -794,6 +818,30 @@ struct TALER_MINTDB_Plugin
const struct TALER_MINTDB_Deposit *deposit); const struct TALER_MINTDB_Deposit *deposit);
/**
* Obtain information about deposits. Iterates over all deposits
* above a certain ID. Use a @a min_id of 0 to start at the beginning.
* This operation is executed in its own transaction in transaction
* mode "READ COMMITTED", i.e. we should only see valid deposits.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param sesssion connection to the database
* @param min_id deposit to start at
* @param limit maximum number of transactions to fetch
* @param deposit_cb function to call for each deposit
* @param deposit_cb_cls closure for @a deposit_cb
* @return number of rows processed, 0 if none exist,
* #GNUNET_SYSERR on error
*/
int
(*iterate_deposits) (void *cls,
struct TALER_MINTDB_Session *sesssion,
uint64_t min_id,
unsigned int limit,
TALER_MINTDB_DepositIterator deposit_cb,
void *deposit_cb_cls);
/** /**
* Lookup refresh session data under the given @a session_hash. * Lookup refresh session data under the given @a session_hash.
* *

View File

@ -424,15 +424,10 @@ postgres_create_tables (void *cls,
",ev_sig BYTEA NOT NULL" ",ev_sig BYTEA NOT NULL"
")"); ")");
/* This table contains the wire transfers the mint is supposed to /* This table contains the wire transfers the mint is supposed to
execute to transmit funds to the merchants (and manage refunds). execute to transmit funds to the merchants (and manage refunds). */
TODO: we might want to generate some other primary key
to internally identify outgoing transactions, as "coin_pub"
may not be unique if a wallet chooses not to refresh. The
resulting transaction ID should then be returned to the merchant
and could be used by the mearchant for further inquriries about
the deposit's execution. (#3816); */
SQLEXEC("CREATE TABLE IF NOT EXISTS deposits " SQLEXEC("CREATE TABLE IF NOT EXISTS deposits "
"(coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)" "(id BIGSERIAL"
",coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)"
",denom_pub BYTEA NOT NULL REFERENCES denominations (pub)" ",denom_pub BYTEA NOT NULL REFERENCES denominations (pub)"
",denom_sig BYTEA NOT NULL" ",denom_sig BYTEA NOT NULL"
",transaction_id INT8 NOT NULL" ",transaction_id INT8 NOT NULL"
@ -853,6 +848,24 @@ postgres_prepare (PGconn *db_conn)
" (merchant_pub=$3)" " (merchant_pub=$3)"
" )", " )",
3, NULL); 3, NULL);
/* Used in #postgres_iterate_deposits() */
PREPARE ("deposits_iterate",
"SELECT"
" id"
" amount_with_fee_val"
",amount_with_fee_frac"
",amount_with_fee_curr"
",deposit_fee_val"
",deposit_fee_frac"
",deposit_fee_curr"
",transaction_id"
",h_contract"
",wire"
" FROM deposits"
" WHERE id>=$1"
" LIMIT $2;",
2, NULL);
/* Used in #postgres_get_coin_transactions() to obtain information /* Used in #postgres_get_coin_transactions() to obtain information
about how a coin has been spend with /deposit requests. */ about how a coin has been spend with /deposit requests. */
PREPARE ("get_deposit_with_coin_pub", PREPARE ("get_deposit_with_coin_pub",