diff --git a/include/mdbtools.h b/include/mdbtools.h index 8fda882..31f027f 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -50,7 +50,13 @@ #define MDB_MEMO_OVERHEAD 12 #define MDB_BIND_SIZE 16384 -#define MDB_DEPRECATED __attribute__((deprecated)) +#ifndef _WIN32 +#define MDB_DEPRECATED(type, func) type __attribute__((deprecated)) func +#else +#define MDB_DEPRECATED(type, func) __declspec(deprecated) type func +#endif + +#define _CRT_SECURE_NO_WARNINGS 1 enum { MDB_PAGE_DB = 0, @@ -437,8 +443,8 @@ typedef struct { #endif /* mem.c */ -extern void MDB_DEPRECATED mdb_init(); -extern void MDB_DEPRECATED mdb_exit(); +extern MDB_DEPRECATED(void, mdb_init()); +extern MDB_DEPRECATED(void, mdb_exit()); /* file.c */ extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg); @@ -508,14 +514,14 @@ extern int mdb_read_row(MdbTableDef *table, unsigned int row); extern void mdb_buffer_dump(const void *buf, int start, size_t len); /* backend.c */ -extern char* MDB_DEPRECATED mdb_get_coltype_string(MdbBackend *backend, int col_type); -extern int MDB_DEPRECATED mdb_coltype_takes_length(MdbBackend *backend, int col_type); +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 void MDB_DEPRECATED mdb_init_backends(); +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 void MDB_DEPRECATED mdb_remove_backends(); +extern MDB_DEPRECATED(void, mdb_remove_backends()); extern int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name); extern void generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, guint32 export_options); extern void generate_table_schemas(char *buf, unsigned int *bi, unsigned int *bsize, MdbCatalogEntry *entry, char *dbnamespace, guint32 export_options); diff --git a/src/libmdb/backend.c b/src/libmdb/backend.c index 3767996..b9294cb 100644 --- a/src/libmdb/backend.c +++ b/src/libmdb/backend.c @@ -259,8 +259,8 @@ quote_with_squotes(const gchar* value) return quote_generic(value, '\'', '\''); } -char * MDB_DEPRECATED -mdb_get_coltype_string(MdbBackend *backend, int col_type) +MDB_DEPRECATED (char *, +mdb_get_coltype_string(MdbBackend *backend, int col_type)) { static int warn_deprecated = 0; static char buf[16]; @@ -277,8 +277,8 @@ mdb_get_coltype_string(MdbBackend *backend, int col_type) return backend->types_table[col_type].name; } -int MDB_DEPRECATED -mdb_coltype_takes_length(MdbBackend *backend, int col_type) +MDB_DEPRECATED (int, +mdb_coltype_takes_length(MdbBackend *backend, int col_type)) { static int warn_deprecated = 0; if (!warn_deprecated) { @@ -325,17 +325,47 @@ mdb_colbacktype_takes_length(const MdbColumn *col) return type->needs_length; } -void MDB_DEPRECATED mdb_init_backends() { +MDB_DEPRECATED(void, 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) \ + static void f(void) __attribute__((constructor)); + static void 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. */ -void __attribute__ ((constructor)) _mdb_init_backends() +INITIALIZER(_mdb_init_backends) { mdb_backends = g_hash_table_new(g_str_hash, g_str_equal); @@ -399,6 +429,8 @@ void __attribute__ ((constructor)) _mdb_init_backends() NULL, NULL, quote_schema_name_rquotes_merge); + + atexit(_mdb_remove_backends); } 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*)) { @@ -418,20 +450,10 @@ void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendTy g_hash_table_insert(mdb_backends, backend_name, backend); } -void MDB_DEPRECATED mdb_remove_backends() { +MDB_DEPRECATED(void, 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 __attribute__ ((destructor)) _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; @@ -760,7 +782,7 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl return (char *)text; } -/*static*/ void +void generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, guint32 export_options) { MdbTableDef *table; diff --git a/src/libmdb/data.c b/src/libmdb/data.c index c050267..c8a2531 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -36,7 +36,7 @@ static char *mdb_date_to_string(MdbHandle *mdb, int start); static size_t mdb_copy_ole(MdbHandle *mdb, void *dest, int start, int size); #endif -static char date_fmt[64] = "%x %X"; +static char date_fmt[64] = "%Y-%m-%dT%H:%M:%S"; //ISODate void mdb_set_date_fmt(const char *fmt) { @@ -836,7 +836,7 @@ mdb_date_to_string(MdbHandle *mdb, int start) //If td == 0, t->tm_year == -1, which fails the debug assertion >= 0 if (!td) { - text = (char *) g_strdup("00:00:00"); + text = (char *) g_strdup("0"); } else { text = (char *) g_malloc(MDB_BIND_SIZE); mdb_date_to_tm(td, &t); diff --git a/src/libmdb/file.c b/src/libmdb/file.c index 1088028..d2f4c53 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -17,6 +17,9 @@ */ #include "mdbtools.h" +#ifdef _WIN32 +#include +#endif //#include #ifdef DMALLOC @@ -174,7 +177,6 @@ MdbHandle *mdb_open(const char *filename, MdbFileFlags flags) int open_flags; mdb = (MdbHandle *) g_malloc0(sizeof(MdbHandle)); - mdb_init_backends(); mdb_set_default_backend(mdb, "access"); #ifdef HAVE_ICONV mdb->iconv_in = (iconv_t)-1; @@ -261,7 +263,7 @@ MdbHandle *mdb_open(const char *filename, MdbFileFlags flags) /* get the db password located at 0x42 bytes into the file */ for (pos=0;pos<14;pos++) { - j = mdb_get_int32(mdb,0x42+pos); + j = mdb_get_int32(mdb,0x42+pos); //warning C4133: 'function' : incompatible types - from 'MdbHandle *' to 'unsigned char *' j ^= key[pos]; if ( j != 0) mdb->f->db_passwd[pos] = j; @@ -285,7 +287,6 @@ void mdb_close(MdbHandle *mdb) { if (!mdb) return; - mdb_remove_backends(); mdb_free_catalog(mdb); g_free(mdb->stats); g_free(mdb->backend_name); diff --git a/src/libmdb/libmdb.vcxproj b/src/libmdb/libmdb.vcxproj index d24c9e9..1b533b6 100644 --- a/src/libmdb/libmdb.vcxproj +++ b/src/libmdb/libmdb.vcxproj @@ -49,7 +49,7 @@ Level3 Disabled - WIN32;_DEBUG;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;%(PreprocessorDefinitions) NotUsing ..\..\include;.\glib false @@ -63,7 +63,7 @@ Level3 - WIN32;NDEBUG;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;%(PreprocessorDefinitions) NotUsing ..\..\include;.\glib false diff --git a/src/libmdb/mem.c b/src/libmdb/mem.c index eb6c11d..d63cd8a 100644 --- a/src/libmdb/mem.c +++ b/src/libmdb/mem.c @@ -18,12 +18,12 @@ #include "mdbtools.h" -void MDB_DEPRECATED mdb_init() +MDB_DEPRECATED (void, mdb_init()) { fprintf(stderr, "mdb_init() is DEPRECATED and does nothing. Stop calling it.\n"); } -void MDB_DEPRECATED mdb_exit() +MDB_DEPRECATED(void, mdb_exit()) { fprintf(stderr, "mdb_exit() is DEPRECATED and does nothing. Stop calling it.\n"); } diff --git a/src/libmdb/write.c b/src/libmdb/write.c index 3757aa7..ddfea54 100644 --- a/src/libmdb/write.c +++ b/src/libmdb/write.c @@ -19,6 +19,9 @@ #include "mdbtools.h" #include "time.h" #include "math.h" +#ifdef _WIN32 +#include +#endif //#include #ifdef DMALLOC