handle UNIQUE violation nicely
authorChristian Grothoff <christian@grothoff.org>
Sat, 10 Jun 2017 19:53:08 +0000 (21:53 +0200)
committerChristian Grothoff <christian@grothoff.org>
Sat, 10 Jun 2017 19:53:18 +0000 (21:53 +0200)
src/include/gnunet_pq_lib.h
src/pq/pq_eval.c

index ff4df563d4b7a09a830ddc886df13dc3fb38950e..0f6b88b785354b6087c708be8cd3345e174f54e9 100644 (file)
@@ -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,
index 9296dce2e478998b314dca99ab67fc41d751b3fa..b19742bba972ea0b3523892a66f83c7ec5faea5c 100644 (file)
@@ -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,