diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-06-11 14:46:03 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-06-11 14:46:03 +0200 |
commit | eedfc0485010a2afb1cb4a2d202eb0ceb8bc5cb8 (patch) | |
tree | e8488ede65e819e1672621e0f3ef16928beeb979 | |
parent | 65c19ccbdbc0885a579b3369956ca1daa43ae581 (diff) |
implement #3830
-rw-r--r-- | src/mintdb/plugin_mintdb_postgres.c | 146 |
1 files changed, 93 insertions, 53 deletions
diff --git a/src/mintdb/plugin_mintdb_postgres.c b/src/mintdb/plugin_mintdb_postgres.c index e89e7acc0..870bfb756 100644 --- a/src/mintdb/plugin_mintdb_postgres.c +++ b/src/mintdb/plugin_mintdb_postgres.c @@ -2095,33 +2095,59 @@ postgres_insert_refresh_order (void *cls, uint16_t num_newcoins, const struct TALER_DenominationPublicKey *denom_pubs) { - // FIXME: check logic: was written for just one COIN! (#3830) - PGresult *result; + unsigned int i; + for (i=0;i<(unsigned int) num_newcoins;i++) { - struct TALER_PQ_QueryParam params[] = { - TALER_PQ_query_param_uint16 (&num_newcoins), - TALER_PQ_query_param_auto_from_type (session_hash), - TALER_PQ_query_param_rsa_public_key (denom_pubs->rsa_public_key), - TALER_PQ_query_param_end - }; - result = TALER_PQ_exec_prepared (session->conn, - "insert_refresh_order", - params); - } - if (PGRES_COMMAND_OK != PQresultStatus (result)) - { - BREAK_DB_ERR (result); + uint16_t newcoin_off = (uint16_t) i; + PGresult *result; + + { + struct TALER_PQ_QueryParam params[] = { + TALER_PQ_query_param_uint16 (&newcoin_off), + TALER_PQ_query_param_auto_from_type (session_hash), + TALER_PQ_query_param_rsa_public_key (denom_pubs->rsa_public_key), + TALER_PQ_query_param_end + }; + result = TALER_PQ_exec_prepared (session->conn, + "insert_refresh_order", + params); + } + if (PGRES_COMMAND_OK != PQresultStatus (result)) + { + BREAK_DB_ERR (result); + PQclear (result); + return GNUNET_SYSERR; + } + if (0 != strcmp ("1", PQcmdTuples (result))) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } PQclear (result); - return GNUNET_SYSERR; } - if (0 != strcmp ("1", PQcmdTuples (result))) + return GNUNET_OK; +} + + +/** + * We allocated some @a denom_pubs information, but now need + * to abort. Free allocated memory. + * + * @param denom_pubs data to free (but not the array itself) + * @param denom_pubs_len length of @a denom_pubs array + */ +static void +free_dpk_result (struct TALER_DenominationPublicKey *denom_pubs, + unsigned int denom_pubs_len) +{ + unsigned int i; + + for (i=0;i<denom_pubs_len;i++) { - GNUNET_break (0); - return GNUNET_SYSERR; + GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[i].rsa_public_key); + denom_pubs[i].rsa_public_key = NULL; } - PQclear (result); - return GNUNET_OK; } @@ -2144,46 +2170,60 @@ postgres_get_refresh_order (void *cls, uint16_t num_newcoins, struct TALER_DenominationPublicKey *denom_pubs) { - // FIXME: check logic -- was written for just one coin! (#3830) - struct TALER_PQ_QueryParam params[] = { - TALER_PQ_query_param_auto_from_type (session_hash), - TALER_PQ_query_param_uint16 (&num_newcoins), - TALER_PQ_query_param_end - }; - - PGresult *result = TALER_PQ_exec_prepared (session->conn, - "get_refresh_order", params); + unsigned int i; - if (PGRES_TUPLES_OK != PQresultStatus (result)) + for (i=0;i<(unsigned int) num_newcoins;i++) { - BREAK_DB_ERR (result); - PQclear (result); - return GNUNET_SYSERR; - } + uint16_t newcoin_off = (uint16_t) i; + PGresult *result; - if (0 == PQntuples (result)) - { - PQclear (result); - /* FIXME: may want to distinguish between different error cases! */ - return GNUNET_SYSERR; - } - GNUNET_assert (1 == PQntuples (result)); - struct TALER_PQ_ResultSpec rs[] = { - TALER_PQ_result_spec_rsa_public_key ("denom_pub", &denom_pubs->rsa_public_key), - TALER_PQ_result_spec_end - }; - if (GNUNET_OK != TALER_PQ_extract_result (result, rs, 0)) - { - PQclear (result); - GNUNET_break (0); - return GNUNET_SYSERR; + { + struct TALER_PQ_QueryParam params[] = { + TALER_PQ_query_param_auto_from_type (session_hash), + TALER_PQ_query_param_uint16 (&newcoin_off), + TALER_PQ_query_param_end + }; + + result = TALER_PQ_exec_prepared (session->conn, + "get_refresh_order", + params); + } + if (PGRES_TUPLES_OK != PQresultStatus (result)) + { + BREAK_DB_ERR (result); + PQclear (result); + free_dpk_result (denom_pubs, i); + return GNUNET_SYSERR; + } + if (0 == PQntuples (result)) + { + PQclear (result); + /* FIXME: may want to distinguish between different error cases! */ + free_dpk_result (denom_pubs, i); + return GNUNET_SYSERR; + } + GNUNET_assert (1 == PQntuples (result)); + { + struct TALER_PQ_ResultSpec rs[] = { + TALER_PQ_result_spec_rsa_public_key ("denom_pub", + &denom_pubs[i].rsa_public_key), + TALER_PQ_result_spec_end + }; + if (GNUNET_OK != + TALER_PQ_extract_result (result, rs, 0)) + { + PQclear (result); + GNUNET_break (0); + free_dpk_result (denom_pubs, i); + return GNUNET_SYSERR; + } + PQclear (result); + } } - PQclear (result); return GNUNET_OK; } - /** * Store information about the commitment of the * given coin for the given refresh session in the database. |