From e33c909174dcd94efdfe7f3e125983bbd453ccb6 Mon Sep 17 00:00:00 2001 From: whydoubt Date: Wed, 25 Aug 2004 02:42:53 +0000 Subject: [PATCH] Fix bug in storing variable-length field offsets --- ChangeLog | 1 + src/libmdb/write.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6c7b24a..b927389 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ Tue Aug 24 21:04:17 CDT 2004 Jeff Smith * include/mdbsql.h: * src/sql/mdbsql.c: Tidy up a few SQL-related functions * src/libmdb/iconv.c: Tighten packing of strings into rows + * src/libmdb/write.c: Fix bug in storing variable-length field offsets Sat Aug 21 21:21:56 CDT 2004 Jeff Smith * src/libmdb/file.c: Clean up a bug in the new mdb_get_single/double diff --git a/src/libmdb/write.c b/src/libmdb/write.c index bc69a4d..df16d42 100644 --- a/src/libmdb/write.c +++ b/src/libmdb/write.c @@ -423,9 +423,11 @@ mdb_pack_row4(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fi pos += 2; /* Offsets of the variable-length columns */ - for (i=num_fields; i>num_fields-var_cols; i--) { - row_buffer[pos++] = fields[i-1].offset & 0xff; - row_buffer[pos++] = (fields[i-1].offset >> 8) & 0xff; + for (i=num_fields; i>0; i--) { + if (!fields[i-1].is_fixed) { + row_buffer[pos++] = fields[i-1].offset & 0xff; + row_buffer[pos++] = (fields[i-1].offset >> 8) & 0xff; + } } /* Number of variable-length columns */ row_buffer[pos++] = var_cols & 0xff; @@ -468,10 +470,14 @@ mdb_pack_row3(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fi row_buffer[pos] = pos; pos++; - for (i=num_fields;i>num_fields-var_cols;i--) { - row_buffer[pos++] = fields[i-1].offset % 256; + for (i=num_fields; i>0; i--) { + if (!fields[i-1].is_fixed) { + row_buffer[pos++] = fields[i-1].offset & 0xff; + } } + /* FIXME: jump table goes here */ + row_buffer[pos++] = var_cols; pos += mdb_pack_null_mask(&row_buffer[pos], num_fields, fields);