From afea703422001cbbe8bbd2e13842008a482cd9ae Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Thu, 10 Jun 2010 15:27:46 -0400 Subject: [PATCH 1/4] Implement byteswapping in the reader --- gvdb-reader.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index 699fddb64..a04306056 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -438,11 +438,23 @@ gvdb_table_get_value (GvdbTable *file, const gchar *key) { const struct gvdb_hash_item *item; + GVariant *value; if ((item = gvdb_table_lookup (file, key, 'v')) == NULL) return NULL; - return gvdb_table_value_from_item (file, item); + value = gvdb_table_value_from_item (file, item); + + if (value && file->byteswapped) + { + GVariant *tmp; + + tmp = g_variant_byteswap (value); + g_variant_unref (value); + value = tmp; + } + + return value; } /** @@ -579,6 +591,15 @@ gvdb_table_walk (GvdbTable *table, if (value != NULL) { + if (table->byteswapped) + { + GVariant *tmp; + + tmp = g_variant_byteswap (value); + g_variant_unref (value); + value = tmp; + } + value_func (name, name_len, value, user_data); g_variant_unref (value); } From df40747190a0fff4582c84b101f74e5da91f8f72 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sun, 18 Jul 2010 20:45:37 -0400 Subject: [PATCH 2/4] Add gvdb_table_is_valid() API Checks that the on-disk file is still valid. --- gvdb-reader.c | 17 +++++++++++++++++ gvdb-reader.h | 3 +++ 2 files changed, 20 insertions(+) diff --git a/gvdb-reader.c b/gvdb-reader.c index a04306056..01ef75649 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -534,6 +534,23 @@ gvdb_table_unref (GvdbTable *file) } } +/** + * gvdb_table_is_valid: + * @table: a #GvdbTable + * @returns: %TRUE if @table is still valid + * + * Checks if the table is still valid. + * + * An on-disk GVDB can be marked as invalid. This happens when the file + * has been replaced. The appropriate action is typically to reopen the + * file. + **/ +gboolean +gvdb_table_is_valid (GvdbTable *table) +{ + return !!table->data; +} + void gvdb_table_walk (GvdbTable *table, const gchar *key, diff --git a/gvdb-reader.h b/gvdb-reader.h index a29c16e1c..c96064627 100644 --- a/gvdb-reader.h +++ b/gvdb-reader.h @@ -49,6 +49,9 @@ G_GNUC_INTERNAL gboolean gvdb_table_has_value (GvdbTable *table, const gchar *key); +G_GNUC_INTERNAL +gboolean gvdb_table_is_valid (GvdbTable *table); + typedef void (*GvdbWalkValueFunc) (const gchar *name, gsize name_len, GVariant *value, From d63f199d921b2444e25bc9f39cc12a84ad9695b5 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sun, 18 Jul 2010 21:43:18 -0400 Subject: [PATCH 3/4] Fix is_valid() API Actually dereference the pointer instead of just checking for NULL --- gvdb-reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index 01ef75649..3b77e675e 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -548,7 +548,7 @@ gvdb_table_unref (GvdbTable *file) gboolean gvdb_table_is_valid (GvdbTable *table) { - return !!table->data; + return !!*table->data; } void From a35852bda37400bb4f7c6ee3a3184dde65fadb1f Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sun, 3 Oct 2010 21:10:35 -0400 Subject: [PATCH 4/4] Fix reader on big endian Some of the hashtable code was failing to byteswap properly. --- gvdb-reader.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index 3b77e675e..0b1b2ce8c 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -34,11 +34,11 @@ struct _GvdbTable { gboolean byteswapped; gboolean trusted; - const guint32 *bloom_words; + const guint32_le *bloom_words; guint32 n_bloom_words; guint bloom_shift; - const guint32 *hash_buckets; + const guint32_le *hash_buckets; guint32 n_buckets; struct gvdb_hash_item *hash_items; @@ -206,7 +206,7 @@ gvdb_table_bloom_filter (GvdbTable *file, mask = 1 << (hash_value & 31); mask |= 1 << ((hash_value >> file->bloom_shift) & 31); - return (file->bloom_words[word] & mask) == mask; + return (guint32_from_le (file->bloom_words[word]) & mask) == mask; } static gboolean @@ -262,10 +262,10 @@ gvdb_table_lookup (GvdbTable *file, return NULL; bucket = hash_value % file->n_buckets; - itemno = file->hash_buckets[bucket]; + itemno = guint32_from_le (file->hash_buckets[bucket]); if (bucket == file->n_buckets - 1 || - (lastno = file->hash_buckets[bucket + 1]) > file->n_hash_items) + (lastno = guint32_from_le(file->hash_buckets[bucket + 1])) > file->n_hash_items) lastno = file->n_hash_items; while G_LIKELY (itemno < lastno)