RPS: Forgot to add header
[oweals/gnunet.git] / src / pq / pq_result_helper.c
index c5c8e56b9d73af090ed106493c72cb9990ae983e..336ca8c4253556f8de7a2389ab8a72f4eb76724a 100644 (file)
@@ -2,16 +2,20 @@
   This file is part of GNUnet
   Copyright (C) 2014, 2015, 2016 GNUnet e.V.
 
-  GNUnet is free software; you can redistribute it and/or modify it under the
-  terms of the GNU General Public License as published by the Free Software
-  Foundation; either version 3, or (at your option) any later version.
+  GNUnet is free software: you can redistribute it and/or modify it
+  under the terms of the GNU Affero General Public License as published
+  by the Free Software Foundation, either version 3 of the License,
+  or (at your option) any later version.
 
-  GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY
-  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-  A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+  GNUnet is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Affero General Public License for more details.
 
-  You should have received a copy of the GNU General Public License along with
-  GNUnet; see the file COPYING.  If not, If not, see <http://www.gnu.org/licenses/>
+  You should have received a copy of the GNU Affero General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 /**
  * @file pq/pq_result_helper.c
@@ -36,6 +40,7 @@ clean_varsize_blob (void *cls,
 {
   void **dst = rd;
 
+  (void) cls;
   if (NULL != *dst)
   {
     GNUNET_free (*dst);
@@ -70,6 +75,7 @@ extract_varsize_blob (void *cls,
   void *idst;
   int fnum;
 
+  (void) cls;
   *dst_size = 0;
   *((void **) dst) = NULL;
 
@@ -83,8 +89,10 @@ extract_varsize_blob (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
-    return GNUNET_SYSERR;
-
+  {
+    /* Let's allow this for varsize */
+    return GNUNET_OK;
+  }
   /* if a field is null, continue but
    * remember that we now return a different result */
   len = PQgetlength (result,
@@ -98,8 +106,8 @@ extract_varsize_blob (void *cls,
   idst = GNUNET_malloc (len);
   *((void **) dst) = idst;
   GNUNET_memcpy (idst,
-         res,
-         len);
+                 res,
+                 len);
   return GNUNET_OK;
 }
 
@@ -150,6 +158,7 @@ extract_fixed_blob (void *cls,
   const char *res;
   int fnum;
 
+  (void) cls;
   fnum = PQfnumber (result,
                    fname);
   if (fnum < 0)
@@ -160,7 +169,10 @@ extract_fixed_blob (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
+  }
 
   /* if a field is null, continue but
    * remember that we now return a different result */
@@ -177,8 +189,8 @@ extract_fixed_blob (void *cls,
                    fnum);
   GNUNET_assert (NULL != res);
   GNUNET_memcpy (dst,
-         res,
-         len);
+                 res,
+                 len);
   return GNUNET_OK;
 }
 
@@ -230,6 +242,7 @@ extract_rsa_public_key (void *cls,
   const char *res;
   int fnum;
 
+  (void) cls;
   *pk = NULL;
   fnum = PQfnumber (result,
                    fname);
@@ -241,8 +254,10 @@ extract_rsa_public_key (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
-
+  }
   /* if a field is null, continue but
    * remember that we now return a different result */
   len = PQgetlength (result,
@@ -275,6 +290,7 @@ clean_rsa_public_key (void *cls,
 {
   struct GNUNET_CRYPTO_RsaPublicKey **pk = rd;
 
+  (void) cls;
   if (NULL != *pk)
   {
     GNUNET_CRYPTO_rsa_public_key_free (*pk);
@@ -329,6 +345,7 @@ extract_rsa_signature (void *cls,
   const char *res;
   int fnum;
 
+  (void) cls;
   *sig = NULL;
   fnum = PQfnumber (result,
                    fname);
@@ -340,8 +357,10 @@ extract_rsa_signature (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
-
+  }
   /* if a field is null, continue but
    * remember that we now return a different result */
   len = PQgetlength (result,
@@ -374,6 +393,7 @@ clean_rsa_signature (void *cls,
 {
   struct GNUNET_CRYPTO_RsaSignature **sig = rd;
 
+  (void) cls;
   if (NULL != *sig)
   {
     GNUNET_CRYPTO_rsa_signature_free (*sig);
@@ -428,6 +448,7 @@ extract_string (void *cls,
   const char *res;
   int fnum;
 
+  (void) cls;
   *str = NULL;
   fnum = PQfnumber (result,
                    fname);
@@ -439,8 +460,10 @@ extract_string (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
-
+  }
   /* if a field is null, continue but
    * remember that we now return a different result */
   len = PQgetlength (result,
@@ -473,6 +496,7 @@ clean_string (void *cls,
 {
   char **str = rd;
 
+  (void) cls;
   if (NULL != *str)
   {
     GNUNET_free (*str);
@@ -501,6 +525,71 @@ GNUNET_PQ_result_spec_string (const char *name,
 }
 
 
+/**
+ * Extract data from a Postgres database @a result at row @a row.
+ *
+ * @param cls closure
+ * @param result where to extract data from
+ * @param int row to extract data from
+ * @param fname name (or prefix) of the fields to extract from
+ * @param[in,out] dst_size where to store size of result, may be NULL
+ * @param[out] dst where to store the result
+ * @return
+ *   #GNUNET_YES if all results could be extracted
+ *   #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
+ */
+static int
+extract_abs_time (void *cls,
+                 PGresult *result,
+                 int row,
+                 const char *fname,
+                 size_t *dst_size,
+                 void *dst)
+{
+  struct GNUNET_TIME_Absolute *udst = dst;
+  const int64_t *res;
+  int fnum;
+
+  (void) cls;
+  fnum = PQfnumber (result,
+                   fname);
+  if (fnum < 0)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if (PQgetisnull (result,
+                  row,
+                  fnum))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  GNUNET_assert (NULL != dst);
+  if (sizeof (struct GNUNET_TIME_Absolute) != *dst_size)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if (sizeof (int64_t) !=
+      PQgetlength (result,
+                   row,
+                   fnum))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  res = (int64_t *) PQgetvalue (result,
+                               row,
+                               fnum);
+  if (INT64_MAX == *res)
+    *udst = GNUNET_TIME_UNIT_FOREVER_ABS;
+  else
+    udst->abs_value_us = GNUNET_ntohll ((uint64_t) *res);
+  return GNUNET_OK;
+}
+
+
 /**
  * Absolute time expected.
  *
@@ -512,8 +601,12 @@ struct GNUNET_PQ_ResultSpec
 GNUNET_PQ_result_spec_absolute_time (const char *name,
                                     struct GNUNET_TIME_Absolute *at)
 {
-  return GNUNET_PQ_result_spec_uint64 (name,
-                                      &at->abs_value_us);
+  struct GNUNET_PQ_ResultSpec res =
+    { &extract_abs_time,
+      NULL,
+      NULL,
+      (void *) at, sizeof (*at), (name), NULL };
+  return res;
 }
 
 
@@ -559,6 +652,7 @@ extract_uint16 (void *cls,
   const uint16_t *res;
   int fnum;
 
+  (void) cls;
   fnum = PQfnumber (result,
                    fname);
   if (fnum < 0)
@@ -569,13 +663,24 @@ extract_uint16 (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
+  }
   GNUNET_assert (NULL != dst);
   if (sizeof (uint16_t) != *dst_size)
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
+  if (sizeof (uint16_t) !=
+      PQgetlength (result,
+                   row,
+                   fnum))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
   res = (uint16_t *) PQgetvalue (result,
                                 row,
                                 fnum);
@@ -629,6 +734,7 @@ extract_uint32 (void *cls,
   const uint32_t *res;
   int fnum;
 
+  (void) cls;
   fnum = PQfnumber (result,
                    fname);
   if (fnum < 0)
@@ -639,13 +745,24 @@ extract_uint32 (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
+  }
   GNUNET_assert (NULL != dst);
   if (sizeof (uint32_t) != *dst_size)
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
+  if (sizeof (uint32_t) !=
+      PQgetlength (result,
+                   row,
+                   fnum))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
   res = (uint32_t *) PQgetvalue (result,
                                 row,
                                 fnum);
@@ -699,6 +816,7 @@ extract_uint64 (void *cls,
   const uint64_t *res;
   int fnum;
 
+  (void) cls;
   fnum = PQfnumber (result,
                    fname);
   if (fnum < 0)
@@ -709,13 +827,24 @@ extract_uint64 (void *cls,
   if (PQgetisnull (result,
                   row,
                   fnum))
+  {
+    GNUNET_break (0);
     return GNUNET_SYSERR;
+  }
   GNUNET_assert (NULL != dst);
   if (sizeof (uint64_t) != *dst_size)
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
+  if (sizeof (uint64_t) !=
+      PQgetlength (result,
+                   row,
+                   fnum))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
   res = (uint64_t *) PQgetvalue (result,
                                 row,
                                 fnum);