From: Christian Grothoff Date: Sat, 10 Jun 2017 19:53:08 +0000 (+0200) Subject: handle UNIQUE violation nicely X-Git-Tag: gnunet-0.11.0rc0~240 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=d71e2f3b35de7fcce36806bdad44ecf4114f6740;p=oweals%2Fgnunet.git handle UNIQUE violation nicely --- diff --git a/src/include/gnunet_pq_lib.h b/src/include/gnunet_pq_lib.h index ff4df563d..0f6b88b78 100644 --- a/src/include/gnunet_pq_lib.h +++ b/src/include/gnunet_pq_lib.h @@ -525,7 +525,10 @@ GNUNET_PQ_eval_result (PGconn *connection, * @return status code from the result, mapping PQ status * codes to `enum GNUNET_PQ_QueryStatus`. If the * statement was a DELETE or UPDATE statement, the - * number of affected rows is returned. + * number of affected rows is returned; if the + * statment was an INSERT statement, and no row + * was added due to a UNIQUE violation, we return + * zero; if INSERT was successful, we return one. */ enum GNUNET_PQ_QueryStatus GNUNET_PQ_eval_prepared_non_select (PGconn *connection, diff --git a/src/pq/pq_eval.c b/src/pq/pq_eval.c index 9296dce2e..b19742bba 100644 --- a/src/pq/pq_eval.c +++ b/src/pq/pq_eval.c @@ -93,6 +93,23 @@ GNUNET_PQ_eval_result (PGconn *connection, PQerrorMessage (connection)); return GNUNET_PQ_STATUS_SOFT_ERROR; } + if (0 == strcmp (sqlstate, + PQ_DIAG_SQLSTATE_UNIQUE_VIOLATION)) + { + /* Likely no need to retry, INSERT of "same" data. */ + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "pq", + "Query `%s' failed with unique violation: %s/%s/%s/%s/%s\n", + statement_name, + PQresultErrorField (result, + PG_DIAG_MESSAGE_PRIMARY), + PQresultErrorField (result, + PG_DIAG_MESSAGE_DETAIL), + PQresultErrorMessage (result), + PQresStatus (PQresultStatus (result)), + PQerrorMessage (connection)); + return GNUNET_PQ_STATUS_SUCCESS_NO_RESULTS; + } GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "pq", "Query `%s' failed with result: %s/%s/%s/%s/%s\n", @@ -121,7 +138,10 @@ GNUNET_PQ_eval_result (PGconn *connection, * @return status code from the result, mapping PQ status * codes to `enum GNUNET_PQ_QueryStatus`. If the * statement was a DELETE or UPDATE statement, the - * number of affected rows is returned. + * number of affected rows is returned.; if the + * statment was an INSERT statement, and no row + * was added due to a UNIQUE violation, we return + * zero; if INSERT was successful, we return one. */ enum GNUNET_PQ_QueryStatus GNUNET_PQ_eval_prepared_non_select (PGconn *connection,