summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Brej <cbrej@cs.man.ac.uk>2010-08-08 13:27:49 +0100
committerCharlie Brej <cbrej@cs.man.ac.uk>2010-08-08 13:27:49 +0100
commit66ac4dde6785fbebccc91ed0ca3f5bc48395d101 (patch)
tree3a35cd96357d611d13902f82dd422c827de09b39
parent569724baf15d56b742aecd1aad3ebaa0c59843ac (diff)
Add key and value elements to records
Previous records which match key elements are removed
-rw-r--r--src/libtidbit/tidbit-record.c49
-rw-r--r--src/libtidbit/tidbit-record.h3
-rw-r--r--src/libtidbit/tidbit.h7
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);