mintdb postgres: implement get_refresh_session
This commit is contained in:
parent
05f0aca976
commit
764bd4dc10
@ -223,11 +223,18 @@ postgres_create_tables (void *cls,
|
|||||||
",expended_currency VARCHAR(4) NOT NULL"
|
",expended_currency VARCHAR(4) NOT NULL"
|
||||||
",refresh_session_hash BYTEA"
|
",refresh_session_hash BYTEA"
|
||||||
")");
|
")");
|
||||||
|
/**
|
||||||
|
* The DB will show negative values for some values of the following fields as
|
||||||
|
* we use them as 16 bit unsigned integers
|
||||||
|
* @a num_oldcoins
|
||||||
|
* @a num_newcoins
|
||||||
|
* Do not do arithmetic in SQL on these fields
|
||||||
|
*/
|
||||||
SQLEXEC("CREATE TABLE IF NOT EXISTS refresh_sessions "
|
SQLEXEC("CREATE TABLE IF NOT EXISTS refresh_sessions "
|
||||||
"("
|
"("
|
||||||
" session_hash BYTEA PRIMARY KEY CHECK (length(session_hash) = 32)"
|
" session_hash BYTEA PRIMARY KEY CHECK (length(session_hash) = 32)"
|
||||||
",session_melt_sig BYTEA"
|
",num_oldcoins INT2 NOT NULL"
|
||||||
",session_commit_sig BYTEA"
|
",num_newcoins INT2 NOT NULL"
|
||||||
",noreveal_index INT2 NOT NULL"
|
",noreveal_index INT2 NOT NULL"
|
||||||
// non-zero if all reveals were ok
|
// non-zero if all reveals were ok
|
||||||
// and the new coin signatures are ready
|
// and the new coin signatures are ready
|
||||||
@ -389,23 +396,15 @@ postgres_prepare (PGconn *db_conn)
|
|||||||
" FROM collectable_blindcoins"
|
" FROM collectable_blindcoins"
|
||||||
" WHERE reserve_pub=$1;",
|
" WHERE reserve_pub=$1;",
|
||||||
1, NULL);
|
1, NULL);
|
||||||
|
/* refreshing */
|
||||||
/* FIXME: does it make sense to store these computed values in the DB? */
|
|
||||||
#if 0
|
|
||||||
PREPARE ("get_refresh_session",
|
PREPARE ("get_refresh_session",
|
||||||
"SELECT "
|
"SELECT "
|
||||||
" (SELECT count(*) FROM refresh_melt WHERE session_hash = $1)::INT2 as num_oldcoins "
|
" num_oldcoins"
|
||||||
",(SELECT count(*) FROM refresh_blind_session_keys "
|
",num_newcoins"
|
||||||
" WHERE session_hash = $1 and cnc_index = 0)::INT2 as num_newcoins "
|
|
||||||
",(SELECT count(*) FROM refresh_blind_session_keys "
|
|
||||||
" WHERE session_hash = $1 and newcoin_index = 0)::INT2 as kappa "
|
|
||||||
",noreveal_index"
|
",noreveal_index"
|
||||||
",session_commit_sig "
|
" FROM refresh_sessions "
|
||||||
",reveal_ok "
|
" WHERE session_hash = $1 ",
|
||||||
"FROM refresh_sessions "
|
|
||||||
"WHERE session_hash = $1",
|
|
||||||
1, NULL);
|
1, NULL);
|
||||||
#endif
|
|
||||||
|
|
||||||
PREPARE ("get_known_coin",
|
PREPARE ("get_known_coin",
|
||||||
"SELECT "
|
"SELECT "
|
||||||
@ -1451,61 +1450,59 @@ postgres_get_refresh_session (void *cls,
|
|||||||
const struct GNUNET_HashCode *session_hash,
|
const struct GNUNET_HashCode *session_hash,
|
||||||
struct TALER_MINTDB_RefreshSession *refresh_session)
|
struct TALER_MINTDB_RefreshSession *refresh_session)
|
||||||
{
|
{
|
||||||
// FIXME: check logic!
|
PGresult *result;
|
||||||
int res;
|
|
||||||
struct TALER_PQ_QueryParam params[] = {
|
struct TALER_PQ_QueryParam params[] = {
|
||||||
TALER_PQ_QUERY_PARAM_PTR(session_hash),
|
TALER_PQ_QUERY_PARAM_PTR(session_hash),
|
||||||
TALER_PQ_QUERY_PARAM_END
|
TALER_PQ_QUERY_PARAM_END
|
||||||
};
|
};
|
||||||
|
int ret;
|
||||||
|
uint16_t num_oldcoins;
|
||||||
|
uint16_t num_newcoins;
|
||||||
|
uint16_t noreveal_index;
|
||||||
|
|
||||||
PGresult *result = TALER_PQ_exec_prepared (session->conn,
|
ret = GNUNET_SYSERR;
|
||||||
"get_refresh_session",
|
result = TALER_PQ_exec_prepared (session->conn,
|
||||||
params);
|
"get_refresh_session",
|
||||||
|
params);
|
||||||
if (PGRES_TUPLES_OK != PQresultStatus (result))
|
if (PGRES_TUPLES_OK != PQresultStatus (result))
|
||||||
{
|
{
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
BREAK_DB_ERR (result);
|
||||||
"Query failed: %s\n",
|
goto cleanup;
|
||||||
PQresultErrorMessage (result));
|
|
||||||
PQclear (result);
|
|
||||||
return GNUNET_SYSERR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == PQntuples (result))
|
if (0 == PQntuples (result))
|
||||||
return GNUNET_NO;
|
{
|
||||||
|
ret = GNUNET_NO;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
GNUNET_assert (1 == PQntuples (result));
|
GNUNET_assert (1 == PQntuples (result));
|
||||||
|
/* We're done if the caller is only interested in whether the session exists
|
||||||
/* We're done if the caller is only interested in
|
* or not */
|
||||||
* whether the session exists or not */
|
|
||||||
|
|
||||||
if (NULL == refresh_session)
|
if (NULL == refresh_session)
|
||||||
return GNUNET_YES;
|
{
|
||||||
|
ret = GNUNET_YES;
|
||||||
memset (session, 0, sizeof (struct TALER_MINTDB_RefreshSession));
|
goto cleanup;
|
||||||
|
}
|
||||||
|
memset (refresh_session, 0, sizeof (struct TALER_MINTDB_RefreshSession));
|
||||||
struct TALER_PQ_ResultSpec rs[] = {
|
struct TALER_PQ_ResultSpec rs[] = {
|
||||||
TALER_PQ_RESULT_SPEC("num_oldcoins", &refresh_session->num_oldcoins),
|
TALER_PQ_RESULT_SPEC("num_oldcoins", &num_oldcoins),
|
||||||
TALER_PQ_RESULT_SPEC("num_newcoins", &refresh_session->num_newcoins),
|
TALER_PQ_RESULT_SPEC("num_newcoins", &num_newcoins),
|
||||||
TALER_PQ_RESULT_SPEC("noreveal_index", &refresh_session->noreveal_index),
|
TALER_PQ_RESULT_SPEC("noreveal_index", &noreveal_index),
|
||||||
TALER_PQ_RESULT_SPEC_END
|
TALER_PQ_RESULT_SPEC_END
|
||||||
};
|
};
|
||||||
|
if (GNUNET_OK != TALER_PQ_extract_result (result, rs, 0))
|
||||||
res = TALER_PQ_extract_result (result, rs, 0);
|
|
||||||
|
|
||||||
if (GNUNET_OK != res)
|
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
PQclear (result);
|
goto cleanup;
|
||||||
return GNUNET_SYSERR;
|
|
||||||
}
|
}
|
||||||
|
refresh_session->num_oldcoins = ntohs (num_oldcoins);
|
||||||
|
refresh_session->num_newcoins = ntohs (num_newcoins);
|
||||||
|
refresh_session->noreveal_index = ntohs (noreveal_index);
|
||||||
|
ret = GNUNET_YES;
|
||||||
|
|
||||||
refresh_session->num_oldcoins = ntohs (refresh_session->num_oldcoins);
|
cleanup:
|
||||||
refresh_session->num_newcoins = ntohs (refresh_session->num_newcoins);
|
if (NULL != result)
|
||||||
refresh_session->noreveal_index = ntohs (refresh_session->noreveal_index);
|
PQclear (result);
|
||||||
|
return ret;
|
||||||
PQclear (result);
|
|
||||||
return GNUNET_YES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user