From: Matthias Wachs Date: Wed, 21 Mar 2012 15:43:56 +0000 (+0000) Subject: - changes to record remove X-Git-Tag: initial-import-from-subversion-38251~14165 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=13c5308bd3b81ff92bba7708124f47846fe26c3d;p=oweals%2Fgnunet.git - changes to record remove --- diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 6efe1d475..3852a1406 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -1016,16 +1016,30 @@ handle_record_remove_it (void *cls, found = GNUNET_SYSERR; for (c = 0; c < rd_count; c++) { - if ((rd[c].expiration.abs_value == rrc->rd->expiration.abs_value) && - (rd[c].flags == rrc->rd->flags) && - (rd[c].record_type == rrc->rd->record_type) && - (rd[c].data_size == rrc->rd->data_size) && - (0 == memcmp (rd[c].data, rrc->rd->data, rrc->rd->data_size))) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found record to remove!\n", rd_count); - found = c; - break; - } + if (rd[c].expiration.abs_value != rrc->rd->expiration.abs_value) + continue; + GNUNET_break(0); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SENT FLAGES: %u \n",rd[c].flags); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "STORED FLAGES: %u \n",rrc->rd->flags); + /* + if (rd[c].flags != rrc->rd->flags) + continue;*/ + GNUNET_break(0); + if (rd[c].record_type != rrc->rd->record_type) + continue; + GNUNET_break(0); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "SENT FLAGES: %u \n",rd[c].data_size); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "STORED FLAGES: %u \n",rrc->rd->data_size); + /* + if (rd[c].data_size != rrc->rd->data_size) + continue; + GNUNET_break(0); + if (0 != memcmp (rd[c].data, rrc->rd->data, rrc->rd->data_size)) + continue; + GNUNET_break(0); */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found record to remove!\n", rd_count); + found = c; + break; } if (GNUNET_SYSERR == found) { @@ -1127,7 +1141,7 @@ static void handle_record_remove (void *cls, return; } - if ((rd_count != 1) || (rd_ser_len < 1) || (name_len >=256) || (name_len == 0)) + if ((name_len >=256) || (name_len == 0)) { GNUNET_break_op (0); GNUNET_SERVER_receive_done (client, GNUNET_OK); @@ -1143,13 +1157,6 @@ static void handle_record_remove (void *cls, return; } - if ((rd_count != 1) || (rd_ser_len < 1) || (name_len >=256) || (name_len == 0)) - { - GNUNET_break_op (0); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - return; - } - pkey_tmp = (char *) &rr_msg[1]; name_tmp = &pkey_tmp[key_len]; rd_ser = &name_tmp[name_len]; @@ -1188,31 +1195,51 @@ static void handle_record_remove (void *cls, GNUNET_CONTAINER_multihashmap_put(zonekeys, &long_hash, cc, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); } + struct GNUNET_NAMESTORE_RecordData rd[rd_count]; res = GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_ser, rd_count, rd); - if ((res != GNUNET_OK) || (rd_count != 1)) + if ((res != GNUNET_OK) || (rd_count > 1)) { GNUNET_break_op (0); goto send; } - struct RemoveRecordContext rrc; - rrc.rd = rd; - rrc.pkey = pkey; + if (0 == rd_count) + { + /* remove the whole name and all records */ + /* Database operation */ + res = GSN_database->remove_records (GSN_database->cls, + &pubkey_hash, + name_tmp); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing name `%s': %s\n", + name_tmp, (GNUNET_OK == res) ? "OK" : "FAIL"); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for name `%s' in zone `%s'\n", name_tmp, GNUNET_short_h2s(&pubkey_hash)); + if (GNUNET_OK != res) + /* Could not remove entry from database */ + res = 4; + else + res = 0; + } + else + { + /* remove a single record */ + struct RemoveRecordContext rrc; + rrc.rd = rd; + rrc.pkey = pkey; - /* Database operation */ - res = GSN_database->iterate_records (GSN_database->cls, - &pubkey_hash, - name_tmp, - 0, - handle_record_remove_it, &rrc); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for name `%s' in zone `%s'\n", name_tmp, GNUNET_short_h2s(&pubkey_hash)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for name `%s': %s\n", - name_tmp, (rrc.op_res == 0) ? "OK" : "FAIL"); - res = rrc.op_res; + /* Database operation */ + res = GSN_database->iterate_records (GSN_database->cls, + &pubkey_hash, + name_tmp, + 0, + handle_record_remove_it, &rrc); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for name `%s': %s\n", + name_tmp, (rrc.op_res == 0) ? "OK" : "FAIL"); + res = rrc.op_res; + } /* Send response */ send: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "RECORD_REMOVE_RESPONSE"); diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index be80e2091..a0f37f9f1 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c @@ -1221,7 +1221,7 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, * @param h handle to the namestore * @param pkey private key of the zone * @param name name that is being mapped (at most 255 characters long) - * @param rd record data + * @param rd record data, remove specific record, NULL to remove the name and all records * @param cont continuation to call when done * @param cont_cls closure for cont * @return handle to abort the request @@ -1244,6 +1244,7 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, size_t name_len = 0; size_t key_len = 0; uint32_t rid = 0; + uint16_t rd_count = 1; GNUNET_assert (NULL != h); @@ -1260,9 +1261,13 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, GNUNET_assert (pkey_enc != NULL); key_len = ntohs (pkey_enc->len); - rd_ser_len = GNUNET_NAMESTORE_records_get_size(1, rd); + if (NULL == rd) + rd_count = 0; + else + rd_count = 1; + rd_ser_len = GNUNET_NAMESTORE_records_get_size (rd_count, rd); char rd_ser[rd_ser_len]; - GNUNET_NAMESTORE_records_serialize(1, rd, rd_ser_len, rd_ser); + GNUNET_NAMESTORE_records_serialize (rd_count, rd, rd_ser_len, rd_ser); name_len = strlen (name) + 1; @@ -1284,7 +1289,7 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, msg->gns_header.r_id = htonl (rid); msg->name_len = htons (name_len); msg->rd_len = htons (rd_ser_len); - msg->rd_count = htons (1); + msg->rd_count = htons (rd_count); msg->pkey_len = htons (key_len); memcpy (pkey_tmp, pkey_enc, key_len); memcpy (name_tmp, name, name_len);