X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fidentity-provider%2Fplugin_identity_provider_sqlite.c;h=ac4e3c68685f1120198d0fd92847e908e8bfe8cf;hb=58d4e0f0447ae4efc6b3f4ba8a3d612c22f7cbb4;hp=f31e2e68a73ed0adc8db1e322cd0b3b6da43aefd;hpb=1731fbd017731df1f3f88bd4b3beac765996a1ad;p=oweals%2Fgnunet.git diff --git a/src/identity-provider/plugin_identity_provider_sqlite.c b/src/identity-provider/plugin_identity_provider_sqlite.c index f31e2e68a..ac4e3c686 100644 --- a/src/identity-provider/plugin_identity_provider_sqlite.c +++ b/src/identity-provider/plugin_identity_provider_sqlite.c @@ -356,32 +356,49 @@ database_shutdown (struct Plugin *plugin) * * @param cls closure (internal context for the plugin) * @param ticket the ticket to persist - * @param attrs attributes to persist * @return #GNUNET_OK on success, else #GNUNET_SYSERR */ static int identity_provider_sqlite_store_ticket (void *cls, - const struct GNUNET_IDENTITY_PROVIDER_Ticket2 *ticket, - const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs) + const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket, + const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs) { struct Plugin *plugin = cls; + size_t attrs_len; + char *attrs_ser; int n; - size_t attrs_size; - char *attrs_serialized; - attrs_size = attribute_list_serialize_get_size (attrs); - - attrs_serialized = GNUNET_malloc (attrs_size); - - attribute_list_serialize (attrs, - attrs_serialized); - - { + { + /* First delete duplicates */ + struct GNUNET_SQ_QueryParam dparams[] = { + GNUNET_SQ_query_param_auto_from_type (&ticket->identity), + GNUNET_SQ_query_param_uint64 (&ticket->rnd), + GNUNET_SQ_query_param_end + }; + if (GNUNET_OK != + GNUNET_SQ_bind (plugin->delete_ticket, + dparams)) + { + LOG_SQLITE (plugin, + GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, + "sqlite3_bind_XXXX"); + GNUNET_SQ_reset (plugin->dbh, + plugin->delete_ticket); + return GNUNET_SYSERR; + } + n = sqlite3_step (plugin->delete_ticket); + GNUNET_SQ_reset (plugin->dbh, + plugin->delete_ticket); + + attrs_len = attribute_list_serialize_get_size (attrs); + attrs_ser = GNUNET_malloc (attrs_len); + attribute_list_serialize (attrs, + attrs_ser); struct GNUNET_SQ_QueryParam sparams[] = { GNUNET_SQ_query_param_auto_from_type (&ticket->identity), GNUNET_SQ_query_param_auto_from_type (&ticket->audience), GNUNET_SQ_query_param_uint64 (&ticket->rnd), - GNUNET_SQ_query_param_fixed_size (attrs_serialized, attrs_size), + GNUNET_SQ_query_param_fixed_size (attrs_ser, attrs_len), GNUNET_SQ_query_param_end }; @@ -399,6 +416,7 @@ identity_provider_sqlite_store_ticket (void *cls, n = sqlite3_step (plugin->store_ticket); GNUNET_SQ_reset (plugin->dbh, plugin->store_ticket); + GNUNET_free (attrs_ser); } switch (n) { @@ -430,7 +448,7 @@ identity_provider_sqlite_store_ticket (void *cls, */ static int identity_provider_sqlite_delete_ticket (void *cls, - const struct GNUNET_IDENTITY_PROVIDER_Ticket2 *ticket) + const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) { struct Plugin *plugin = cls; int n; @@ -495,11 +513,12 @@ get_ticket_and_call_iterator (struct Plugin *plugin, GNUNET_IDENTITY_PROVIDER_TicketIterator iter, void *iter_cls) { - struct GNUNET_IDENTITY_PROVIDER_Ticket2 ticket; - size_t attrs_size; - void *attrs_serialized; + struct GNUNET_IDENTITY_PROVIDER_Ticket ticket; + struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs; int ret; int sret; + size_t attrs_len; + char *attrs_ser; ret = GNUNET_NO; if (SQLITE_ROW == (sret = sqlite3_step (stmt))) @@ -508,7 +527,8 @@ get_ticket_and_call_iterator (struct Plugin *plugin, GNUNET_SQ_result_spec_auto_from_type (&ticket.identity), GNUNET_SQ_result_spec_auto_from_type (&ticket.audience), GNUNET_SQ_result_spec_uint64 (&ticket.rnd), - GNUNET_SQ_result_spec_variable_size (&attrs_serialized, &attrs_size), + GNUNET_SQ_result_spec_variable_size ((void**)&attrs_ser, + &attrs_len), GNUNET_SQ_result_spec_end }; @@ -521,23 +541,13 @@ get_ticket_and_call_iterator (struct Plugin *plugin, } else { - struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs; - - attrs = attribute_list_deserialize (attrs_serialized, attrs_size); - - if (NULL == attrs) - { - GNUNET_break (0); - ret = GNUNET_SYSERR; - } - else - { - if (NULL != iter) - iter (iter_cls, - &ticket, - attrs); - ret = GNUNET_YES; - } + attrs = attribute_list_deserialize (attrs_ser, + attrs_len); + if (NULL != iter) + iter (iter_cls, + &ticket, + attrs); + ret = GNUNET_YES; } GNUNET_SQ_cleanup_result (rs); }