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;
/**
* 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
* information for a given coin.
@ -780,8 +805,7 @@ struct TALER_MINTDB_Plugin
/**
* Insert information about deposited coin into the
* database.
* Insert information about deposited coin into the database.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param sesssion connection to the database
@ -794,6 +818,30 @@ struct TALER_MINTDB_Plugin
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.
*

View File

@ -424,15 +424,10 @@ postgres_create_tables (void *cls,
",ev_sig BYTEA NOT NULL"
")");
/* This table contains the wire transfers the mint is supposed to
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); */
execute to transmit funds to the merchants (and manage refunds). */
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_sig BYTEA NOT NULL"
",transaction_id INT8 NOT NULL"
@ -853,6 +848,24 @@ postgres_prepare (PGconn *db_conn)
" (merchant_pub=$3)"
" )",
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
about how a coin has been spend with /deposit requests. */
PREPARE ("get_deposit_with_coin_pub",