diff options
author | Not Zed <NotZed@HelixCode.com> | 2000-10-10 20:26:29 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2000-10-10 20:26:29 +0800 |
commit | 895793d1dd3162f8b3d765a7712b8267aa88a40f (patch) | |
tree | 45f2c5246b9cca3d80b5f298d4b6686e374db385 /libibex/hash.c | |
parent | 80a69b39bdbbe56eb60b8a29a15a57e1ddbda922 (diff) | |
download | gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar.gz gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar.bz2 gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar.lz gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar.xz gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.tar.zst gsoc2013-evolution-895793d1dd3162f8b3d765a7712b8267aa88a40f.zip |
Truncate key if it is too big to fit in a single block to MAX_KEYLEN
2000-10-10 Not Zed <NotZed@HelixCode.com>
* hash.c (hash_find):
(hash_remove):
(hash_insert): Truncate key if it is too big to fit in a
single block to MAX_KEYLEN bytes.
svn path=/trunk/; revision=5815
Diffstat (limited to 'libibex/hash.c')
-rw-r--r-- | libibex/hash.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/libibex/hash.c b/libibex/hash.c index 02e01a1ae0..a36bef33b0 100644 --- a/libibex/hash.c +++ b/libibex/hash.c @@ -86,6 +86,9 @@ struct _hashblock { #define hb_keys hashblock_u.keys #define hb_keydata hashblock_u.keydata +/* size of block overhead + 2 key block overhead */ +#define MAX_KEYLEN (BLOCK_SIZE - 4 - 12 - 12) + /* root block for a hash index */ struct _hashroot { hashid_t free; /* free list */ @@ -241,6 +244,10 @@ hash_find(struct _IBEXIndex *index, const char *key, int keylen) d(printf("finding hash %.*s\n", keylen, key)); + /* truncate the key to the maximum size */ + if (keylen > MAX_KEYLEN) + keylen = MAX_KEYLEN; + hashroot = (struct _hashroot *)ibex_block_read(index->blocks, index->root); /* find the table containing this entry */ @@ -353,6 +360,10 @@ hash_remove(struct _IBEXIndex *index, const char *key, int keylen) d(printf("removing hash %.*s\n", keylen, key)); + /* truncate the key to the maximum size */ + if (keylen > MAX_KEYLEN) + keylen = MAX_KEYLEN; + hashroot = (struct _hashroot *)ibex_block_read(index->blocks, index->root); /* find the table containing this entry */ @@ -475,6 +486,10 @@ hash_insert(struct _IBEXIndex *index, const char *key, int keylen) g_assert(index != 0); g_assert(index->root != 0); + /* truncate the key to the maximum size */ + if (keylen > MAX_KEYLEN) + keylen = MAX_KEYLEN; + d(printf("inserting hash %.*s\n", keylen, key)); hashroot = (struct _hashroot *)ibex_block_read(index->blocks, index->root); |