-more revocation
[oweals/gnunet.git] / src / identity-provider / plugin_identity_provider_sqlite.c
index f31e2e68a73ed0adc8db1e322cd0b3b6da43aefd..ac4e3c68685f1120198d0fd92847e908e8bfe8cf 100644 (file)
@@ -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);
   }