diff --git a/include/mdbtools.h b/include/mdbtools.h index 60ed640..68c18fd 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -27,7 +27,9 @@ #include #include #include +#ifndef _WIN32 #include +#endif #include #include #include @@ -51,10 +53,21 @@ #define MDB_MEMO_OVERHEAD 12 #define MDB_BIND_SIZE 16384 -// 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_CONSTRUCTOR(funcname) void __attribute__((constructor)) 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 +#define MDB_DEPRECATED(type, func) __declspec(deprecated) type func +#endif enum { MDB_PAGE_DB = 0, @@ -235,6 +248,11 @@ typedef struct { } MdbFile; /* offset to row count on data pages...version dependant */ +#ifdef _WIN64 +typedef __int64 ssize_t; +#elif _WIN32 +typedef _W64 int ssize_t; +#endif typedef struct { ssize_t pg_size; guint16 row_count_offset; @@ -430,164 +448,173 @@ typedef struct { MdbAny value; } MdbSarg; +#ifdef _WIN32 +#define snprintf _snprintf +#define strcasecmp _stricmp +#endif + /* 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 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(unsigned char *buf, int offset); +extern LIBMDB_DLL long mdb_get_int32(unsigned char *buf, int offset); +extern LIBMDB_DLL long mdb_get_int32_msb(unsigned char *buf, int offset); +extern LIBMDB_DLL float mdb_get_single(unsigned char *buf, int offset); +extern LIBMDB_DLL double mdb_get_double(unsigned 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 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 char *mdb_get_objtype_string(int obj_type); +extern LIBMDB_DLL void mdb_dump_catalog(MdbHandle *mdb, int obj_type); +extern LIBMDB_DLL 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, unsigned 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, 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, 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, void **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 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); /* backend.c */ -extern MDB_DEPRECATED(char*, mdb_get_coltype_string(MdbBackend *backend, int col_type)); -extern MDB_DEPRECATED(int, mdb_coltype_takes_length(MdbBackend *backend, int col_type)); -extern const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col); -extern const char* mdb_get_colbacktype_string(const MdbColumn *col); -extern int mdb_colbacktype_takes_length(const MdbColumn *col); -extern MDB_DEPRECATED(void, mdb_init_backends()); -extern void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendType *backend_type, MdbBackendType *type_shortdate, MdbBackendType *type_autonum, const char *short_now, const char *long_now, const char *charset_statement, const char *drop_statement, const char *constaint_not_empty_statement, const char *column_comment_statement, const char *table_comment_statement, gchar* (*quote_schema_name)(const gchar*, const gchar*)); -extern MDB_DEPRECATED(void, mdb_remove_backends()); -extern int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name); -extern void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options); +extern LIBMDB_DLL MDB_DEPRECATED(char*, mdb_get_coltype_string(MdbBackend *backend, int col_type)); +extern LIBMDB_DLL MDB_DEPRECATED(int, mdb_coltype_takes_length(MdbBackend *backend, int col_type)); +extern LIBMDB_DLL const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col); +extern LIBMDB_DLL const char* mdb_get_colbacktype_string(const MdbColumn *col); +extern LIBMDB_DLL int mdb_colbacktype_takes_length(const MdbColumn *col); +extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_init_backends()); +extern LIBMDB_DLL void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendType *backend_type, MdbBackendType *type_shortdate, MdbBackendType *type_autonum, const char *short_now, const char *long_now, const char *charset_statement, const char *drop_statement, const char *constaint_not_empty_statement, const char *column_comment_statement, const char *table_comment_statement, gchar* (*quote_schema_name)(const gchar*, const gchar*)); +extern LIBMDB_DLL MDB_DEPRECATED(void, mdb_remove_backends()); +extern LIBMDB_DLL int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name); +extern LIBMDB_DLL void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options); /* 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); /* 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); /* 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(unsigned char *buf, guint32 offset, guint32 value); +extern LIBMDB_DLL void mdb_put_int32(unsigned char *buf, guint32 offset, guint32 value); +extern LIBMDB_DLL void mdb_put_int32_msb(unsigned 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, char *fmt, ...); +extern LIBMDB_DLL int mdb_get_option(unsigned long optnum); +extern LIBMDB_DLL void mdb_debug(int klass, 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/libmdb/backend.c b/src/libmdb/backend.c index 0d0965f..718f6dc 100644 --- a/src/libmdb/backend.c +++ b/src/libmdb/backend.c @@ -35,7 +35,7 @@ static int is_init; GHashTable *mdb_backends; -void _mdb_remove_backends(); +static void _mdb_remove_backends(); /* Access data types */ static MdbBackendType mdb_access_types[] = { @@ -342,13 +342,39 @@ mdb_init_backends()) fprintf(stderr, "mdb_init_backends() is DEPRECATED and does nothing. Stop calling it.\n"); } +#ifdef _MSC_VER + +#define CCALL __cdecl +#pragma section(".CRT$XCU",read) +#define INITIALIZER(f) \ + static void __cdecl f(void); \ + __declspec(allocate(".CRT$XCU")) void (__cdecl*f##_)(void) = f; \ + static void __cdecl f(void) + +#elif defined(__GNUC__) + +#define CCALL +#define INITIALIZER(f) void __attribute__((constructor)) f(void) +#endif + +/** + * mdb_remove_backends + * + * Removes all entries from and destroys the mdb_backends hash. + */ +static void CCALL _mdb_remove_backends(void) +{ + g_hash_table_foreach_remove(mdb_backends, mdb_drop_backend, NULL); + g_hash_table_destroy(mdb_backends); +} + /** * _mdb_init_backends * * Initializes the mdb_backends hash and loads the builtin backends. * Use mdb_remove_backends() to destroy this hash when done. */ -MDB_CONSTRUCTOR(_mdb_init_backends) +INITIALIZER(_mdb_init_backends) { mdb_backends = g_hash_table_new(g_str_hash, g_str_equal); @@ -440,17 +466,6 @@ mdb_remove_backends()) fprintf(stderr, "mdb_remove_backends() is DEPRECATED and does nothing. Stop calling it.\n"); } -/** - * mdb_remove_backends - * - * Removes all entries from and destroys the mdb_backends hash. - */ -void -_mdb_remove_backends() -{ - g_hash_table_foreach_remove(mdb_backends, mdb_drop_backend, NULL); - g_hash_table_destroy(mdb_backends); -} static gboolean mdb_drop_backend(gpointer key, gpointer value, gpointer data) { MdbBackend *backend = (MdbBackend *)value; @@ -869,7 +884,6 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, mdb_free_tabledef (table); } - void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options) { diff --git a/src/libmdb/data.c b/src/libmdb/data.c index 21afa70..fdbd5fb 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -473,7 +473,7 @@ size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr) { guint32 ole_len; - void *buf; + unsigned char *buf; int row_start; size_t len; @@ -506,7 +506,7 @@ size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size) { guint32 ole_len; - void *buf; + unsigned char *buf; int row_start; size_t len; @@ -672,7 +672,7 @@ static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size) guint32 memo_len; gint32 row_start, pg_row; size_t len; - void *buf, *pg_buf = mdb->pg_buf; + char *buf, *pg_buf = (char*) mdb->pg_buf; char *text = (char *) g_malloc(MDB_BIND_SIZE); if (size #include "mdbtools.h" #ifdef DMALLOC @@ -369,7 +368,7 @@ static ssize_t _mdb_read_pg(MdbHandle *mdb, void *pg_buf, unsigned long pg) fstat(mdb->f->fd, &status); 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->stats && mdb->stats->collect) @@ -420,7 +419,7 @@ unsigned char mdb_pg_get_byte(MdbHandle *mdb, int offset) return mdb->pg_buf[offset]; } -int mdb_get_int16(void *buf, int offset) +int mdb_get_int16(unsigned char *buf, int offset) { guint16 l; memcpy(&l, buf + offset, 2); @@ -433,13 +432,13 @@ int mdb_pg_get_int16(MdbHandle *mdb, int offset) return mdb_get_int16(mdb->pg_buf, offset); } -long mdb_get_int32_msb(void *buf, int offset) +long mdb_get_int32_msb(unsigned char *buf, int offset) { gint32 l; memcpy(&l, buf + offset, 4); return (long)GINT32_FROM_BE(l); } -long mdb_get_int32(void *buf, int offset) +long mdb_get_int32(unsigned char *buf, int offset) { gint32 l; memcpy(&l, buf + offset, 4); @@ -452,7 +451,7 @@ long mdb_pg_get_int32(MdbHandle *mdb, int offset) return mdb_get_int32(mdb->pg_buf, offset); } -float mdb_get_single(void *buf, int offset) +float mdb_get_single(unsigned char *buf, int offset) { union {guint32 g; float f;} f; memcpy(&f, buf + offset, 4); @@ -466,7 +465,7 @@ float mdb_pg_get_single(MdbHandle *mdb, int offset) return mdb_get_single(mdb->pg_buf, offset); } -double mdb_get_double(void *buf, int offset) +double mdb_get_double(unsigned char *buf, int offset) { union {guint64 g; double d;} d; memcpy(&d, buf + offset, 8); diff --git a/src/libmdb/mem.c b/src/libmdb/mem.c index 6f871cd..67e29e4 100644 --- a/src/libmdb/mem.c +++ b/src/libmdb/mem.c @@ -29,3 +29,8 @@ mdb_exit()) { 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/libmdb/money.c b/src/libmdb/money.c index 72d6c8c..3d8f598 100644 --- a/src/libmdb/money.c +++ b/src/libmdb/money.c @@ -47,7 +47,7 @@ char *mdb_money_to_string(MdbHandle *mdb, int start) int neg=0; unsigned char multiplier[MAX_NUMERIC_PRECISION], temp[MAX_NUMERIC_PRECISION]; unsigned char product[MAX_NUMERIC_PRECISION]; - unsigned char bytes[num_bytes]; + unsigned char bytes[8]; memset(multiplier,0,MAX_NUMERIC_PRECISION); memset(product,0,MAX_NUMERIC_PRECISION); @@ -85,7 +85,7 @@ char *mdb_numeric_to_string(MdbHandle *mdb, int start, int prec, int scale) { int neg=0; unsigned char multiplier[MAX_NUMERIC_PRECISION], temp[MAX_NUMERIC_PRECISION]; unsigned char product[MAX_NUMERIC_PRECISION]; - unsigned char bytes[num_bytes]; + unsigned char bytes[16]; memset(multiplier,0,MAX_NUMERIC_PRECISION); memset(product,0,MAX_NUMERIC_PRECISION); diff --git a/src/libmdb/props.c b/src/libmdb/props.c index d1a3841..307cb3e 100644 --- a/src/libmdb/props.c +++ b/src/libmdb/props.c @@ -162,7 +162,7 @@ mdb_dump_props(MdbProperties *props, FILE *outfile, int show_name) { * 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; diff --git a/src/libmdb/table.c b/src/libmdb/table.c index d57f164..40eb924 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -76,7 +76,7 @@ MdbTableDef *mdb_read_table(MdbCatalogEntry *entry) MdbHandle *mdb = entry->mdb; MdbFormatConstants *fmt = mdb->fmt; int row_start, pg_row; - void *buf, *pg_buf = mdb->pg_buf; + unsigned char *buf, *pg_buf = mdb->pg_buf; guint i; mdb_read_pg(mdb, entry->table_pg); @@ -166,7 +166,7 @@ read_pg_if_8(MdbHandle *mdb, int *cur_pos) * are still advanced and the page cursor is still updated. */ void * -read_pg_if_n(MdbHandle *mdb, void *buf, int *cur_pos, size_t len) +read_pg_if_n(MdbHandle *mdb, unsigned char *buf, int *cur_pos, size_t len) { /* Advance to page which contains the first byte */ while (*cur_pos >= mdb->fmt->pg_size) { diff --git a/src/libmdb/write.c b/src/libmdb/write.c index 7171c84..ea1b50d 100644 --- a/src/libmdb/write.c +++ b/src/libmdb/write.c @@ -18,7 +18,6 @@ #include #include -#include #include "mdbtools.h" #ifdef DMALLOC @@ -30,7 +29,7 @@ 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(unsigned char *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); memcpy(buf + offset, &value, 2); @@ -44,7 +43,7 @@ __attribute__((alias("mdb_put_int16"))); #endif void -mdb_put_int32(void *buf, guint32 offset, guint32 value) +mdb_put_int32(unsigned char *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); memcpy(buf + offset, &value, 4); @@ -58,7 +57,7 @@ __attribute__((alias("mdb_put_int32"))); #endif void -mdb_put_int32_msb(void *buf, guint32 offset, guint32 value) +mdb_put_int32_msb(unsigned char *buf, guint32 offset, guint32 value) { value = GINT32_TO_BE(value); memcpy(buf + offset, &value, 4); @@ -81,7 +80,7 @@ mdb_write_pg(MdbHandle *mdb, unsigned long pg) fstat(mdb->f->fd, &status); /* is page beyond current size + 1 ? */ if (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; } lseek(mdb->f->fd, offset, SEEK_SET); @@ -172,7 +171,7 @@ mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) 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; @@ -594,7 +593,7 @@ mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields) 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; @@ -725,7 +724,7 @@ MdbCatalogEntry *entry = table->entry; 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; @@ -793,7 +792,7 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg) MdbColumn *col; guint32 pg_row; guint16 row = 0; - void *new_pg; + unsigned char *new_pg; unsigned char key_hash[256]; int keycol;