REST: nothing triggers rest
[oweals/gnunet.git] / src / my / my_result_helper.c
index 9c04b9bed8526133884a55ff7140796be6e3369a..75a3400144dd12ccb30a6a73f97215436c0534bb 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 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 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
+  Affero General Public License for more details.
+  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/>.
 
-  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/>
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 /**
  * @file my/my_result_helper.c
 #include "gnunet_util_lib.h"
 #include "gnunet_my_lib.h"
 
+
 /**
  * extract data from a Mysql database @a result at row @a row
  *
  * @param cls closure
- * @param qp data about the query
- * @param result mysql result
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] result mysql result
  * @return
  *   #GNUNET_OK if all results could be extracted
  *   #GNUNET_SYSERR if a result was invalid
@@ -43,6 +50,8 @@ pre_extract_varsize_blob (void *cls,
   results[0].buffer = NULL;
   results[0].buffer_length = 0;
   results[0].length = &rs->mysql_bind_output_length;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -70,6 +79,8 @@ post_extract_varsize_blob (void *cls,
   void *buf;
   size_t size;
 
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   size = (size_t) rs->mysql_bind_output_length;
 
   if (rs->mysql_bind_output_length != size)
@@ -113,15 +124,16 @@ cleanup_varsize_blob (void *cls,
   if (NULL != *ptr)
   {
     GNUNET_free (*ptr);
-    *ptr = NULL;  
+    *ptr = NULL;
   }
 }
 
+
 /**
  * Variable-size result expected
  *
  * @param[out] dst where to store the result, allocated
- * @param[out] sptr where to store the size of @a dst
+ * @param[out] ptr_size where to store the size of @a dst
  * @return array entru for the result specification to use
  */
 struct GNUNET_MY_ResultSpec
@@ -146,11 +158,10 @@ GNUNET_MY_result_spec_variable_size (void **dst,
  * Extract data from a Mysql 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] dst_size desired size, never NULL
- * @param[out] dst where to store the result
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
  * @return
  *  #GNUNET_OK if all results could be extracted
  *  #GNUNET_SYSERR if a result was invalid(non-existing field or NULL)
@@ -166,6 +177,8 @@ pre_extract_fixed_blob (void *cls,
   results[0].buffer_length = rs->dst_size;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_BLOB;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -176,11 +189,10 @@ pre_extract_fixed_blob (void *cls,
  * 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] dst_size desired size, never NULL
- * @param[out] dst where to store the result
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
  * @return
  *  #GNUNET_OK if all results could be extracted
  *  #GNUNET_SYSERR if a result was invalid(non-existing field or NULL)
@@ -192,6 +204,8 @@ post_extract_fixed_blob (void *cls,
                          unsigned int column,
                          MYSQL_BIND *results)
 {
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   if (rs->dst_size != rs->mysql_bind_output_length)
     return GNUNET_SYSERR;
   return GNUNET_OK;
@@ -203,7 +217,7 @@ post_extract_fixed_blob (void *cls,
  *
  * @param name name of the field in the table
  * @param[out] dst where to store the result
- * @param dst_size number of bytes in @a dst
+ * @param ptr_size number of bytes in @a dst
  * @return array entry for the result specification to use
  */
 struct GNUNET_MY_ResultSpec
@@ -228,11 +242,10 @@ GNUNET_MY_result_spec_fixed_size (void *ptr,
   * Extract data from a Mysql 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
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *   #GNUNET_OK if all results could be extracted
   *   #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
@@ -248,6 +261,8 @@ pre_extract_rsa_public_key (void *cls,
   results[0].buffer_length = 0;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_BLOB;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -258,11 +273,10 @@ pre_extract_rsa_public_key (void *cls,
   * 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
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *   #GNUNET_OK if all results could be extracted
   *   #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
@@ -279,6 +293,8 @@ post_extract_rsa_public_key  (void *cls,
   void *buf;
   size_t size;
 
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   size = (size_t) rs->mysql_bind_output_length;
 
   if (rs->mysql_bind_output_length != size)
@@ -297,6 +313,7 @@ post_extract_rsa_public_key  (void *cls,
     GNUNET_free (buf);
     return GNUNET_SYSERR;
   }
+
   *pk = GNUNET_CRYPTO_rsa_public_key_decode (buf,
                                              size);
   GNUNET_free (buf);
@@ -316,7 +333,7 @@ post_extract_rsa_public_key  (void *cls,
  * by a #GNUNET_MY_ResultConverter.
  *
  * @param cls closure
- * @param rd result data to clean up
+ * @param rs result data to clean up
  */
 static void
 clean_rsa_public_key (void *cls,
@@ -354,15 +371,15 @@ GNUNET_MY_result_spec_rsa_public_key (struct GNUNET_CRYPTO_RsaPublicKey **rsa)
   return res;
 }
 
+
 /**
   * Extract data from a Mysql 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
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *    #GNUNET_OK if all results could be extracted
   *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
@@ -378,6 +395,8 @@ pre_extract_rsa_signature (void *cls,
   results[0].buffer_length = 0;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_BLOB;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -387,26 +406,27 @@ pre_extract_rsa_signature (void *cls,
   * Extract data from a Mysql 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
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *    #GNUNET_OK if all results could be extracted
   *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
   */
 static int
 post_extract_rsa_signature (void *cls,
-                      struct GNUNET_MY_ResultSpec *rs,
-                      MYSQL_STMT *stmt,
-                      unsigned int column,
-                      MYSQL_BIND *results)
+                            struct GNUNET_MY_ResultSpec *rs,
+                            MYSQL_STMT *stmt,
+                            unsigned int column,
+                            MYSQL_BIND *results)
 {
   struct GNUNET_CRYPTO_RsaSignature **sig = rs->dst;
   void *buf;
   size_t size;
 
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   size = (size_t) rs->mysql_bind_output_length;
 
   if (rs->mysql_bind_output_length != size)
@@ -448,7 +468,7 @@ post_extract_rsa_signature (void *cls,
  */
 static void
 clean_rsa_signature (void *cls,
-          struct GNUNET_MY_ResultSpec *rs)
+                     struct GNUNET_MY_ResultSpec *rs)
 {
   struct GNUNET_CRYPTO_RsaSignature **sig = rs->dst;
 
@@ -481,56 +501,83 @@ GNUNET_MY_result_spec_rsa_signature (struct GNUNET_CRYPTO_RsaSignature **sig)
   return res;
 }
 
+
 /**
-  * Extract data from a Mysql 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_OK if all results could be extracted
-  *    #GNUNET_SYSERR if a result was invalid (non existing field or NULL)
-  */
+ * Extract data from a Mysql database @a result at row @a row
+ *
+ * @param cls closure
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
+ * @return
+ *    #GNUNET_OK if all results could be extracted
+ *    #GNUNET_SYSERR if a result was invalid (non existing field or NULL)
+ */
 static int
 pre_extract_string (void * cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                    struct GNUNET_MY_ResultSpec *rs,
+                    MYSQL_STMT *stmt,
+                    unsigned int column,
+                    MYSQL_BIND *results)
 {
-  results[0].buffer = (char *)rs->dst;
-  results[0].buffer_length = rs->dst_size;
+  results[0].buffer = NULL;
+  results[0].buffer_length = 0;
   results[0].length = &rs->mysql_bind_output_length;
+  results[0].buffer_type = MYSQL_TYPE_BLOB;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
+
   return GNUNET_OK;
 }
 
 
 /**
-  * Check size of extracted fixed size data from a Mysql database @a
-  *
-  * @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_OK if all results could be extracted
-  *    #GNUNET_SYSERR if a result was invalid (non existing field or NULL)
-  */
+ * Check size of extracted fixed size data from a Mysql database @a
+ *
+ * @param cls closure
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
+ * @return
+ *    #GNUNET_OK if all results could be extracted
+ *    #GNUNET_SYSERR if a result was invalid (non existing field or NULL)
+ */
 static int
 post_extract_string (void * cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                     struct GNUNET_MY_ResultSpec *rs,
+                     MYSQL_STMT *stmt,
+                     unsigned int column,
+                     MYSQL_BIND *results)
 {
-  if (rs->dst_size != rs->mysql_bind_output_length)
+  size_t size = (size_t) rs->mysql_bind_output_length;
+  char *buf;
+
+  if (rs->mysql_bind_output_length != size)
     return GNUNET_SYSERR;
+  if (*results->is_null)
+  {
+    *(void **) rs->dst = NULL;
+    return GNUNET_OK;
+  }
+
+  buf = GNUNET_malloc (size);
+  results[0].buffer = buf;
+  results[0].buffer_length = size;
+  results[0].buffer_type = MYSQL_TYPE_BLOB;
+
+  if (0 !=
+      mysql_stmt_fetch_column (stmt,
+                               results,
+                               column,
+                               0))
+  {
+    GNUNET_free (buf);
+    return GNUNET_SYSERR;
+  }
+  buf[size] = '\0';
+  *(void **) rs->dst = buf;
   return GNUNET_OK;
 }
 
@@ -589,26 +636,27 @@ GNUNET_MY_result_spec_absolute_time_nbo (struct GNUNET_TIME_AbsoluteNBO *at)
  * 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
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
  * @return
  *   #GNUNET_YES if all results could be extracted
  *   #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
  */
 static int
 pre_extract_uint16 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                    struct GNUNET_MY_ResultSpec *rs,
+                    MYSQL_STMT *stmt,
+                    unsigned int column,
+                    MYSQL_BIND *results)
 {
-  results[0].buffer = (char *)rs->dst;
+  results[0].buffer = rs->dst;
   results[0].buffer_length = rs->dst_size;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_SHORT;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -618,24 +666,25 @@ pre_extract_uint16 (void *cls,
  * Check size of extracted fixed size data from a Mysql datbase.
  *
  * @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
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
  * @return
  *   #GNUNET_YES if all results could be extracted
  *   #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
  */
 static int
 post_extract_uint16 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                     struct GNUNET_MY_ResultSpec *rs,
+                     MYSQL_STMT *stmt,
+                     unsigned int column,
+                     MYSQL_BIND *results)
 {
   if (rs->dst_size != rs->mysql_bind_output_length)
     return GNUNET_SYSERR;
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   return GNUNET_OK;
 }
 
@@ -660,30 +709,33 @@ GNUNET_MY_result_spec_uint16 (uint16_t *u16)
   return res;
 }
 
+
 /**
   * Extrac data from a  MYSQL 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
+  * @param cls closure
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *      #GNUNET_OK if all results could be extracted
   *      #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
   */
 static int
 pre_extract_uint32 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                    struct GNUNET_MY_ResultSpec *rs,
+                    MYSQL_STMT *stmt,
+                    unsigned int column,
+                    MYSQL_BIND *results)
 {
-  results[0].buffer = (int *)rs->dst;
+  results[0].buffer = rs->dst;
   results[0].buffer_length = rs->dst_size;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_LONG;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
@@ -693,24 +745,26 @@ pre_extract_uint32 (void *cls,
   * Extrac data from a  MYSQL 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
+  * @param cls closure
+  * @param[in,out] rs
+  * @param stmt the mysql statement that is being run
+  * @param column the column that is being processed
+  * @param[out] results
   * @return
   *      #GNUNET_OK if all results could be extracted
   *      #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
   */
 static int
 post_extract_uint32 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT * stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                     struct GNUNET_MY_ResultSpec *rs,
+                     MYSQL_STMT * stmt,
+                     unsigned int column,
+                     MYSQL_BIND *results)
 {
   if (rs->dst_size != rs->mysql_bind_output_length)
-      return GNUNET_SYSERR;
+    return GNUNET_SYSERR;
+  if (*results->is_null)
+    return GNUNET_SYSERR;
   return GNUNET_OK;
 }
 
@@ -737,67 +791,70 @@ GNUNET_MY_result_spec_uint32 (uint32_t *u32)
 
 
 /**
-  * Extract data from a MYSQL 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_OK if all results could be extracted
-  *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
-  */
+ * Extract data from a MYSQL database @a result at row @a row
+ *
+ * @param cls closure
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
+ * @return
+ *    #GNUNET_OK if all results could be extracted
+ *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
+ */
 static int
 pre_extract_uint64 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                    struct GNUNET_MY_ResultSpec *rs,
+                    MYSQL_STMT *stmt,
+                    unsigned int column,
+                    MYSQL_BIND *results)
 {
+  if (sizeof (uint64_t) != rs->dst_size)
+    return GNUNET_SYSERR;
   results[0].buffer = rs->dst;
   results[0].buffer_length = rs->dst_size;
   results[0].length = &rs->mysql_bind_output_length;
   results[0].buffer_type = MYSQL_TYPE_LONGLONG;
+  results[0].is_null = &rs->is_null;
+  rs->is_null = 0;
 
   return GNUNET_OK;
 }
 
 
-
 /**
-  * Check size of extracted fixe size data from a Mysql database
-  *
-  * @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_OK if all results could be extracted
-  *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
-  */
+ * Check size of extracted fixe size data from a Mysql database
+ *
+ * @param cls closure
+ * @param[in,out] rs
+ * @param stmt the mysql statement that is being run
+ * @param column the column that is being processed
+ * @param[out] results
+ * @return
+ *    #GNUNET_OK if all results could be extracted
+ *    #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
+ */
 static int
 post_extract_uint64 (void *cls,
-                struct GNUNET_MY_ResultSpec *rs,
-                MYSQL_STMT *stmt,
-                unsigned int column,
-                MYSQL_BIND *results)
+                     struct GNUNET_MY_ResultSpec *rs,
+                     MYSQL_STMT *stmt,
+                     unsigned int column,
+                     MYSQL_BIND *results)
 {
-  if (rs->dst_size != rs->mysql_bind_output_length)
+  if (sizeof (uint64_t) != rs->dst_size)
+    return GNUNET_SYSERR;
+  if (*results->is_null)
     return GNUNET_SYSERR;
   return GNUNET_OK;
 }
 
 
 /**
 * uint64_t expected.
 *
 * @param[out] u64 where to store the result
 * @return array entry for the result specification to use
 */
+ * uint64_t expected.
+ *
+ * @param[out] u64 where to store the result
+ * @return array entry for the result specification to use
+ */
 struct GNUNET_MY_ResultSpec
 GNUNET_MY_result_spec_uint64 (uint64_t *u64)
 {
@@ -812,4 +869,5 @@ GNUNET_MY_result_spec_uint64 (uint64_t *u64)
   return res;
 }
 
-/* end of pq_result_helper.c */
+
+/* end of my_result_helper.c */