mintdb postgres: implement get_refresh_session

This commit is contained in:
Sree Harsha Totakura 2015-04-09 23:21:35 +02:00
parent 05f0aca976
commit 764bd4dc10

View File

@ -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;
} }