GNUNET_SQ_bind (sqlite3_stmt *stmt,
const struct GNUNET_SQ_QueryParam *params)
{
+ unsigned int j;
+
+ j = 1;
+ for (unsigned int i=0;NULL != params[i].conv; i++)
+ {
+ if (GNUNET_OK !=
+ params[i].conv (params[i].conv_cls,
+ params[i].data,
+ params[i].size,
+ stmt,
+ j))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "sq",
+ _("Failure to bind %u-th SQL parameter\n"),
+ i);
+ if (SQLITE_OK !=
+ sqlite3_reset (stmt))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "sq",
+ _("Failure in sqlite3_reset (!)\n"));
+ return GNUNET_SYSERR;
+ }
+ }
+ GNUNET_assert (0 != params[i].num_params);
+ j += params[i].num_params;
+ }
+ return GNUNET_OK;
}
*
* @param result result to process
* @param[in,out] rs result specification to extract for
- * @param row row from the result to extract
* @return
- * #GNUNET_YES if all results could be extracted
+ * #GNUNET_OK if all results could be extracted
* #GNUNET_SYSERR if a result was invalid (non-existing field)
*/
int
GNUNET_SQ_extract_result (sqlite3_stmt *result,
- struct GNUNET_SQ_ResultSpec *rs,
- int row)
+ struct GNUNET_SQ_ResultSpec *rs)
{
+ unsigned int j = 0;
+
+ for (unsigned int i=0;NULL != rs[i].conv; i++)
+ {
+ if (NULL == rs[i].result_size)
+ rs[i].result_size = &rs[i].dst_size;
+ if (GNUNET_OK !=
+ rs[i].conv (rs[i].cls,
+ result,
+ j,
+ rs[i].result_size,
+ rs[i].dst))
+ {
+ for (unsigned int k=0;k<i;k++)
+ if (NULL != rs[k].cleaner)
+ rs[k].cleaner (rs[k].cls);
+ return GNUNET_SYSERR;
+ }
+ GNUNET_assert (0 != rs[i].num_params);
+ j += rs[i].num_params;
+ }
+ return GNUNET_OK;
}
void
GNUNET_SQ_cleanup_result (struct GNUNET_SQ_ResultSpec *rs)
{
+ for (unsigned int i=0;NULL != rs[i].conv; i++)
+ if (NULL != rs[i].cleaner)
+ rs[i].cleaner (rs[i].cls);
}
+
+/**
+ * Reset @a stmt and log error.
+ *
+ * @param dbh database handle
+ * @param stmt statement to reset
+ */
+void
+GNUNET_SQ_reset (sqlite3 *dbh,
+ sqlite3_stmt *stmt)
+{
+ if (SQLITE_OK !=
+ sqlite3_reset (stmt))
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite",
+ _("Failed to reset sqlite statement with error: %s\n"),
+ sqlite3_errmsg (dbh));
+}
+
+
/* end of sq.c */