X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_my_lib.h;h=f8ea01490c3ba0f3033402e40cdfccfb954d2765;hb=abdec5e11ff11bb10d32c013e11344a54786f80f;hp=c83fc99ae68e15bb2cce9ffa8403ac127bb84169;hpb=fd4db43fe74e67f83b7013c7b98f97bb14d9b028;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_my_lib.h b/src/include/gnunet_my_lib.h index c83fc99ae..f8ea01490 100644 --- a/src/include/gnunet_my_lib.h +++ b/src/include/gnunet_my_lib.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (C) 2012 GNUnet e.V. + Copyright (C) 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 @@ -19,6 +19,7 @@ */ /** * @author Christian Grothoff + * @author Christophe Genevey * * @file * Helper library to access a MySQL database @@ -65,10 +66,21 @@ typedef int MYSQL_BIND *qbind); +/** + * Function called to cleanup result data. + * + * @param cls closure + * @param rs spec to clean up + */ +typedef void +(*GNUNET_MY_QueryCleanup)(void *cls, + MYSQL_BIND *qbind); /** * Information we pass to #GNUNET_MY_exec_prepared() to * initialize the arguments of the prepared statement. */ + + struct GNUNET_MY_QueryParam { @@ -77,6 +89,11 @@ struct GNUNET_MY_QueryParam */ GNUNET_MY_QueryConverter conv; + /** + * Function to call for cleaning up the query. Can be NULL. + */ + GNUNET_MY_QueryCleanup cleaner; + /** * Closure for @e conv. */ @@ -95,23 +112,21 @@ struct GNUNET_MY_QueryParam /** * Information to pass to @e conv. Size of @a data. */ - unsigned long data_len ; + unsigned long data_len; }; - /** * End of query parameter specification. * * @return array last entry for the result specification to use */ -#define GNUNET_MY_query_param_end { NULL, NULL, 0, NULL, 0 } - +#define GNUNET_MY_query_param_end { NULL, NULL, NULL, 0, NULL, 0 } /** * Generate query parameter for a buffer @a ptr of - * @a ptr_size bytes. + * @a ptr_size bytes.FG * * @param ptr pointer to the query parameter to pass * @oaran ptr_size number of bytes in @a ptr @@ -120,6 +135,7 @@ struct GNUNET_MY_QueryParam GNUNET_MY_query_param_fixed_size (const void *ptr, size_t ptr_size); + /** * Run a prepared SELECT statement. * @@ -131,7 +147,7 @@ GNUNET_MY_query_param_fixed_size (const void *ptr, int GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc, struct GNUNET_MYSQL_StatementHandle *sh, - const struct GNUNET_MY_QueryParam *params); + struct GNUNET_MY_QueryParam *params); /** @@ -140,19 +156,39 @@ GNUNET_MY_exec_prepared (struct GNUNET_MYSQL_Context *mc, */ struct GNUNET_MY_ResultParam; +/** + * Information we pass to #GNUNET_MY_extract_result() to + * initialize the arguments of the prepared statement. + */ +struct GNUNET_MY_ResultSpec; /** * Function called to convert input argument into SQL parameters. * * @param cls closure - * @param pq data about the query + * @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 -1 on error */ typedef int (*GNUNET_MY_ResultConverter)(void *cls, - struct GNUNET_MY_QueryParam *qp, + struct GNUNET_MY_ResultSpec *rs, + MYSQL_STMT *stmt, + unsigned int column, MYSQL_BIND *results); +/** + * Function called to cleanup result data. + * + * @param cls closure + * @param rs spec to clean up + */ +typedef void +(*GNUNET_MY_ResultCleanup)(void *cls, + struct GNUNET_MY_ResultSpec *rs); + /** * Information we pass to #GNUNET_MY_extract_result() to @@ -162,9 +198,19 @@ struct GNUNET_MY_ResultSpec { /** - * Function to call for the type conversion. + * Function to call to initialize the MYSQL_BIND array. + */ + GNUNET_MY_ResultConverter pre_conv; + + /** + * Function to call for converting the result. Can be NULL. + */ + GNUNET_MY_ResultConverter post_conv; + + /** + * Function to call for cleaning up the result. Can be NULL. */ - GNUNET_MY_ResultConverter conv; + GNUNET_MY_ResultCleanup cleaner; /** * Closure for @e conv. @@ -188,6 +234,23 @@ struct GNUNET_MY_ResultSpec */ size_t *result_size; + /** + * How many fields does this result specification occupy + * in the result returned by MySQL. + */ + unsigned int num_fields; + + /** + * Location where we temporarily store the output buffer + * length from MySQL. Internal to libgnunetmy. + */ + unsigned long mysql_bind_output_length; + + /** + * Memory for MySQL to notify us about NULL values. + */ + my_bool is_null; + }; @@ -196,7 +259,7 @@ struct GNUNET_MY_ResultSpec * * @return array last entry for the result specification to use */ -#define GNUNET_MY_result_spec_end { NULL, NULL, NULL, 0, NULL } +#define GNUNET_MY_result_spec_end { NULL, NULL, NULL, 0, NULL, 0, 0 } @@ -257,6 +320,7 @@ GNUNET_MY_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x) struct GNUNET_MY_QueryParam GNUNET_MY_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x); + /** * Generate query parameter for an absolute time value. * The database must store a 64-bit integer. @@ -301,36 +365,33 @@ GNUNET_MY_query_param_uint64 (const uint64_t *x); /** - * FIXME. + * Variable-size result expected * + * @param[out] dst where to store the result, allocated + * @param[out] sptr where to store the size of @a dst + * @return array entru for the result specification to use */ - - /** - * Variable-size result expected - * - * @param[out] dst where to store the result, allocated - * @param[out] sptr where to store the size of @a dst - * @return array entru for the result specification to use - */ struct GNUNET_MY_ResultSpec GNUNET_MY_result_spec_variable_size (void **dst, - size_t *ptr_size); + size_t *ptr_size); + /** - * RSA public key expected - * - * @param name name of the field in the table - * @param[out] rsa where to store the result - * @return array entry for the result specification to use - */ + * RSA public key expected + * + * @param name name of the field in the table + * @param[out] rsa where to store the result + * @return array entry for the result specification to use + */ struct GNUNET_MY_ResultSpec GNUNET_MY_result_spec_rsa_public_key (struct GNUNET_CRYPTO_RsaPublicKey **rsa); + /** - * RSA signature expected. - * - * @param[out] sig where to store the result; - * @return array entry for the result specification to use - */ + * RSA signature expected. + * + * @param[out] sig where to store the result; + * @return array entry for the result specification to use + */ struct GNUNET_MY_ResultSpec GNUNET_MY_result_spec_rsa_signature (struct GNUNET_CRYPTO_RsaSignature **sig); @@ -389,11 +450,44 @@ GNUNET_MY_result_spec_uint32 (uint32_t *u32); struct GNUNET_MY_ResultSpec GNUNET_MY_result_spec_uint64 (uint64_t *u64); + +/** + * Extract results from a query result according to the given + * specification. Always fetches the next row. + * + * @param sh statement that returned results + * @param rs specification to extract for + * @return + * #GNUNET_YES if all results could be extracted + * #GNUNET_NO if there is no more data in the result set + * #GNUNET_SYSERR if a result was invalid + */ int GNUNET_MY_extract_result (struct GNUNET_MYSQL_StatementHandle *sh, - struct GNUNET_MY_QueryParam *qp, - struct GNUNET_MY_ResultSpec *specs, - int row); + struct GNUNET_MY_ResultSpec *specs); + + +/** + * Free all memory that was allocated in @a qp during + * #GNUNET_MY_exect_prepared(). + * + * @param qp query specification to clean up + * @param qbind mysql query + */ +void +GNUNET_MY_cleanup_query (struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND *qbind); + + +/** + * Free all memory that was allocated in @a rs during + * #GNUNET_MY_extract_result(). + * + * @param rs reult specification to clean up + */ +void +GNUNET_MY_cleanup_result (struct GNUNET_MY_ResultSpec *rs); + #if 0 /* keep Emacsens' auto-indent happy */ {