summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-06-10 21:53:08 +0200
committerChristian Grothoff <christian@grothoff.org>2017-06-10 21:53:18 +0200
commitd71e2f3b35de7fcce36806bdad44ecf4114f6740 (patch)
tree7609a2455317e58ddbfcd6a48548306ca812ec2a /src
parent55b06f18c66ede06a2cf437b652de3a7c75c902a (diff)
handle UNIQUE violation nicely
Diffstat (limited to 'src')
-rw-r--r--src/include/gnunet_pq_lib.h5
-rw-r--r--src/pq/pq_eval.c22
2 files changed, 25 insertions, 2 deletions
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,