resolve #3717
This commit is contained in:
parent
33f5242ac4
commit
d080e59e27
@ -685,7 +685,9 @@ struct TALER_MINTDB_Plugin
|
||||
|
||||
/**
|
||||
* Insert a incoming transaction into reserves. New reserves are
|
||||
* also created through this function.
|
||||
* also created through this function. Note that this API call
|
||||
* starts (and stops) its own transaction scope (so the application
|
||||
* must not do so).
|
||||
*
|
||||
* @param cls the @e cls of this struct with the plugin-specific state
|
||||
* @param db the database connection handle
|
||||
|
@ -98,6 +98,9 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Mint directory not given\n");
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (details);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return 1;
|
||||
}
|
||||
if ((NULL == reserve_pub_str) ||
|
||||
@ -109,6 +112,9 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Parsing reserve key invalid\n");
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (details);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return 1;
|
||||
}
|
||||
if ( (NULL == add_str) ||
|
||||
@ -119,6 +125,9 @@ main (int argc, char *const *argv)
|
||||
fprintf (stderr,
|
||||
"Failed to parse currency amount `%s'\n",
|
||||
add_str);
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (details);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -126,6 +135,8 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"No wiring details given (justification required)\n");
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -134,6 +145,9 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Failed to load mint configuration\n");
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (details);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return 1;
|
||||
}
|
||||
ret = 1;
|
||||
@ -154,24 +168,32 @@ main (int argc, char *const *argv)
|
||||
goto cleanup;
|
||||
}
|
||||
expiration = GNUNET_TIME_relative_to_absolute (RESERVE_EXPIRATION);
|
||||
if (GNUNET_OK !=
|
||||
plugin->reserves_in_insert (plugin->cls,
|
||||
ret = plugin->reserves_in_insert (plugin->cls,
|
||||
session,
|
||||
&reserve_pub,
|
||||
&add_value,
|
||||
details,
|
||||
expiration))
|
||||
expiration);
|
||||
if (GNUNET_SYSERR == ret)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Failed to update reserve.\n");
|
||||
goto cleanup;
|
||||
}
|
||||
if (GNUNET_NO == ret)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"Record exists, reserve not updated.\n");
|
||||
}
|
||||
ret = 0;
|
||||
cleanup:
|
||||
if (NULL != plugin)
|
||||
TALER_MINTDB_plugin_unload (plugin);
|
||||
if (NULL != cfg)
|
||||
GNUNET_CONFIGURATION_destroy (cfg);
|
||||
GNUNET_free_non_null (add_str);
|
||||
GNUNET_free_non_null (details);
|
||||
GNUNET_free_non_null (reserve_pub_str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -986,7 +986,8 @@ postgres_reserves_update (void *cls,
|
||||
|
||||
/**
|
||||
* Insert a incoming transaction into reserves. New reserves are also created
|
||||
* through this function.
|
||||
* through this function. Note that this API call starts (and stops) its
|
||||
* own transaction scope (so the application must not do so).
|
||||
*
|
||||
* @param cls the `struct PostgresClosure` with the plugin-specific state
|
||||
* @param session the database connection handle
|
||||
@ -1025,9 +1026,8 @@ postgres_reserves_in_insert (void *cls,
|
||||
&reserve);
|
||||
if (GNUNET_SYSERR == reserve_exists)
|
||||
{
|
||||
postgres_rollback (cls,
|
||||
session);
|
||||
return GNUNET_SYSERR;
|
||||
GNUNET_break (0);
|
||||
goto rollback;
|
||||
}
|
||||
if (GNUNET_NO == reserve_exists)
|
||||
{
|
||||
@ -1084,6 +1084,21 @@ postgres_reserves_in_insert (void *cls,
|
||||
params);
|
||||
if (PGRES_COMMAND_OK != PQresultStatus(result))
|
||||
{
|
||||
const char *efield;
|
||||
|
||||
efield = PQresultErrorField (result,
|
||||
PG_DIAG_SQLSTATE);
|
||||
if ( (PGRES_FATAL_ERROR == PQresultStatus(result)) &&
|
||||
(NULL != strstr ("23505", /* unique violation */
|
||||
efield)) )
|
||||
{
|
||||
/* This means we had the same reserve/justification/details
|
||||
before */
|
||||
PQclear (result);
|
||||
postgres_rollback (cls,
|
||||
session);
|
||||
return GNUNET_NO;
|
||||
}
|
||||
QUERY_ERR (result);
|
||||
goto rollback;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user