diff --git a/include/mdbtools.h b/include/mdbtools.h index 6783d92..918ea23 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -268,17 +268,19 @@ typedef struct { unsigned int cur_pos; unsigned char pg_buf[MDB_PGSIZE]; unsigned char alt_pg_buf[MDB_PGSIZE]; + MdbFormatConstants *fmt; + char date_fmt[64]; + const char *boolean_false_value; + const char *boolean_true_value; unsigned int num_catalog; + + // Non-cloneable fields start here GPtrArray *catalog; MdbBackend *default_backend; char *backend_name; struct S_MdbTableDef *relationships_table; char *relationships_values[5]; - MdbFormatConstants *fmt; MdbStatistics *stats; - char date_fmt[64]; - const char *boolean_false_value; - const char *boolean_true_value; GHashTable *backends; #ifdef HAVE_ICONV iconv_t iconv_in; diff --git a/src/libmdb/file.c b/src/libmdb/file.c index 6f5f637..b88ea96 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -17,6 +17,7 @@ */ #include +#include #include "mdbtools.h" /* @@ -323,18 +324,20 @@ MdbHandle *mdb_clone_handle(MdbHandle *mdb) unsigned int i; newmdb = (MdbHandle *) g_memdup(mdb, sizeof(MdbHandle)); - newmdb->stats = NULL; + + memset(newmdb + offsetof(MdbHandle, catalog), 0, + sizeof(MdbHandle) - offsetof(MdbHandle, catalog)); + newmdb->catalog = g_ptr_array_new(); for (i=0;inum_catalog;i++) { entry = g_ptr_array_index(mdb->catalog,i); data = g_memdup(entry,sizeof(MdbCatalogEntry)); + data->mdb = newmdb; data->props = NULL; g_ptr_array_add(newmdb->catalog, data); } + mdb_iconv_init(newmdb); - newmdb->backends = NULL; - newmdb->backend_name = NULL; - newmdb->default_backend = NULL; mdb_set_default_backend(newmdb, mdb->backend_name); if (mdb->f) {