diff options
author | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-08 13:27:49 +0100 |
---|---|---|
committer | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-08 13:27:49 +0100 |
commit | 66ac4dde6785fbebccc91ed0ca3f5bc48395d101 (patch) | |
tree | 3a35cd96357d611d13902f82dd422c827de09b39 | |
parent | 569724baf15d56b742aecd1aad3ebaa0c59843ac (diff) |
Add key and value elements to records
Previous records which match key elements are removed
-rw-r--r-- | src/libtidbit/tidbit-record.c | 49 | ||||
-rw-r--r-- | src/libtidbit/tidbit-record.h | 3 | ||||
-rw-r--r-- | src/libtidbit/tidbit.h | 7 |
3 files changed, 37 insertions, 22 deletions
diff --git a/src/libtidbit/tidbit-record.c b/src/libtidbit/tidbit-record.c index 23668d5..a77824a 100644 --- a/src/libtidbit/tidbit-record.c +++ b/src/libtidbit/tidbit-record.c @@ -31,7 +31,8 @@ #define SECONDS_PER_DAY 86400 #define SECONDS_PER_YEAR 31557600 -#define TIDBIT_RECORD_ELEMENT_SEPARATOR ": " +#define TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY "==" +#define TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE ":=" #define TIDBIT_RECORD_ELEMENT_KEY_CHAR_IS_VALID(_chr) (((_chr) >= 'a' && (_chr) <= 'z') || (_chr) == '_') #define TIDBIT_RECORD_ELEMENT_VALUE_CHAR_IS_VALID(_chr) ((_chr) >= 0x20) @@ -88,7 +89,7 @@ void tidbit_record_set_ttl (PtrTidbitRecord record, int seconds, int days, int y record->end_time = record->start_time + ttl; } -void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value) +void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value, TidbitRecordElementType type) { g_assert(record->status != TIDBIT_RECORD_STATUS_SIGNED); //FIXME error, not assert @@ -134,17 +135,22 @@ void tidbit_record_sign (PtrTidbitRecord record, PtrTidbitKey key) GString* rec_str = g_string_sized_new (TIDBIT_RECORD_MAX_SIZE); g_string_append_printf (rec_str, TIDBIT_RECORD_HEADER"; %s\n", key->agent); - g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_USERKEY TIDBIT_RECORD_ELEMENT_SEPARATOR "%s\n", record->user_name); - g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_TABLE TIDBIT_RECORD_ELEMENT_SEPARATOR "%s\n", record->table_name); - g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_CREATED TIDBIT_RECORD_ELEMENT_SEPARATOR "%lld\n", (unsigned long long) record->start_time); - g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_EXPIRES TIDBIT_RECORD_ELEMENT_SEPARATOR "%lld\n", (unsigned long long) record->end_time); + g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_USERKEY TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY "%s\n", record->user_name); + g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_TABLE TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY "%s\n", record->table_name); + g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_CREATED TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE "%lld\n", (unsigned long long) record->start_time); + g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_EXPIRES TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE "%lld\n", (unsigned long long) record->end_time); for (GList* element_itter = record->elements; element_itter; element_itter = g_list_next(element_itter)){ PtrTidbitRecordElement element = element_itter->data; - g_string_append_printf (rec_str, "%s" TIDBIT_RECORD_ELEMENT_SEPARATOR "%s\n", element->key, element->value); + if (element->type == TIDBIT_RECORD_ELEMENT_TYPE_KEY) + g_string_append_printf (rec_str, "%s" TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY "%s\n", element->key, element->value); + else if (element->type == TIDBIT_RECORD_ELEMENT_TYPE_VALUE) + g_string_append_printf (rec_str, "%s" TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE "%s\n", element->key, element->value); + else + g_assert_not_reached(); } char* signature = tidbit_key_sign_data (key, rec_str->str); - g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_SIGNED TIDBIT_RECORD_ELEMENT_SEPARATOR "%s\n", signature); + g_string_append_printf (rec_str, TIDBIT_RECORD_ELEMENT_KEY_SIGNED TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE "%s\n", signature); record->guid = tidbit_guid_new (signature); g_free (signature); @@ -164,16 +170,18 @@ PtrTidbitGuid tidbit_record_get_guid (PtrTidbitRecord record) return record->guid; } -static gboolean tidbit_record_extract_pair_from_raw (char* data, char** rest, char** key, char** value) +static gboolean tidbit_record_extract_pair_from_raw (char* data, char** rest, char** key, char** value, TidbitRecordElementType* type) { int i=0; - for (i=0; data[i] != ':'; i++){ - if (!TIDBIT_RECORD_ELEMENT_KEY_CHAR_IS_VALID (data[i])) - return FALSE; + for (i=0; TIDBIT_RECORD_ELEMENT_KEY_CHAR_IS_VALID (data[i]); i++){ } - if (data[i+1] != ' ') - return FALSE; + if (data[i] == TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY[0] && data[i + 1] == TIDBIT_RECORD_ELEMENT_SEPARATOR_KEY[0]) + *type = TIDBIT_RECORD_ELEMENT_TYPE_KEY; + else if (data[i] == TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE[0] && data[i + 1] == TIDBIT_RECORD_ELEMENT_SEPARATOR_VALUE[0]) + *type = TIDBIT_RECORD_ELEMENT_TYPE_VALUE; + else + g_assert_not_reached(); *key = g_strndup (data, i); i += 2; @@ -195,6 +203,7 @@ PtrTidbitRecord tidbit_record_from_raw (char* raw) char* key; char* value; char* rest; + TidbitRecordElementType type; char* data = raw; gsize sig_length, user_key_length; int reply; @@ -212,21 +221,21 @@ PtrTidbitRecord tidbit_record_from_raw (char* raw) data++; } - if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value)) + if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value, &type)) return record; if (!g_str_equal(key, TIDBIT_RECORD_ELEMENT_KEY_USERKEY)) return record; g_free(key); record->user_name = value; - if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value)) + if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value, &type)) return record; if (!g_str_equal(key, TIDBIT_RECORD_ELEMENT_KEY_TABLE)) return record; g_free(key); record->table_name = value; - if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value)) + if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value, &type)) return record; if (!g_str_equal(key, TIDBIT_RECORD_ELEMENT_KEY_CREATED)) return record; @@ -236,7 +245,7 @@ PtrTidbitRecord tidbit_record_from_raw (char* raw) return record; g_free(value); - if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value)) + if (!tidbit_record_extract_pair_from_raw (data, &data, &key, &value, &type)) return record; if (!g_str_equal(key, TIDBIT_RECORD_ELEMENT_KEY_EXPIRES)) //FIXME leaks return record; @@ -247,11 +256,11 @@ PtrTidbitRecord tidbit_record_from_raw (char* raw) g_free(value); while (TRUE){ - if (!tidbit_record_extract_pair_from_raw (data, &rest, &key, &value)) + if (!tidbit_record_extract_pair_from_raw (data, &rest, &key, &value, &type)) return record; if (g_str_equal(key, TIDBIT_RECORD_ELEMENT_KEY_SIGNED)) break; - tidbit_record_add_element (record, key, value); + tidbit_record_add_element (record, key, value, type); g_free(key); g_free(value); data=rest; diff --git a/src/libtidbit/tidbit-record.h b/src/libtidbit/tidbit-record.h index c45ee5e..34f111f 100644 --- a/src/libtidbit/tidbit-record.h +++ b/src/libtidbit/tidbit-record.h @@ -30,6 +30,7 @@ typedef struct TidbitRecordElement{ char* key; char* value; + TidbitRecordElementType type; } TidbitRecordElement, *PtrTidbitRecordElement; typedef enum { @@ -55,7 +56,7 @@ PtrTidbitRecord tidbit_record_new (char* table_name); void tidbit_record_ref (PtrTidbitRecord record); void tidbit_record_unref (PtrTidbitRecord record); void tidbit_record_set_ttl (PtrTidbitRecord record, int seconds, int days, int years); -void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value); +void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value, TidbitRecordElementType type); char* tidbit_record_get_element_value_by_key (PtrTidbitRecord record, char* key); void tidbit_record_sign (PtrTidbitRecord record, PtrTidbitKey key); */ diff --git a/src/libtidbit/tidbit.h b/src/libtidbit/tidbit.h index ee83111..2db38c9 100644 --- a/src/libtidbit/tidbit.h +++ b/src/libtidbit/tidbit.h @@ -31,6 +31,11 @@ typedef struct _TidbitRecord TidbitRecord, *PtrTidbitRecord; typedef struct _TidbitGuid TidbitGuid, *PtrTidbitGuid; typedef struct _TidbitGuidSet TidbitGuidSet, *PtrTidbitGuidSet; +typedef enum { +TIDBIT_RECORD_ELEMENT_TYPE_KEY, +TIDBIT_RECORD_ELEMENT_TYPE_VALUE, +} TidbitRecordElementType; + typedef enum{ TIDBIT_QUERY_EXP_TYPE_EQ = '=', // FIXME These need a propper system TIDBIT_QUERY_EXP_TYPE_NE = '!' | '=' << 8, @@ -49,7 +54,7 @@ PtrTidbitRecord tidbit_record_new (char* table_name); void tidbit_record_ref (PtrTidbitRecord record); void tidbit_record_unref (PtrTidbitRecord record); void tidbit_record_set_ttl (PtrTidbitRecord record, int seconds, int days, int years); -void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value); +void tidbit_record_add_element (PtrTidbitRecord record, char* key, char* value, TidbitRecordElementType type); char* tidbit_record_get_element_value_by_key (PtrTidbitRecord record, char* key); void tidbit_record_sign (PtrTidbitRecord record, PtrTidbitKey key); |