diff --git a/src/migration/mdb/3rdparty/mdbtools/include/mdbtools.h b/src/migration/mdb/3rdparty/mdbtools/include/mdbtools.h --- a/src/migration/mdb/3rdparty/mdbtools/include/mdbtools.h +++ b/src/migration/mdb/3rdparty/mdbtools/include/mdbtools.h @@ -27,7 +27,9 @@ #include #include #include +#ifndef _WIN32 #include +#endif #include #include #include @@ -54,14 +56,21 @@ #define MDB_NO_BACKENDS 1 #define MDB_NO_STATS 1 -#ifdef _MSC_VER -#define MDB_DEPRECATED(type, funcname) type funcname +#ifdef _WIN32 +#if BUILDING_LIBMDB +#define LIBMDB_DLL __declspec(dllexport) +#else +#define LIBMDB_DLL __declspec(dllimport) +#endif +#else +#define LIBMDB_DLL +#endif + +#ifndef _WIN32 +#define MDB_DEPRECATED(type, func) type __attribute__((deprecated)) func #else -// Theses 2 atrbutes are not supported by all compilers: -// M$VC see http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc -#define MDB_DEPRECATED(type, funcname) type __attribute__((deprecated)) funcname +#define MDB_DEPRECATED(type, func) __declspec(deprecated) type func #endif -#define MDB_CONSTRUCTOR(funcname) void __attribute__((constructor)) funcname() enum { MDB_PAGE_DB = 0, @@ -205,6 +214,24 @@ unsigned char needs_quotes; } MdbBackendType; +enum { + MDB_BACKEND_ACCESS = 1, + MDB_BACKEND_ORACLE, + MDB_BACKEND_SYBASE, + MDB_BACKEND_POSTGRES, + MDB_BACKEND_MYSQL, + MDB_BACKEND_SQLITE, +}; + +enum { + MDB_BACKEND_ACCESS = 1, + MDB_BACKEND_ORACLE, + MDB_BACKEND_SYBASE, + MDB_BACKEND_POSTGRES, + MDB_BACKEND_MYSQL, + MDB_BACKEND_SQLITE, +}; + typedef struct { guint32 capabilities; /* see MDB_SHEXP_* */ MdbBackendType *types_table; @@ -250,6 +277,11 @@ } MdbFile; /* offset to row count on data pages...version dependant */ +#ifdef _WIN64 +typedef __int64 ssize_t; +#elif defined _WIN32 +typedef _W64 int ssize_t; +#endif typedef struct { ssize_t pg_size; guint16 row_count_offset; @@ -451,76 +483,81 @@ } MdbSarg; /* mem.c */ -extern MDB_DEPRECATED(void, mdb_init()); -extern MDB_DEPRECATED(void, mdb_exit()); +extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_init()); +extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_exit()); +/* glib - to allow static linking of glib in mdbtools */ +extern LIBMDB_DLL void mdb_g_free (gpointer mem); +extern LIBMDB_DLL gpointer mdb_g_malloc (gsize n_bytes); +extern LIBMDB_DLL gpointer mdb_g_malloc0 (gsize n_bytes); /* file.c */ -extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg); -extern ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg); -extern unsigned char mdb_get_byte(void *buf, int offset); -extern int mdb_get_int16(void *buf, int offset); -extern long mdb_get_int32(void *buf, int offset); -extern long mdb_get_int32_msb(void *buf, int offset); -extern float mdb_get_single(void *buf, int offset); -extern double mdb_get_double(void *buf, int offset); -extern unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset); -extern int mdb_pg_get_int16(MdbHandle *mdb, int offset); -extern long mdb_pg_get_int32(MdbHandle *mdb, int offset); -extern float mdb_pg_get_single(MdbHandle *mdb, int offset); -extern double mdb_pg_get_double(MdbHandle *mdb, int offset); -extern void mdb_set_encoding(MdbHandle *mdb, const char *encoding_name); -extern MdbHandle *mdb_open(const char *filename, MdbFileFlags flags); -extern void mdb_close(MdbHandle *mdb); -extern MdbHandle *mdb_clone_handle(MdbHandle *mdb); -extern void mdb_swap_pgbuf(MdbHandle *mdb); +extern LIBMDB_DLL ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg); +extern LIBMDB_DLL ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg); +extern LIBMDB_DLL unsigned char mdb_get_byte(void *buf, int offset); +extern LIBMDB_DLL int mdb_get_int16(char *buf, int offset); +extern LIBMDB_DLL long mdb_get_int32(char *buf, int offset); +extern LIBMDB_DLL long mdb_get_int32_msb(char *buf, int offset); +extern LIBMDB_DLL float mdb_get_single(char *buf, int offset); +extern LIBMDB_DLL double mdb_get_double(char *buf, int offset); +extern LIBMDB_DLL unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset); +extern LIBMDB_DLL int mdb_pg_get_int16(MdbHandle *mdb, int offset); +extern LIBMDB_DLL long mdb_pg_get_int32(MdbHandle *mdb, int offset); +extern LIBMDB_DLL float mdb_pg_get_single(MdbHandle *mdb, int offset); +extern LIBMDB_DLL double mdb_pg_get_double(MdbHandle *mdb, int offset); +extern LIBMDB_DLL void mdb_set_encoding(MdbHandle *mdb, const char *encoding_name); +extern LIBMDB_DLL MdbHandle *mdb_open(const char *filename, MdbFileFlags flags); +extern LIBMDB_DLL void mdb_close(MdbHandle *mdb); +extern LIBMDB_DLL MdbHandle *mdb_clone_handle(MdbHandle *mdb); +extern LIBMDB_DLL void mdb_swap_pgbuf(MdbHandle *mdb); /* catalog.c */ -extern void mdb_free_catalog(MdbHandle *mdb); -extern GPtrArray *mdb_read_catalog(MdbHandle *mdb, int obj_type); +extern LIBMDB_DLL void mdb_free_catalog(MdbHandle *mdb); +extern LIBMDB_DLL GPtrArray *mdb_read_catalog(MdbHandle *mdb, int obj_type); MdbCatalogEntry *mdb_get_catalogentry_by_name(MdbHandle *mdb, const gchar* name); -extern void mdb_dump_catalog(MdbHandle *mdb, int obj_type); -extern const char *mdb_get_objtype_string(int obj_type); +extern LIBMDB_DLL void mdb_dump_catalog(MdbHandle *mdb, int obj_type); +extern LIBMDB_DLL const char *mdb_get_objtype_string(int obj_type); /* table.c */ -extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry); -extern void mdb_free_tabledef(MdbTableDef *table); -extern MdbTableDef *mdb_read_table(MdbCatalogEntry *entry); -extern MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type); -extern void mdb_append_column(GPtrArray *columns, MdbColumn *in_col); -extern void mdb_free_columns(GPtrArray *columns); -extern GPtrArray *mdb_read_columns(MdbTableDef *table); -extern void mdb_table_dump(MdbCatalogEntry *entry); -extern guint8 read_pg_if_8(MdbHandle *mdb, int *cur_pos); -extern guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos); -extern guint32 read_pg_if_32(MdbHandle *mdb, int *cur_pos); -extern void *read_pg_if_n(MdbHandle *mdb, void *buf, int *cur_pos, size_t len); -extern int mdb_is_user_table(MdbCatalogEntry *entry); -extern int mdb_is_system_table(MdbCatalogEntry *entry); -extern const char *mdb_table_get_prop(const MdbTableDef *table, const gchar *key); -extern const char *mdb_col_get_prop(const MdbColumn *col, const gchar *key); +extern LIBMDB_DLL MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry); +extern LIBMDB_DLL void mdb_free_tabledef(MdbTableDef *table); +extern LIBMDB_DLL MdbTableDef *mdb_read_table(MdbCatalogEntry *entry); +extern LIBMDB_DLL MdbTableDef *mdb_read_table_by_name(MdbHandle *mdb, gchar *table_name, int obj_type); +extern LIBMDB_DLL void mdb_append_column(GPtrArray *columns, MdbColumn *in_col); +extern LIBMDB_DLL void mdb_free_columns(GPtrArray *columns); +extern LIBMDB_DLL GPtrArray *mdb_read_columns(MdbTableDef *table); +extern LIBMDB_DLL void mdb_table_dump(MdbCatalogEntry *entry); +extern LIBMDB_DLL guint8 read_pg_if_8(MdbHandle *mdb, int *cur_pos); +extern LIBMDB_DLL guint16 read_pg_if_16(MdbHandle *mdb, int *cur_pos); +extern LIBMDB_DLL guint32 read_pg_if_32(MdbHandle *mdb, int *cur_pos); +extern LIBMDB_DLL void *read_pg_if_n(MdbHandle *mdb, char *buf, int *cur_pos, size_t len); +extern LIBMDB_DLL int mdb_is_user_table(MdbCatalogEntry *entry); +extern LIBMDB_DLL int mdb_is_system_table(MdbCatalogEntry *entry); +extern LIBMDB_DLL const char *mdb_table_get_prop(const MdbTableDef *table, const gchar *key); +extern LIBMDB_DLL const char *mdb_col_get_prop(const MdbColumn *col, const gchar *key); /* data.c */ -extern int mdb_bind_column_by_name(MdbTableDef *table, const gchar *col_name, void *bind_ptr, int *len_ptr); -extern void mdb_data_dump(MdbTableDef *table); -extern void mdb_date_to_tm(double td, struct tm *t); -extern void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr, int *len_ptr); -extern int mdb_rewind_table(MdbTableDef *table); -extern int mdb_fetch_row(MdbTableDef *table); -extern int mdb_is_fixed_col(MdbColumn *col); -extern char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int size); -extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len); -extern int mdb_find_row(MdbHandle *mdb, int row, int *start, size_t *len); -extern int mdb_find_end_of_row(MdbHandle *mdb, int row); -extern int mdb_col_fixed_size(MdbColumn *col); -extern int mdb_col_disp_size(MdbColumn *col); -extern size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr); -extern size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size); -extern void* mdb_ole_read_full(MdbHandle *mdb, MdbColumn *col, size_t *size); -extern void mdb_set_date_fmt(const char *); -extern int mdb_read_row(MdbTableDef *table, unsigned int row); +extern LIBMDB_DLL int mdb_bind_column_by_name(MdbTableDef *table, const gchar *col_name, void *bind_ptr, int *len_ptr); +extern LIBMDB_DLL void mdb_data_dump(MdbTableDef *table); +extern LIBMDB_DLL void mdb_date_to_tm(double td, struct tm *t); +extern LIBMDB_DLL void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr, int *len_ptr); +extern LIBMDB_DLL int mdb_rewind_table(MdbTableDef *table); +extern LIBMDB_DLL int mdb_fetch_row(MdbTableDef *table); +extern LIBMDB_DLL int mdb_is_fixed_col(MdbColumn *col); +extern LIBMDB_DLL char *mdb_col_to_string(MdbHandle *mdb, char *buf, int start, int datatype, int size); +extern LIBMDB_DLL int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, size_t *len); +extern LIBMDB_DLL int mdb_find_row(MdbHandle *mdb, int row, int *start, size_t *len); +extern LIBMDB_DLL int mdb_find_end_of_row(MdbHandle *mdb, int row); +extern LIBMDB_DLL int mdb_col_fixed_size(MdbColumn *col); +extern LIBMDB_DLL int mdb_col_disp_size(MdbColumn *col); +extern LIBMDB_DLL size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr); +extern LIBMDB_DLL size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size); +extern LIBMDB_DLL void* mdb_ole_read_full(MdbHandle *mdb, MdbColumn *col, size_t *size); +extern LIBMDB_DLL void mdb_set_date_fmt(const char *); +extern LIBMDB_DLL void mdb_set_boolean_fmt_words(); +extern LIBMDB_DLL int mdb_read_row(MdbTableDef *table, unsigned int row); /* dump.c */ -extern void mdb_buffer_dump(const void *buf, int start, size_t len); +extern LIBMDB_DLL void mdb_buffer_dump(const void *buf, int start, size_t len); #if !MDB_NO_BACKENDS /* backend.c */ @@ -537,82 +574,82 @@ #endif /* sargs.c */ -extern int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields); -extern int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field); -extern void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data); -extern int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data); -extern int mdb_add_sarg_by_name(MdbTableDef *table, char *colname, MdbSarg *in_sarg); -extern int mdb_test_string(MdbSargNode *node, char *s); -extern int mdb_test_int(MdbSargNode *node, gint32 i); -extern int mdb_add_sarg(MdbColumn *col, MdbSarg *in_sarg); +extern LIBMDB_DLL int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields); +extern LIBMDB_DLL int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, MdbField *field); +extern LIBMDB_DLL void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data); +extern LIBMDB_DLL int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data); +extern LIBMDB_DLL int mdb_add_sarg_by_name(MdbTableDef *table, char *colname, MdbSarg *in_sarg); +extern LIBMDB_DLL int mdb_test_string(MdbSargNode *node, char *s); +extern LIBMDB_DLL int mdb_test_int(MdbSargNode *node, gint32 i); +extern LIBMDB_DLL int mdb_add_sarg(MdbColumn *col, MdbSarg *in_sarg); /* index.c */ -extern GPtrArray *mdb_read_indices(MdbTableDef *table); -extern void mdb_index_dump(MdbTableDef *table, MdbIndex *idx); -extern void mdb_index_scan_free(MdbTableDef *table); -extern int mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg); -extern int mdb_index_find_next(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 *pg, guint16 *row); -extern void mdb_index_hash_text(char *text, char *hash); -extern void mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table); -extern int mdb_index_find_row(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 pg, guint16 row); -extern void mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest); -extern void mdb_free_indices(GPtrArray *indices); +extern LIBMDB_DLL GPtrArray *mdb_read_indices(MdbTableDef *table); +extern LIBMDB_DLL void mdb_index_dump(MdbTableDef *table, MdbIndex *idx); +extern LIBMDB_DLL void mdb_index_scan_free(MdbTableDef *table); +extern LIBMDB_DLL int mdb_index_find_next_on_page(MdbHandle *mdb, MdbIndexPage *ipg); +extern LIBMDB_DLL int mdb_index_find_next(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 *pg, guint16 *row); +extern LIBMDB_DLL void mdb_index_hash_text(char *text, char *hash); +extern LIBMDB_DLL void mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table); +extern LIBMDB_DLL int mdb_index_find_row(MdbHandle *mdb, MdbIndex *idx, MdbIndexChain *chain, guint32 pg, guint16 row); +extern LIBMDB_DLL void mdb_index_swap_n(unsigned char *src, int sz, unsigned char *dest); +extern LIBMDB_DLL void mdb_free_indices(GPtrArray *indices); void mdb_index_page_reset(MdbIndexPage *ipg); -extern int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg); +extern LIBMDB_DLL int mdb_index_pack_bitmap(MdbHandle *mdb, MdbIndexPage *ipg); #if !MDB_NO_STATS /* stats.c */ -extern void mdb_stats_on(MdbHandle *mdb); -extern void mdb_stats_off(MdbHandle *mdb); -extern void mdb_dump_stats(MdbHandle *mdb); +extern LIBMDB_DLL void mdb_stats_on(MdbHandle *mdb); +extern LIBMDB_DLL void mdb_stats_off(MdbHandle *mdb); +extern LIBMDB_DLL void mdb_dump_stats(MdbHandle *mdb); #endif /* like.c */ -extern int mdb_like_cmp(char *s, char *r); +extern LIBMDB_DLL int mdb_like_cmp(char *s, char *r); /* write.c */ -extern void mdb_put_int16(void *buf, guint32 offset, guint32 value); -extern void mdb_put_int32(void *buf, guint32 offset, guint32 value); -extern void mdb_put_int32_msb(void *buf, guint32 offset, guint32 value); -extern int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields); -extern guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size); -extern int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum); -extern int mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields); -extern int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields); -extern int mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size); -extern int mdb_pg_get_freespace(MdbHandle *mdb); -extern int mdb_update_row(MdbTableDef *table); -extern void *mdb_new_data_pg(MdbCatalogEntry *entry); +extern LIBMDB_DLL void mdb_put_int16(char *buf, guint32 offset, guint32 value); +extern LIBMDB_DLL void mdb_put_int32(char *buf, guint32 offset, guint32 value); +extern LIBMDB_DLL void mdb_put_int32_msb(char *buf, guint32 offset, guint32 value); +extern LIBMDB_DLL int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields); +extern LIBMDB_DLL guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size); +extern LIBMDB_DLL int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum); +extern LIBMDB_DLL int mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields); +extern LIBMDB_DLL int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields); +extern LIBMDB_DLL int mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size); +extern LIBMDB_DLL int mdb_pg_get_freespace(MdbHandle *mdb); +extern LIBMDB_DLL int mdb_update_row(MdbTableDef *table); +extern LIBMDB_DLL void *mdb_new_data_pg(MdbCatalogEntry *entry); /* map.c */ -extern guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size); -extern gint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int map_sz, guint32 start_pg); +extern LIBMDB_DLL guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size); +extern LIBMDB_DLL gint32 mdb_map_find_next(MdbHandle *mdb, unsigned char *map, unsigned int map_sz, guint32 start_pg); /* props.c */ -extern void mdb_free_props(MdbProperties *props); -extern void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name); -extern GArray* mdb_kkd_to_props(MdbHandle *mdb, void *kkd, size_t len); +extern LIBMDB_DLL void mdb_free_props(MdbProperties *props); +extern LIBMDB_DLL void mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name); +extern LIBMDB_DLL GArray* mdb_kkd_to_props(MdbHandle *mdb, char *kkd, size_t len); /* worktable.c */ -extern MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name); -extern void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col); -extern void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed); -extern void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column); -extern void mdb_temp_columns_end(MdbTableDef *table); +extern LIBMDB_DLL MdbTableDef *mdb_create_temp_table(MdbHandle *mdb, char *name); +extern LIBMDB_DLL void mdb_temp_table_add_col(MdbTableDef *table, MdbColumn *col); +extern LIBMDB_DLL void mdb_fill_temp_col(MdbColumn *tcol, char *col_name, int col_size, int col_type, int is_fixed); +extern LIBMDB_DLL void mdb_fill_temp_field(MdbField *field, void *value, int siz, int is_fixed, int is_null, int start, int column); +extern LIBMDB_DLL void mdb_temp_columns_end(MdbTableDef *table); /* options.c */ -extern int mdb_get_option(unsigned long optnum); -extern void mdb_debug(int klass, const char *fmt, ...); +extern LIBMDB_DLL int mdb_get_option(unsigned long optnum); +extern LIBMDB_DLL void mdb_debug(int klass, const char *fmt, ...); /* iconv.c */ -extern int mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); -extern int mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); -extern void mdb_iconv_init(MdbHandle *mdb); -extern void mdb_iconv_close(MdbHandle *mdb); -extern const char* mdb_target_charset(MdbHandle *mdb); +extern LIBMDB_DLL int mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); +extern LIBMDB_DLL int mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); +extern LIBMDB_DLL void mdb_iconv_init(MdbHandle *mdb); +extern LIBMDB_DLL void mdb_iconv_close(MdbHandle *mdb); +extern LIBMDB_DLL const char* mdb_target_charset(MdbHandle *mdb); #ifdef __cplusplus } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/catalog.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/catalog.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/catalog.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/catalog.c @@ -147,7 +147,7 @@ for (i=0; inum_catalog; i++) { entry = g_ptr_array_index(mdb->catalog, i); - if (!strcasecmp(entry->object_name, name)) + if (!g_ascii_strcasecmp(entry->object_name, name)) return entry; } return NULL; diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/data.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/data.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/data.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/data.c @@ -31,7 +31,7 @@ static int _mdb_attempt_bind(MdbHandle *mdb, MdbColumn *col, unsigned char isnull, int offset, int len); -static char *mdb_date_to_string(MdbHandle *mdb, int start); +static char *mdb_date_to_string(void *buf, int start); #ifdef MDB_COPY_OLE static size_t mdb_copy_ole(MdbHandle *mdb, void *dest, int start, int size); #endif @@ -44,6 +44,25 @@ strncpy(date_fmt, fmt, 63); } +/* Some databases (eg PostgreSQL) do not understand integer 0/1 values + * as TRUE/FALSE, so provide a means to override the values used to be + * the SQL Standard TRUE/FALSE values. + */ +static char boolean_false_number[] = "0"; +static char boolean_true_number[] = "1"; + +static char boolean_false_word[] = "FALSE"; +static char boolean_true_word[] = "TRUE"; + +static char *boolean_false_value = boolean_false_number; +static char *boolean_true_value = boolean_true_number; + +void mdb_set_boolean_fmt_words() +{ + boolean_false_value = boolean_false_word; + boolean_true_value = boolean_true_word; +} + void mdb_bind_column(MdbTableDef *table, int col_num, void *bind_ptr, int *len_ptr) { MdbColumn *col; @@ -67,7 +86,7 @@ for (i=0;inum_cols;i++) { col=g_ptr_array_index(table->columns,i); - if (!strcasecmp(col->name,col_name)) { + if (!g_ascii_strcasecmp(col->name,col_name)) { col_num = i + 1; if (bind_ptr) col->bind_ptr = bind_ptr; @@ -90,7 +109,7 @@ * * Returns: 0 on success. 1 on failure. */ -int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len) +int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, size_t *len) { unsigned int pg = pg_row >> 8; unsigned int row = pg_row & 0xff; @@ -100,7 +119,7 @@ mdb_swap_pgbuf(mdb); mdb_find_row(mdb, row, off, len); mdb_swap_pgbuf(mdb); - *buf = mdb->alt_pg_buf; + *buf =(char *)mdb->alt_pg_buf; return 0; } @@ -111,9 +130,9 @@ if (row > 1000) return -1; - *start = mdb_get_int16(mdb->pg_buf, rco + 2 + row*2); + *start = mdb_get_int16((char *)mdb->pg_buf, rco + 2 + row*2); next_start = (row == 0) ? mdb->fmt->pg_size : - mdb_get_int16(mdb->pg_buf, rco + row*2) & OFFSET_MASK; + mdb_get_int16((char *)mdb->pg_buf, rco + row*2) & OFFSET_MASK; *len = next_start - (*start & OFFSET_MASK); return 0; } @@ -128,7 +147,7 @@ if (row > 1000) return -1; row_end = (row == 0) ? mdb->fmt->pg_size : - mdb_get_int16(mdb->pg_buf, rco + row*2) & OFFSET_MASK; + mdb_get_int16((char *)mdb->pg_buf, rco + row*2) & OFFSET_MASK; #else /* Search the previous "row start" values for the first non-'lookupflag' * one. If we don't find one, then the end of the page is the correct @@ -168,10 +187,11 @@ { col->cur_value_len = value; if (col->bind_ptr) { - strcpy(col->bind_ptr, value ? "0" : "1"); + strcpy(col->bind_ptr, + value ? boolean_false_value : boolean_true_value); } if (col->len_ptr) { - *col->len_ptr = 1; + *col->len_ptr = strlen(col->bind_ptr); } return 1; @@ -225,7 +245,7 @@ if (col->col_type == MDB_NUMERIC) { str = mdb_numeric_to_string(mdb, start, col->col_prec, col->col_scale); } else { - str = mdb_col_to_string(mdb, mdb->pg_buf, start, col->col_type, len); + str = mdb_col_to_string(mdb, (char *)mdb->pg_buf, start, col->col_type, len); } strcpy(col->bind_ptr, str); g_free(str); @@ -337,22 +357,22 @@ } table->cur_phys_pg = next_pg; - if (mdb->pg_buf[0]==MDB_PAGE_DATA && mdb_get_int32(mdb->pg_buf, 4)==entry->table_pg) + if (mdb->pg_buf[0]==MDB_PAGE_DATA && mdb_get_int32((char *)mdb->pg_buf, 4)==entry->table_pg) return table->cur_phys_pg; /* On rare occasion, mdb_map_find_next will return a wrong page */ /* Found in a big file, over 4,000,000 records */ fprintf(stderr, "warning: page %d from map doesn't match: Type=%d, buf[4..7]=%ld Expected table_pg=%ld\n", - next_pg, mdb->pg_buf[0], mdb_get_int32(mdb->pg_buf, 4), entry->table_pg); + next_pg, mdb->pg_buf[0], mdb_get_int32((char *)mdb->pg_buf, 4), entry->table_pg); } fprintf(stderr, "Warning: defaulting to brute force read\n"); #endif /* can't do a fast read, go back to the old way */ do { if (!mdb_read_pg(mdb, table->cur_phys_pg++)) return 0; - } while (mdb->pg_buf[0]!=MDB_PAGE_DATA || mdb_get_int32(mdb->pg_buf, 4)!=entry->table_pg); + } while (mdb->pg_buf[0]!=MDB_PAGE_DATA || mdb_get_int32((char *)mdb->pg_buf, 4)!=entry->table_pg); /* fprintf(stderr,"returning new page %ld\n", table->cur_phys_pg); */ return table->cur_phys_pg; } @@ -407,7 +427,7 @@ } mdb_read_pg(mdb, pg); } else { - rows = mdb_get_int16(mdb->pg_buf,fmt->row_count_offset); + rows = mdb_get_int16((char *)mdb->pg_buf, fmt->row_count_offset); /* if at end of page, find a new data page */ if (table->cur_row >= rows) { @@ -473,7 +493,7 @@ mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr) { guint32 ole_len; - void *buf; + char *buf; int row_start; size_t len; @@ -497,16 +517,16 @@ mdb_debug(MDB_DEBUG_OLE,"start %d len %d", row_start, len); if (col->bind_ptr) - memcpy(col->bind_ptr, (char*)buf + row_start + 4, len - 4); + memcpy(col->bind_ptr, buf + row_start + 4, len - 4); col->cur_blob_pg_row = mdb_get_int32(buf, row_start); return len - 4; } size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size) { guint32 ole_len; - void *buf; + char *buf; int row_start; size_t len; @@ -542,12 +562,12 @@ mdb_debug(MDB_DEBUG_OLE,"start %d len %d", row_start, len); if (col->bind_ptr) { - memcpy(col->bind_ptr, (char*)buf + row_start, len); + memcpy(col->bind_ptr, buf + row_start, len); if (mdb_get_option(MDB_DEBUG_OLE)) mdb_buffer_dump(col->bind_ptr, 0, 16); } return len; - } else if ((ole_len & 0xff000000) == 0) { + } else if ((ole_len & 0xf0000000) == 0) { col->cur_blob_pg_row = mdb_get_int32(ole_ptr, 4); mdb_debug(MDB_DEBUG_OLE,"ole row = %d ole pg = %ld", col->cur_blob_pg_row & 0xff, @@ -560,7 +580,7 @@ mdb_debug(MDB_DEBUG_OLE,"start %d len %d", row_start, len); if (col->bind_ptr) - memcpy(col->bind_ptr, (char*)buf + row_start + 4, len - 4); + memcpy(col->bind_ptr, buf + row_start + 4, len - 4); col->cur_blob_pg_row = mdb_get_int32(buf, row_start); mdb_debug(MDB_DEBUG_OLE, "next pg_row %d", col->cur_blob_pg_row); @@ -608,7 +628,7 @@ guint32 ole_len; gint32 row_start, pg_row; size_t len; - void *buf, *pg_buf = mdb->pg_buf; + char *buf, *pg_buf = mdb->pg_buf; if (sizepg_buf; + char *buf, *pg_buf = (char *)mdb->pg_buf; char *text = (char *) g_malloc(MDB_BIND_SIZE); if (size memo_len) { + if (tmpoff + len - 4 > memo_len) break; - } - memcpy(tmp + tmpoff, (char*)buf + row_start + 4, len - 4); + + /* Stop processing on zero length multiple page memo fields */ + if (!len) + break; + + memcpy(tmp + tmpoff, buf + row_start + 4, len - 4); tmpoff += len - 4; } while (( pg_row = mdb_get_int32(buf, row_start) )); if (tmpoff < memo_len) { @@ -827,11 +851,11 @@ } static char * -mdb_date_to_string(MdbHandle *mdb, int start) +mdb_date_to_string(void *buf, int start) { struct tm t; char *text = (char *) g_malloc(MDB_BIND_SIZE); - double td = mdb_get_double(mdb->pg_buf, start); + double td = mdb_get_double(buf, start); mdb_date_to_tm(td, &t); @@ -846,14 +870,14 @@ char *text = NULL; unsigned short uuid1, uuid2, uuid3, uuid4, uuid5, uuid6, uuid7, uuid8; - uuid1 = mdb_get_int16(mdb->pg_buf, start); - uuid2 = mdb_get_int16(mdb->pg_buf, start + 2); - uuid3 = mdb_get_int16(mdb->pg_buf, start + 4); - uuid4 = mdb_get_int16(mdb->pg_buf, start + 6); - uuid5 = mdb_get_int16(mdb->pg_buf, start + 8); - uuid6 = mdb_get_int16(mdb->pg_buf, start + 10); - uuid7 = mdb_get_int16(mdb->pg_buf, start + 12); - uuid8 = mdb_get_int16(mdb->pg_buf, start + 14); + uuid1 = mdb_get_int16((char *)mdb->pg_buf, start); + uuid2 = mdb_get_int16((char *)mdb->pg_buf, start + 2); + uuid3 = mdb_get_int16((char *)mdb->pg_buf, start + 4); + uuid4 = mdb_get_int16((char *)mdb->pg_buf, start + 6); + uuid5 = mdb_get_int16((char *)mdb->pg_buf, start + 8); + uuid6 = mdb_get_int16((char *)mdb->pg_buf, start + 10); + uuid7 = mdb_get_int16((char *)mdb->pg_buf, start + 12); + uuid8 = mdb_get_int16((char *)mdb->pg_buf, start + 14); text = g_strdup_printf("{%04x%04x-%04x-%04x-%04x-%04x%04x%04x}", uuid1, uuid2, uuid3, uuid4, uuid5, uuid6, uuid7, uuid8); @@ -892,7 +916,7 @@ } #endif -char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int size) +char *mdb_col_to_string(MdbHandle *mdb, char *buf, int start, int datatype, int size) { char *text = NULL; float tf; @@ -928,20 +952,20 @@ text = g_strdup(""); } else { text = g_malloc(size); - memcpy((char*)buf+start, text, size); + memcpy(text, buf+start, size); } break; case MDB_TEXT: if (size<0) { text = g_strdup(""); } else { text = (char *) g_malloc(MDB_BIND_SIZE); - mdb_unicode2ascii(mdb, (char*)buf + start, + mdb_unicode2ascii(mdb, buf + start, size, text, MDB_BIND_SIZE); } break; case MDB_DATETIME: - text = mdb_date_to_string(mdb, start); + text = mdb_date_to_string(buf, start); break; case MDB_MEMO: text = mdb_memo_to_string(mdb, start, size); diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/file.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/file.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/file.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/file.c @@ -16,7 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include "mdbtools.h" #ifdef DMALLOC @@ -250,7 +249,7 @@ mdb_close(mdb); return NULL; } - mdb->f->jet_version = mdb_get_int32(mdb->pg_buf, 0x14); + mdb->f->jet_version = mdb_get_int32((char *)mdb->pg_buf, 0x14); switch(mdb->f->jet_version) { case MDB_VER_JET3: mdb->fmt = &MdbJet3Constants; @@ -265,7 +264,7 @@ mdb_close(mdb); return NULL; } - mdb->f->db_key = mdb_get_int32(mdb->pg_buf, 0x3e); + mdb->f->db_key = mdb_get_int32((char *)mdb->pg_buf, 0x3e); /* I don't know if this value is valid for some versions? * it doesn't seem to be valid for the databases I have * @@ -276,7 +275,7 @@ if (mdb->f->db_key) { /* write is not supported for encrypted files yet */ mdb->f->writable = FALSE; - /* that should be enought, but reopen the file read only just to be + /* that should be enough, but reopen the file read only just to be * sure we don't write invalid data */ close(mdb->f->fd); open_flags = O_RDONLY; @@ -293,7 +292,7 @@ /* get the db password located at 0x42 bytes into the file */ for (pos=0;pos<14;pos++) { - j = mdb_get_int32(mdb->pg_buf, 0x42+pos); + j = mdb_get_int32((char *)mdb->pg_buf, 0x42+pos); j ^= key[pos]; if ( j != 0) mdb->f->db_passwd[pos] = j; @@ -414,7 +413,7 @@ return 0; } if (status.st_size < offset) { - fprintf(stderr,"offset %jd is beyond EOF\n",(intmax_t)offset); + fprintf(stderr,"offset %jd is beyond EOF\n",offset); return 0; } #if !MDB_NO_STATS @@ -469,64 +468,64 @@ return mdb->pg_buf[offset]; } -int mdb_get_int16(void *buf, int offset) +int mdb_get_int16(char *buf, int offset) { guint16 l; - memcpy(&l, (char*)buf + offset, 2); + memcpy(&l, buf + offset, 2); return (int)GUINT16_FROM_LE(l); } int mdb_pg_get_int16(MdbHandle *mdb, int offset) { if (offset < 0 || (offset+2) > (int)mdb->fmt->pg_size) return -1; mdb->cur_pos+=2; - return mdb_get_int16(mdb->pg_buf, offset); + return mdb_get_int16((char *)mdb->pg_buf, offset); } -long mdb_get_int32_msb(void *buf, int offset) +long mdb_get_int32_msb(char *buf, int offset) { gint32 l; - memcpy(&l, (char*)buf + offset, 4); + memcpy(&l, buf + offset, 4); return (long)GINT32_FROM_BE(l); } -long mdb_get_int32(void *buf, int offset) +long mdb_get_int32(char *buf, int offset) { gint32 l; - memcpy(&l, (char*)buf + offset, 4); + memcpy(&l, buf + offset, 4); return (long)GINT32_FROM_LE(l); } long mdb_pg_get_int32(MdbHandle *mdb, int offset) { if (offset <0 || (offset+4) > (int)mdb->fmt->pg_size) return -1; mdb->cur_pos+=4; - return mdb_get_int32(mdb->pg_buf, offset); + return mdb_get_int32((char *)mdb->pg_buf, offset); } -float mdb_get_single(void *buf, int offset) +float mdb_get_single(char *buf, int offset) { union {guint32 g; float f;} f; - memcpy(&f, (char*)buf + offset, 4); + memcpy(&f, buf + offset, 4); f.g = GUINT32_FROM_LE(f.g); return f.f; } float mdb_pg_get_single(MdbHandle *mdb, int offset) { if (offset <0 || (offset+4) > (int)mdb->fmt->pg_size) return -1; mdb->cur_pos+=4; - return mdb_get_single(mdb->pg_buf, offset); + return mdb_get_single((char *)mdb->pg_buf, offset); } -double mdb_get_double(void *buf, int offset) +double mdb_get_double(char *buf, int offset) { union {guint64 g; double d;} d; - memcpy(&d, (char*)buf + offset, 8); + memcpy(&d, buf + offset, 8); d.g = GUINT64_FROM_LE(d.g); return d.d; } double mdb_pg_get_double(MdbHandle *mdb, int offset) { if (offset <0 || (offset+8) > (int)mdb->fmt->pg_size) return -1; mdb->cur_pos+=8; - return mdb_get_double(mdb->pg_buf, offset); + return mdb_get_double((char *)mdb->pg_buf, offset); } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/iconv.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/iconv.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/iconv.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/iconv.c @@ -47,7 +47,7 @@ unsigned int compress=1; src += 2; slen -= 2; - tmp = (char *)g_malloc(slen*2); + tmp = g_malloc(slen*2); while (slen) { if (*src == 0) { compress = (compress) ? 0 : 1; @@ -74,6 +74,13 @@ //printf("1 len_in %d len_out %d\n",len_in, len_out); while (1) { iconv(mdb->iconv_in, &in_ptr, &len_in, &out_ptr, &len_out); + /* + * Have seen database with odd number of bytes in UCS-2, shouldn't happen but protect against it + */ + if (!IS_JET3(mdb) && len_in<=1) { + //fprintf(stderr, "Detected invalid number of UCS-2 bytes\n"); + break; + } if ((!len_in) || (errno == E2BIG)) break; /* Don't bail if impossible conversion is encountered */ in_ptr += (IS_JET3(mdb)) ? 1 : 2; diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/index.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/index.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/index.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/index.c @@ -60,6 +60,112 @@ 0x81, 0x00, 0x00, 0x00, 'x', 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; +/* JET Red (v4) Index definition byte layouts + * + * Based on: + * + * http://jabakobob.net/mdb/table-page.html + * https://github.com/jahlborn/jackcess + * + * plus inspection of JET (Red) 4 databases. (JET 3 format has fewer + * fields -- some of the ones below omitted, and others narrower.) + * + * See also JET Blue (Extensible Storage Engine) format information: + * + * https://github.com/libyal/libesedb/blob/master/documentation/Extensible%20Storage%20Engine%20%28ESE%29%20Database%20File%20%28EDB%29%20format.asciidoc + * + * which is a later Microsoft embedded database format with the same + * early base format. + * + * ---------------------------------------------------------------------- + * Index Column Definitions: + * - for each "non foreign key" index (ie pidx->index_type!=2), a list + * of columns indexed + * + * Repeated table->num_real_idxs times: + * + * Offset Bytes Meaning + * 0x0000 4 UNKNOWN; seems to be type marker, usually 1923 or 0 + * + * 0x0004 2 Column 1 ID + * 0x0006 1 Column 1 Flags + * 0x0007 2 Column 2 ID + * 0x0009 1 Column 2 Flags + * 0x000A 2 Column 3 ID + * 0x000C 1 Column 3 Flags + * 0x000D 2 Column 4 ID + * 0x000F 1 Column 4 Flags + * 0x0010 2 Column 5 ID + * 0x0012 1 Column 5 Flags + * 0x0013 2 Column 6 ID + * 0x0015 1 Column 6 Flags + * 0x0016 2 Column 7 ID + * 0x0018 1 Column 7 Flags + * 0x0019 2 Column 8 ID + * 0x001B 1 Column 8 Flags + * 0x001C 2 Column 9 ID + * 0x001E 1 Column 9 Flags + * 0x001F 2 Column 10 ID + * 0x0021 1 Column 10 Flags + * + * 0x0022 1 Usage Map row + * 0x0023 3 Usage Map page (24-bit) + * 0x0026 4 First index page + * 0x002A 4 UNKNOWN + * 0x002E 2 Index Flags + * 0x0030 4 UNKNOWN; seems to always be 0 + * 0x0034 + * + * Column ID of 0xFFFF (-1) means "not used" or "end of used columns". + * Column Flags: + * - 0x01 = Ascending + * + * Index Flags: + * - 0x0001 = Unique index + * - 0x0002 = Ignore NULLs + * - 0x0008 = Required Index + * + * ---------------------------------------------------------------------- + * Index Definitions + * - for each index (normal, primary key, foreign key), details on the + * index. + * + * - this appears to be the union of information required for normal/ + * primary key indexes, and the information required for foreign key + * indexes. + * + * Repeated table->num_idxs times: + * + * Offset Bytes Meaning + * 0x0000 4 UNKNOWN; apparently a type marker, usually 1625 or 0 + * 0x0004 4 Logical Index Number + * 0x0008 4 Index Column Definition Entry + * 0x000C 1 FK Index Type + * 0x000D 4 FK Index Number + * 0x0011 4 FK Index Table Page Number + * 0x0015 1 Flags: Update Action + * 0x0016 1 Flags: Delete Action + * 0x0017 1 Index Type + * 0x0018 4 UNKNNOWN; seems to always be 0 + * 0x001B + * + * Where Index Type is: + * 0x01 = normal + * 0x01 = primary key + * 0x02 = foreign key index reference + */ + +/* Debugging helper to dump out raw hex values of index definition */ +/* +static void hexdump(unsigned char *tmpbuf, int size) { + int i; + for (i = 0; i < size; ++i) { + fprintf(stderr, "%02x ", tmpbuf[i]); + } + fprintf(stderr, "\n"); +} +*/ + GPtrArray * mdb_read_indices(MdbTableDef *table) @@ -72,7 +178,7 @@ int key_num, col_num, cleaned_col_num; int cur_pos, name_sz, idx2_sz, type_offset; int index_start_pg = mdb->cur_pg; - gchar *tmpbuf; + char *tmpbuf; table->indices = g_ptr_array_new(); @@ -86,53 +192,76 @@ type_offset = 23; } - //fprintf(stderr, "num_idxs:%d num_real_idxs:%d\n", table->num_idxs, table->num_real_idxs); - /* num_real_idxs should be the number of indexes of type 2. + /* Read in the definitions of table indexes, into table->indices */ + + /* num_real_idxs should be the number of indexes other than type 2. * It's not always the case. Happens on Northwind Orders table. */ + //fprintf(stderr, "num_idxs:%d num_real_idxs:%d\n", table->num_idxs, table->num_real_idxs); + table->num_real_idxs = 0; - tmpbuf = (gchar *) g_malloc(idx2_sz); + tmpbuf = g_malloc(idx2_sz); for (i=0;inum_idxs;i++) { read_pg_if_n(mdb, tmpbuf, &cur_pos, idx2_sz); + //fprintf(stderr, "Index defn: "); + //hexdump((unsigned char *)tmpbuf, idx2_sz); pidx = (MdbIndex *) g_malloc0(sizeof(MdbIndex)); pidx->table = table; pidx->index_num = mdb_get_int16(tmpbuf, 4); pidx->index_type = tmpbuf[type_offset]; g_ptr_array_add(table->indices, pidx); /* { - gint32 dumy0 = mdb_get_int32(tmpbuf, 0); - gint8 dumy1 = tmpbuf[8]; - gint32 dumy2 = mdb_get_int32(tmpbuf, 9); - gint32 dumy3 = mdb_get_int32(tmpbuf, 13); - gint16 dumy4 = mdb_get_int16(tmpbuf, 17); - fprintf(stderr, "idx #%d: num2:%d type:%d\n", i, pidx->index_num, pidx->index_type); - fprintf(stderr, "idx #%d: %d %d %d %d %d\n", i, dumy0, dumy1, dumy2, dumy3, dumy4); + gint32 idx_marker = mdb_get_int32(tmpbuf, 0); + gint32 index_col_def_num = mdb_get_int16(tmpbuf, 8); + gint8 rel_idx_type = tmpbuf[0x0c]; + gint32 rel_idx_number = mdb_get_int32(tmpbuf, 0x0d); + gint32 rel_idx_page = mdb_get_int32(tmpbuf, 0x11); + gint8 update_action_flags = tmpbuf[0x15]; + gint8 delete_action_flags = tmpbuf[0x16]; + fprintf(stderr, "idx #%d: num2:%d num3:%d type:%d\n", i, pidx->index_num, index_col_def_num, pidx->index_type); + fprintf(stderr, "idx #%d: %d %d %d %d %d/%d\n", i, idx_marker, rel_idx_type, rel_idx_number, rel_idx_page, update_action_flags, delete_action_flags); }*/ if (pidx->index_type!=2) table->num_real_idxs++; } //fprintf(stderr, "num_idxs:%d num_real_idxs:%d\n", table->num_idxs, table->num_real_idxs); g_free(tmpbuf); + /* Pick up the names of each index */ for (i=0;inum_idxs;i++) { pidx = g_ptr_array_index (table->indices, i); if (IS_JET3(mdb)) { name_sz=read_pg_if_8(mdb, &cur_pos); } else { name_sz=read_pg_if_16(mdb, &cur_pos); } tmpbuf = g_malloc(name_sz); - read_pg_if_n(mdb, tmpbuf, &cur_pos, name_sz); - mdb_unicode2ascii(mdb, tmpbuf, name_sz, pidx->name, MDB_MAX_OBJ_NAME); + read_pg_if_n(mdb, (char *)tmpbuf, &cur_pos, name_sz); + mdb_unicode2ascii(mdb, (char *)tmpbuf, name_sz, pidx->name, MDB_MAX_OBJ_NAME); g_free(tmpbuf); //fprintf(stderr, "index %d type %d name %s\n", pidx->index_num, pidx->index_type, pidx->name); } + /* Pick up the column definitions for normal/primary key indexes */ + /* NOTE: Match should possibly be by index_col_def_num, rather + * than index_num; but in files encountered both seem to be the + * same (so left with index_num until a counter example is found). + */ mdb_read_alt_pg(mdb, entry->table_pg); mdb_read_pg(mdb, index_start_pg); cur_pos = table->index_start; for (i=0;inum_real_idxs;i++) { + /* Debugging print out, commented out + { + gchar *tmpbuf = (gchar *) g_malloc(0x34); + int now_pos = cur_pos; + read_pg_if_n(mdb, tmpbuf, &now_pos, 0x34); + fprintf(stderr, "Index defn: "); + hexdump((unsigned char *)tmpbuf, 0x34); + g_free(tmpbuf); + }*/ + if (!IS_JET3(mdb)) cur_pos += 4; /* look for index number i */ for (j=0; jnum_idxs; ++j) { @@ -146,18 +275,19 @@ } //fprintf(stderr, "index %d #%d (%s) index_type:%d\n", i, pidx->index_num, pidx->name, pidx->index_type); - pidx->num_rows = mdb_get_int32(mdb->alt_pg_buf, + pidx->num_rows = mdb_get_int32((char *)mdb->alt_pg_buf, fmt->tab_cols_start_offset + (pidx->index_num*fmt->tab_ridx_entry_size)); /* fprintf(stderr, "ridx block1 i:%d data1:0x%08x data2:0x%08x\n", i, - mdb_get_int32(mdb->pg_buf, + (unsigned int)mdb_get_int32(mdb->pg_buf, fmt->tab_cols_start_offset + pidx->index_num * fmt->tab_ridx_entry_size), - mdb_get_int32(mdb->pg_buf, + (unsigned int)mdb_get_int32(mdb->pg_buf, fmt->tab_cols_start_offset + pidx->index_num * fmt->tab_ridx_entry_size +4)); fprintf(stderr, "pidx->num_rows:%d\n", pidx->num_rows);*/ + /* Read columns in each index */ key_num=0; for (j=0;jnum_keys = key_num; - cur_pos += 4; - //fprintf(stderr, "pidx->unknown_pre_first_pg:0x%08x\n", read_pg_if_32(mdb, &cur_pos)); + if (0) // DEBUGGING ONLY + { + gint32 usage_map = read_pg_if_32(mdb, &cur_pos); + fprintf(stderr, "pidx->unknown_pre_first_pg:0x%08x\n", usage_map); + } else { + cur_pos += 4; // Skip Usage map information + } pidx->first_pg = read_pg_if_32(mdb, &cur_pos); + + if (!IS_JET3(mdb)) cur_pos += 4; + pidx->flags = read_pg_if_8(mdb, &cur_pos); //fprintf(stderr, "pidx->first_pg:%d pidx->flags:0x%02x\n", pidx->first_pg, pidx->flags); - if (!IS_JET3(mdb)) cur_pos += 9; + if (!IS_JET3(mdb)) cur_pos += 5; } return NULL; } @@ -490,7 +628,7 @@ //printf("find_next_on_page returned 0\n"); return 0; } - pg = mdb_get_int32_msb(mdb->pg_buf, ipg->offset + ipg->len - 3) >> 8; + pg = mdb_get_int32_msb((char *)mdb->pg_buf, ipg->offset + ipg->len - 3) >> 8; //printf("Looking at pg %lu at %lu %d\n", pg, ipg->offset, ipg->len); ipg->offset += ipg->len; @@ -624,7 +762,7 @@ if (!chain->last_leaf_found) return 0; mdb_read_pg(mdb, chain->last_leaf_found); chain->last_leaf_found = mdb_get_int32( - mdb->pg_buf, 0x0c); + (char *)mdb->pg_buf, 0x0c); //printf("next leaf %lu\n", chain->last_leaf_found); mdb_read_pg(mdb, chain->last_leaf_found); /* reuse the chain for cleanup mode */ @@ -637,7 +775,7 @@ return 0; } } - pg_row = mdb_get_int32_msb(mdb->pg_buf, ipg->offset + ipg->len - 4); + pg_row = mdb_get_int32_msb((char *)mdb->pg_buf, ipg->offset + ipg->len - 4); *row = pg_row & 0xff; *pg = pg_row >> 8; //printf("row = %d pg = %lu ipg->pg = %lu offset = %lu len = %d\n", *row, *pg, ipg->pg, ipg->offset, ipg->len); @@ -706,7 +844,7 @@ return 0; } /* test row and pg */ - datapg_row = mdb_get_int32_msb(mdb->pg_buf, ipg->offset + ipg->len - 4); + datapg_row = mdb_get_int32_msb((char *)mdb->pg_buf, ipg->offset + ipg->len - 4); if (pg_row == datapg_row) { passed = 1; } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/map.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/map.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/map.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/map.c @@ -28,7 +28,7 @@ guint32 pgnum, i, usage_bitlen; unsigned char *usage_bitmap; - pgnum = mdb_get_int32(map, 1); + pgnum = mdb_get_int32((char *)map, 1); usage_bitmap = map + 5; usage_bitlen = (map_sz - 5) * 8; @@ -63,7 +63,7 @@ unsigned char *usage_bitmap; guint32 i, map_pg; - if (!(map_pg = mdb_get_int32(map, (map_ind*4)+1))) { + if (!(map_pg = mdb_get_int32((char *)map, (map_ind*4)+1))) { continue; } if(mdb_read_alt_pg(mdb, map_pg) != mdb->fmt->pg_size) { diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/mem.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/mem.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/mem.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/mem.c @@ -29,3 +29,8 @@ { fprintf(stderr, "mdb_exit() is DEPRECATED and does nothing. Stop calling it.\n"); } + +/* glib - to allow static linking of glib in mdbtools */ +void mdb_g_free (gpointer mem) { g_free(mem); } +gpointer mdb_g_malloc (gsize n_bytes) { return g_malloc(n_bytes); } +gpointer mdb_g_malloc0 (gsize n_bytes) { return g_malloc0(n_bytes); } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/money.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/money.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/money.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/money.c @@ -42,8 +42,7 @@ */ char *mdb_money_to_string(MdbHandle *mdb, int start) { -#define num_bytes 8 - int scale=4; + const int num_bytes=8, scale=4; int i; int neg=0; unsigned char multiplier[MAX_NUMERIC_PRECISION], temp[MAX_NUMERIC_PRECISION]; @@ -77,12 +76,10 @@ multiply_byte(multiplier, 256, temp); } return array_to_string(product, scale, neg); - -#undef num_bytes } char *mdb_numeric_to_string(MdbHandle *mdb, int start, int prec, int scale) { -#define num_bytes 16 + const int num_bytes = 16; int i; int neg=0; unsigned char multiplier[MAX_NUMERIC_PRECISION], temp[MAX_NUMERIC_PRECISION]; @@ -106,7 +103,6 @@ multiply_byte(multiplier, 256, temp); } return array_to_string(product, scale, neg); -#undef num_bytes } static int multiply_byte(unsigned char *product, int num, unsigned char *multiplier) diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/props.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/props.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/props.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/props.c @@ -162,7 +162,7 @@ * and returns a GArray of MdbProps* */ GArray* -mdb_kkd_to_props(MdbHandle *mdb, void *buffer, size_t len) { +mdb_kkd_to_props(MdbHandle *mdb, char *buffer, size_t len) { guint32 record_len; guint16 record_type; size_t pos; @@ -192,15 +192,15 @@ switch (record_type) { case 0x80: if (names) free_names(names); - names = mdb_read_props_list(mdb, (gchar *)buffer+pos+6, record_len - 6); + names = mdb_read_props_list(mdb, (char*)buffer+pos+6, record_len - 6); break; case 0x00: case 0x01: if (!names) { fprintf(stderr,"sequence error!\n"); break; } - props = mdb_read_props(mdb, names, (gchar *)buffer+pos+6, record_len - 6); + props = mdb_read_props(mdb, names, (char*)buffer+pos+6, record_len - 6); g_array_append_val(result, props); //mdb_dump_props(props, stderr, 1); break; diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/sargs.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/sargs.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/sargs.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/sargs.c @@ -175,13 +175,10 @@ { char tmpbuf[256]; - if (node->op == MDB_ISNULL) { - if (field->is_null) return 0; - else return 1; - } else if (node->op == MDB_NOTNULL) { - if (field->is_null) return 1; - else return 0; - } + if (node->op == MDB_ISNULL) + return field->is_null?1:0; + else if (node->op == MDB_NOTNULL) + return field->is_null?0:1; switch (col->col_type) { case MDB_BOOL: return mdb_test_int(node, !field->is_null); @@ -302,7 +299,7 @@ for (i=0;inum_cols;i++) { col = g_ptr_array_index (table->columns, i); - if (!strcasecmp(col->name,colname)) { + if (!g_ascii_strcasecmp(col->name,colname)) { return mdb_add_sarg(col, in_sarg); } } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/table.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/table.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/table.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/table.c @@ -76,7 +76,7 @@ MdbHandle *mdb = entry->mdb; MdbFormatConstants *fmt = mdb->fmt; int row_start, pg_row; - void *buf, *pg_buf = mdb->pg_buf; + char *buf, *pg_buf = (char *)mdb->pg_buf; guint i; mdb_read_pg(mdb, entry->table_pg); @@ -128,7 +128,7 @@ for (i=0; inum_catalog; i++) { entry = g_ptr_array_index(mdb->catalog, i); - if (!strcasecmp(entry->object_name, table_name)) + if (!g_ascii_strcasecmp(entry->object_name, table_name)) return mdb_read_table(entry); } @@ -157,40 +157,40 @@ { guint8 c; - read_pg_if_n(mdb, &c, cur_pos, 1); + read_pg_if_n(mdb, (char *)&c, cur_pos, 1); return c; } /* * Read data into a buffer, advancing pages and setting the * page cursor as needed. In the case that buf in NULL, pages * are still advanced and the page cursor is still updated. */ void * -read_pg_if_n(MdbHandle *mdb, void *void_buf, int *cur_pos, size_t len) +read_pg_if_n(MdbHandle *mdb, char *buf, int *cur_pos, size_t len) { - gchar *buf = void_buf; + char* _buf = buf; /* Advance to page which contains the first byte */ while (*cur_pos >= mdb->fmt->pg_size) { - mdb_read_pg(mdb, mdb_get_int32(mdb->pg_buf,4)); + mdb_read_pg(mdb, mdb_get_int32((char *)mdb->pg_buf,4)); *cur_pos -= (int)(mdb->fmt->pg_size - 8); } /* Copy pages into buffer */ while ((ssize_t)(*cur_pos + len) >= mdb->fmt->pg_size) { int piece_len = mdb->fmt->pg_size - *cur_pos; - if (buf) { - memcpy(buf, mdb->pg_buf + *cur_pos, piece_len); - buf += piece_len; + if (_buf) { + memcpy(_buf, mdb->pg_buf + *cur_pos, piece_len); + _buf += piece_len; } len -= piece_len; - mdb_read_pg(mdb, mdb_get_int32(mdb->pg_buf,4)); + mdb_read_pg(mdb, mdb_get_int32((char *)mdb->pg_buf,4)); *cur_pos = 8; } /* Copy into buffer from final page */ - if (len && buf) { - memcpy(buf, mdb->pg_buf + *cur_pos, len); + if (len && _buf) { + memcpy(_buf, mdb->pg_buf + *cur_pos, len); } *cur_pos += len; - return buf; + return _buf; } @@ -244,7 +244,7 @@ /* printf("column %d\n", i); mdb_buffer_dump(mdb->pg_buf, cur_pos, fmt->tab_col_entry_size); */ #endif - read_pg_if_n(mdb, col, &cur_pos, fmt->tab_col_entry_size); + read_pg_if_n(mdb, (char *)col, &cur_pos, fmt->tab_col_entry_size); pcol = (MdbColumn *) g_malloc0(sizeof(MdbColumn)); pcol->table = table; @@ -256,11 +256,11 @@ //fprintf(stdout,"----- column %d -----\n",pcol->col_num); // col_var == 3 or 7 - pcol->var_col_num = mdb_get_int16(col, fmt->tab_col_offset_var); + pcol->var_col_num = mdb_get_int16((char *)col, fmt->tab_col_offset_var); //fprintf(stdout,"var column pos %d\n",pcol->var_col_num); // col_var == 5 or 9 - pcol->row_col_num = mdb_get_int16(col, fmt->tab_row_col_num_offset); + pcol->row_col_num = mdb_get_int16((char *)col, fmt->tab_row_col_num_offset); //fprintf(stdout,"row column num %d\n",pcol->row_col_num); /* FIXME: can this be right in Jet3 and Jet4? */ @@ -275,13 +275,13 @@ pcol->is_uuid_auto = col[fmt->col_flags_offset] & 0x40 ? 1 : 0; // tab_col_offset_fixed == 14 or 21 - pcol->fixed_offset = mdb_get_int16(col, fmt->tab_col_offset_fixed); + pcol->fixed_offset = mdb_get_int16((char *)col, fmt->tab_col_offset_fixed); //fprintf(stdout,"fixed column offset %d\n",pcol->fixed_offset); //fprintf(stdout,"col type %s\n",pcol->is_fixed ? "fixed" : "variable"); if (pcol->col_type != MDB_BOOL) { // col_size_offset == 16 or 23 - pcol->col_size = mdb_get_int16(col, fmt->col_size_offset); + pcol->col_size = mdb_get_int16((char *)col, fmt->col_size_offset); } else { pcol->col_size=0; } diff --git a/src/migration/mdb/3rdparty/mdbtools/libmdb/write.c b/src/migration/mdb/3rdparty/mdbtools/libmdb/write.c --- a/src/migration/mdb/3rdparty/mdbtools/libmdb/write.c +++ b/src/migration/mdb/3rdparty/mdbtools/libmdb/write.c @@ -18,7 +18,6 @@ #include #include -#include #include "mdbtools.h" #ifdef DMALLOC @@ -30,10 +29,10 @@ static int mdb_add_row_to_leaf_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg, MdbField *idx_fields, guint32 pgnum, guint16 rownum); void -mdb_put_int16(void *buf, guint32 offset, guint32 value) +mdb_put_int16(char *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); - memcpy((char*)buf + offset, &value, 2); + memcpy(buf + offset, &value, 2); } void _mdb_put_int16(void *buf, guint32 offset, guint32 value) @@ -44,10 +43,10 @@ #endif void -mdb_put_int32(void *buf, guint32 offset, guint32 value) +mdb_put_int32(char *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); - memcpy((char*)buf + offset, &value, 4); + memcpy(buf + offset, &value, 4); } void _mdb_put_int32(void *buf, guint32 offset, guint32 value) @@ -58,10 +57,10 @@ #endif void -mdb_put_int32_msb(void *buf, guint32 offset, guint32 value) +mdb_put_int32_msb(char *buf, guint32 offset, guint32 value) { value = GINT32_TO_BE(value); - memcpy((char*)buf + offset, &value, 4); + memcpy(buf + offset, &value, 4); } void _mdb_put_int32_mdb(void *buf, guint32 offset, guint32 value) @@ -84,7 +83,7 @@ } /* is page beyond current size + 1 ? */ if ((size_t)status.st_size < (offset + mdb->fmt->pg_size)) { - fprintf(stderr,"offset %jd is beyond EOF\n",(intmax_t)offset); + fprintf(stderr,"offset %jd is beyond EOF\n",offset); return 0; } if (lseek(mdb->f->fd, offset, SEEK_SET) == -1) { @@ -124,7 +123,7 @@ unsigned int i; for (i=0; ipg_buf, + var_col_offsets[i] = mdb_get_int16((char *)mdb->pg_buf, row_end - bitmask_sz - 3 - (i*2)); } } @@ -156,7 +155,7 @@ * @table: Table that the row belongs to * @row_start: offset to start of row on current page * @row_end: offset to end of row on current page - * @fields: pointer to MdbField array to be popluated by mdb_crack_row + * @fields: pointer to MdbField array to be populated by mdb_crack_row * * Cracks a row buffer apart into its component fields. * @@ -178,7 +177,7 @@ MdbColumn *col; MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; - void *pg_buf = mdb->pg_buf; + unsigned char *pg_buf = mdb->pg_buf; unsigned int row_var_cols=0, row_cols; unsigned char *nullmask; unsigned int bitmask_sz; @@ -195,18 +194,18 @@ row_cols = mdb_get_byte(pg_buf, row_start); col_count_size = 1; } else { - row_cols = mdb_get_int16(pg_buf, row_start); + row_cols = mdb_get_int16((char *)pg_buf, row_start); col_count_size = 2; } bitmask_sz = (row_cols + 7) / 8; - nullmask = (unsigned char *)pg_buf + row_end - bitmask_sz + 1; + nullmask = (unsigned char*)pg_buf + row_end - bitmask_sz + 1; /* read table of variable column locations */ if (table->num_var_cols > 0) { row_var_cols = IS_JET3(mdb) ? mdb_get_byte(pg_buf, row_end - bitmask_sz) : - mdb_get_int16(pg_buf, row_end - bitmask_sz - 1); + mdb_get_int16((char *)pg_buf, row_end - bitmask_sz - 1); var_col_offsets = (unsigned int *)g_malloc((row_var_cols+1)*sizeof(int)); if (IS_JET3(mdb)) { mdb_crack_row3(mdb, row_start, row_end, bitmask_sz, @@ -446,9 +445,9 @@ int rows, free_start, free_end; int row_count_offset = mdb->fmt->row_count_offset; - rows = mdb_get_int16(mdb->pg_buf, row_count_offset); + rows = mdb_get_int16((char *)mdb->pg_buf, row_count_offset); free_start = row_count_offset + 2 + (rows * 2); - free_end = mdb_get_int16(mdb->pg_buf, row_count_offset + (rows * 2)); + free_end = mdb_get_int16((char *)mdb->pg_buf, row_count_offset + (rows * 2)); mdb_debug(MDB_DEBUG_WRITE,"free space left on page = %d", free_end - free_start); return (free_end - free_start); } @@ -600,7 +599,7 @@ guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size) { - void *new_pg; + unsigned char *new_pg; int num_rows, i, pos, row_start; size_t row_size; MdbCatalogEntry *entry = table->entry; @@ -614,42 +613,42 @@ g_ptr_array_add(pages, new_pg); } else { new_pg = g_ptr_array_index(pages, pages->len - 1); - if (mdb_get_int16(new_pg, 2) < new_row_size + 2) { + if (mdb_get_int16((char *)new_pg, 2) < new_row_size + 2) { new_pg = mdb_new_data_pg(entry); g_ptr_array_add(pages, new_pg); } } - num_rows = mdb_get_int16(new_pg, fmt->row_count_offset); + num_rows = mdb_get_int16((char *)new_pg, fmt->row_count_offset); pos = (num_rows == 0) ? fmt->pg_size : - mdb_get_int16(new_pg, fmt->row_count_offset + (num_rows*2)); + mdb_get_int16((char *)new_pg, fmt->row_count_offset + (num_rows*2)); } else { /* is not a temp table */ new_pg = mdb_new_data_pg(entry); - num_rows = mdb_get_int16(mdb->pg_buf, fmt->row_count_offset); + num_rows = mdb_get_int16((char *)mdb->pg_buf, fmt->row_count_offset); pos = fmt->pg_size; /* copy existing rows */ for (i=0;ipg_buf + row_start, row_size); - mdb_put_int16(new_pg, (fmt->row_count_offset + 2) + (i*2), pos); + mdb_put_int16((char *)new_pg, (fmt->row_count_offset + 2) + (i*2), pos); } } /* add our new row */ pos -= new_row_size; memcpy((char*)new_pg + pos, row_buffer, new_row_size); /* add row to the row offset table */ - mdb_put_int16(new_pg, (fmt->row_count_offset + 2) + (num_rows*2), pos); + mdb_put_int16((char *)new_pg, (fmt->row_count_offset + 2) + (num_rows*2), pos); /* update number rows on this page */ num_rows++; - mdb_put_int16(new_pg, fmt->row_count_offset, num_rows); + mdb_put_int16((char *)new_pg, fmt->row_count_offset, num_rows); /* update the freespace */ - mdb_put_int16(new_pg,2,pos - fmt->row_count_offset - 2 - (num_rows*2)); + mdb_put_int16((char *)new_pg,2,pos - fmt->row_count_offset - 2 - (num_rows*2)); /* copy new page over old */ if (!table->is_temp_table) { @@ -731,7 +730,7 @@ MdbHandle *mdb = entry->mdb; int pg_size = mdb->fmt->pg_size; int rco = mdb->fmt->row_count_offset; - void *new_pg; + unsigned char *new_pg; guint16 num_rows; int row_start; size_t row_size; @@ -744,38 +743,38 @@ mdb_debug(MDB_DEBUG_WRITE,"updating row %d on page %lu", row, (unsigned long) table->cur_phys_pg); new_pg = mdb_new_data_pg(entry); - num_rows = mdb_get_int16(mdb->pg_buf, rco); - mdb_put_int16(new_pg, rco, num_rows); + num_rows = mdb_get_int16((char *)mdb->pg_buf, rco); + mdb_put_int16((char *)new_pg, rco, num_rows); pos = pg_size; /* rows before */ for (i=0;ipg_buf + row_start, row_size); - mdb_put_int16(new_pg, rco + 2 + i*2, pos); + mdb_put_int16((char *)new_pg, rco + 2 + i*2, pos); } /* our row */ pos -= new_row_size; memcpy((char*)new_pg + pos, new_row, new_row_size); - mdb_put_int16(new_pg, rco + 2 + row*2, pos); + mdb_put_int16((char *)new_pg, rco + 2 + row*2, pos); /* rows after */ for (i=row+1;ipg_buf + row_start, row_size); - mdb_put_int16(new_pg, rco + 2 + i*2, pos); + mdb_put_int16((char *)new_pg, rco + 2 + i*2, pos); } /* almost done, copy page over current */ memcpy(mdb->pg_buf, new_pg, pg_size); g_free(new_pg); - mdb_put_int16(mdb->pg_buf, 2, mdb_pg_get_freespace(mdb)); + mdb_put_int16((char *)mdb->pg_buf, 2, mdb_pg_get_freespace(mdb)); if (mdb_get_option(MDB_DEBUG_WRITE)) { mdb_buffer_dump(mdb->pg_buf, 0, 40); mdb_buffer_dump(mdb->pg_buf, pg_size - 160, 160); @@ -799,7 +798,7 @@ MdbColumn *col; guint32 pg_row; guint16 row = 0; - void *new_pg; + unsigned char *new_pg; unsigned char key_hash[256]; int keycol; @@ -829,7 +828,7 @@ return 0; } - pg_row = mdb_get_int32_msb(mdb->pg_buf, ipg->offset + ipg->len - 4); + pg_row = mdb_get_int32_msb((char *)mdb->pg_buf, ipg->offset + ipg->len - 4); /* guint32 pg = pg_row >> 8; */ row = pg_row & 0xff; /* unsigned char iflag = mdb->pg_buf[ipg->offset]; */ @@ -857,7 +856,7 @@ } //mdb_put_int16(new_pg, mdb->fmt->row_count_offset, row); /* free space left */ - mdb_put_int16(new_pg, 2, mdb->fmt->pg_size - ipg->offset); + mdb_put_int16((char *)new_pg, 2, mdb->fmt->pg_size - ipg->offset); //printf("offset = %d\n", ipg->offset); mdb_index_swap_n(idx_fields[0].value, col->col_size, key_hash); @@ -871,7 +870,7 @@ ((char *)new_pg)[ipg->offset] = 0x7f; memcpy((char*)new_pg + ipg->offset + 1, key_hash, col->col_size); pg_row = (pgnum << 8) | ((rownum-1) & 0xff); - mdb_put_int32_msb(new_pg, ipg->offset + 5, pg_row); + mdb_put_int32_msb((char *)new_pg, ipg->offset + 5, pg_row); ipg->idx_starts[row++] = ipg->offset + ipg->len; //ipg->idx_starts[row] = ipg->offset + ipg->len; if (mdb_get_option(MDB_DEBUG_WRITE)) { diff --git a/src/migration/mdb/README b/src/migration/mdb/README --- a/src/migration/mdb/README +++ b/src/migration/mdb/README @@ -1,17 +1,23 @@ -This is keximdb, the MDB file migration driver for Kexi. - -MDB files are the native database format of MS Access (and -also some other MS applications). This driver can be used -by Kexi's migration framework to convert simple Access +This is MDB file migration driver for KEXI. It can be used to convert simple MS Access databases into native Kexi databases. -If you have any problems, improvement proposals or you wish -to support this development, feel free to contact the authors: -* using the e-mail address below -* or using the Calligra forum http://forum.kde.org/viewforum.php?f=203 -* or ask on the #kexi IRC channel at irc.freenode.net. +MDB files are the native database format of MS Access (and also some other MS applications). + +Features: +- only import +- only tables are currently imported (no queries, forms, reports, etc.) +- imports all data types, including binary and memo +- imports primary keys +- imports data (records) + +mdbtools library is used internally (https://github.com/brianb/mdbtools). To facilitate access to +the newest possible mdbtools version regardless of operating system KEXI runs on, mdbtools' code has +been imported to src/migration/mdb/3rdparty/mdbtools directory of KEXI. Only needed source files +have been copied, that is command line tools and GUI code is not included. This is not meant to be +a fork though, improvements are contributed back to the main project. + +Home page of the MDB file migration driver: https://community.kde.org/Kexi/Migration/MDB -For more information visit: -http://www.kexi-project.org/wiki/wikiview/index.php@MDBDriver.html +Problems, proposals for improvement and support requests can be reported here: -Contact: calligra-devel at kde.org +https://community.kde.org/Kexi/Contact