From 9d81bdde560772cb47ba867445a201771b05eb36 Mon Sep 17 00:00:00 2001 From: Jimmytaker Date: Mon, 31 Dec 2012 21:30:35 +0100 Subject: [PATCH 1/4] t --- src/libmdb/ReadMe.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libmdb/ReadMe.txt b/src/libmdb/ReadMe.txt index 841fe13..71fec9b 100644 --- a/src/libmdb/ReadMe.txt +++ b/src/libmdb/ReadMe.txt @@ -17,3 +17,4 @@ List of changes: Requirements to build and use: The only dependency is on glib. You need to provide the glib headers for the project to be built. + From cf7980923eadd8f5905f6a938a95ecf92db133a1 Mon Sep 17 00:00:00 2001 From: Jimmytaker Date: Mon, 14 Jan 2013 11:03:16 +0100 Subject: [PATCH 2/4] gitignore update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 079456a..81c47c6 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,4 @@ obj/ _ReSharper*/ *.*sdf glib/ +[Ii]pch*/ From a972c1638d68dde7f3470ca8906b530dcd2d0401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nirgal=20Vourg=C3=A8re?= Date: Sun, 13 Jan 2013 23:50:42 +0100 Subject: [PATCH 3/4] merge with master --- include/mdbtools.h | 26 ++++---- src/libmdb/backend.c | 138 +++++++++++++++++-------------------------- src/libmdb/mem.c | 4 +- 3 files changed, 71 insertions(+), 97 deletions(-) diff --git a/include/mdbtools.h b/include/mdbtools.h index 4bd810a..8fda882 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -50,9 +50,7 @@ #define MDB_MEMO_OVERHEAD 12 #define MDB_BIND_SIZE 16384 -#define BIN_MODE_STRIP 0 -#define BIN_MODE_RAW 1 -#define BIN_MODE_OCTAL 2 +#define MDB_DEPRECATED __attribute__((deprecated)) enum { MDB_PAGE_DB = 0, @@ -174,12 +172,16 @@ enum { }; #define MDB_SHEXP_DEFAULT (MDB_SHEXP_CST_NOTNULL | MDB_SHEXP_COMMENTS | MDB_SHEXP_INDEXES | MDB_SHEXP_RELATIONS) +/* csv export binary options */ +enum { + MDB_BINEXPORT_STRIP, + MDB_BINEXPORT_RAW, + MDB_BINEXPORT_OCTAL +}; + #define IS_JET4(mdb) (mdb->f->jet_version==MDB_VER_JET4) /* obsolete */ #define IS_JET3(mdb) (mdb->f->jet_version==MDB_VER_JET3) -#define is_quote_type(x) (x==MDB_TEXT || x==MDB_OLE || x==MDB_MEMO || x==MDB_DATETIME || x==MDB_BINARY || x==MDB_REPID) -#define is_binary_type(x) (x==MDB_OLE || x==MDB_BINARY || x==MDB_REPID) - /* forward declarations */ typedef struct mdbindex MdbIndex; typedef struct mdbsargtree MdbSargNode; @@ -435,8 +437,8 @@ typedef struct { #endif /* mem.c */ -extern void mdb_init(); -extern void mdb_exit(); +extern void MDB_DEPRECATED mdb_init(); +extern void MDB_DEPRECATED mdb_exit(); /* file.c */ extern ssize_t mdb_read_pg(MdbHandle *mdb, unsigned long pg); @@ -506,14 +508,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_get_coltype_string(MdbBackend *backend, int col_type); -extern int mdb_coltype_takes_length(MdbBackend *backend, int col_type); +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 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_init_backends(); +extern void MDB_DEPRECATED 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_remove_backends(); +extern void MDB_DEPRECATED 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 b4e8897..3767996 100644 --- a/src/libmdb/backend.c +++ b/src/libmdb/backend.c @@ -57,49 +57,6 @@ static MdbBackendType mdb_access_types[] = { MdbBackendType_STRUCT_ELEMENT("Numeric",1,1,0) }; -/** SQLite data types. According to the SQLite specs only the first set of elements are supported. - * However, during testing I found out that if I use the first set, then all texts, and dates are written in - * Memo fields, which makes them visible only after clicking on them (one at a time) in a DB Manager. The second set of elements - * makes these fields directly visible in a DB Manager like they are visible in Access and therefore I prefer them. -*/ -static MdbBackendType mdb_sqlite_types[] = { - //MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - //MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - - MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("DateTime", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("varchar", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), - MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), -}; - /* Oracle data types */ static MdbBackendType mdb_oracle_types[] = { MdbBackendType_STRUCT_ELEMENT("Oracle_Unknown 0x00",0,0,0), @@ -193,6 +150,28 @@ static MdbBackendType mdb_mysql_types[] = { }; static MdbBackendType mdb_mysql_shortdate_type = MdbBackendType_STRUCT_ELEMENT("date",0,0,0); + +/* sqlite data types */ +static MdbBackendType mdb_sqlite_types[] = { + MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("DateTime", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("varchar", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), + MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0), +}; + #ifndef JAVA static gboolean mdb_drop_backend(gpointer key, gpointer value, gpointer data); @@ -280,7 +259,7 @@ quote_with_squotes(const gchar* value) return quote_generic(value, '\'', '\''); } -char * +char * MDB_DEPRECATED mdb_get_coltype_string(MdbBackend *backend, int col_type) { static int warn_deprecated = 0; @@ -298,7 +277,7 @@ mdb_get_coltype_string(MdbBackend *backend, int col_type) return backend->types_table[col_type].name; } -int +int MDB_DEPRECATED mdb_coltype_takes_length(MdbBackend *backend, int col_type) { static int warn_deprecated = 0; @@ -346,13 +325,17 @@ mdb_colbacktype_takes_length(const MdbColumn *col) return type->needs_length; } +void MDB_DEPRECATED mdb_init_backends() { + fprintf(stderr, "mdb_init_backends() is DEPRECATED and does nothing. Stop calling it.\n"); +} + /** * _mdb_init_backends * * Initializes the mdb_backends hash and loads the builtin backends. * Use mdb_remove_backends() to destroy this hash when done. */ -void _mdb_init_backends() +void __attribute__ ((constructor)) _mdb_init_backends() { mdb_backends = g_hash_table_new(g_str_hash, g_str_equal); @@ -366,16 +349,6 @@ void _mdb_init_backends() NULL, NULL, quote_schema_name_bracket_merge); - mdb_register_backend("sqlite", //A lot of guessing and gut feelings went into this one. For my DBs it works fine. - MDB_SHEXP_DROPTABLE|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES, - mdb_sqlite_types, NULL, NULL, - "date('now')", "date('now')", - "-- That file uses encoding %s\n", - "DROP TABLE IF EXISTS %s;\n", - NULL, - NULL, - NULL, - quote_schema_name_rquotes_merge); mdb_register_backend("sybase", MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_DEFVALUES, mdb_sybase_types, &mdb_sybase_shortdate_type, NULL, @@ -416,14 +389,17 @@ void _mdb_init_backends() "COMMENT ON COLUMN %s.%s IS %s;\n", "COMMENT ON TABLE %s IS %s;\n", quote_schema_name_rquotes_merge); + mdb_register_backend("sqlite", + MDB_SHEXP_DROPTABLE|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES, + mdb_sqlite_types, NULL, NULL, + "date('now')", "date('now')", + "-- That file uses encoding %s\n", + "DROP TABLE IF EXISTS %s;\n", + NULL, + NULL, + NULL, + quote_schema_name_rquotes_merge); } - -/** Supposed to be deprecated in version 0.7, however I could not understand how to work without it. */ -void mdb_init_backends() { - _mdb_init_backends(); - //fprintf(stderr, "mdb_init_backends() is DEPRECATED and does nothing. Stop calling it.\n"); -} - 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*)) { MdbBackend *backend = (MdbBackend *) g_malloc0(sizeof(MdbBackend)); @@ -442,24 +418,20 @@ 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() { + 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() +void __attribute__ ((destructor)) _mdb_remove_backends() { g_hash_table_foreach_remove(mdb_backends, mdb_drop_backend, NULL); g_hash_table_destroy(mdb_backends); } - -/** Supposed to be deprecated in version 0.7, however I could not understand how to work without it. */ -void mdb_remove_backends() { - //fprintf(stderr, "mdb_remove_backends() is DEPRECATED and does nothing. Stop calling it.\n"); - _mdb_remove_backends(); -} static gboolean mdb_drop_backend(gpointer key, gpointer value, gpointer data) { MdbBackend *backend = (MdbBackend *)value; @@ -543,7 +515,7 @@ mdb_print_indexes(FILE* outfile, MdbTableDef *table, char *dbnamespace) fprintf (outfile, " UNIQUE"); fprintf(outfile, " INDEX %s ON %s (", quoted_name, quoted_table_name); } - g_free(quoted_name); //changed from free + g_free(quoted_name); free(index_name); for (j=0;jnum_keys;j++) { @@ -556,7 +528,7 @@ mdb_print_indexes(FILE* outfile, MdbTableDef *table, char *dbnamespace) /* no DESC for primary keys */ fprintf(outfile, " DESC"); - g_free(quoted_name); //changed from free + g_free(quoted_name); } fprintf (outfile, ");\n"); @@ -754,7 +726,7 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl grbit = atoi(bound[4]); constraint_name = g_strconcat(bound[1], "_", bound[0], "_fk", NULL); quoted_constraint_name = mdb->default_backend->quote_schema_name(dbnamespace, constraint_name); - g_free(constraint_name); //changed from free + g_free(constraint_name); if (grbit & 0x00000002) { text = g_strconcat( @@ -779,11 +751,11 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl break; } } - g_free(quoted_table_1); //changed from free - g_free(quoted_column_1); //changed from free - g_free(quoted_table_2); //changed from free - g_free(quoted_column_2); //changed from free - g_free(quoted_constraint_name); //changed from free + g_free(quoted_table_1); + g_free(quoted_column_1); + g_free(quoted_table_2); + g_free(quoted_column_2); + g_free(quoted_constraint_name); return (char *)text; } @@ -822,7 +794,7 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, quoted_name = mdb->default_backend->quote_schema_name(NULL, col->name); fprintf (outfile, "\t%s\t\t\t%s", quoted_name, mdb_get_colbacktype_string (col)); - g_free(quoted_name); //changed from free + g_free(quoted_name); if (mdb_colbacktype_takes_length(col)) { @@ -913,11 +885,11 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, fprintf(outfile, mdb->default_backend->column_comment_statement, quoted_table_name, quoted_name, comment); - g_free(comment); //changed from free + g_free(comment); } } - g_free(quoted_name); //changed from free + g_free(quoted_name); } /* Add the constraints on table */ @@ -928,7 +900,7 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *dbnamespace, fprintf(outfile, mdb->default_backend->table_comment_statement, quoted_table_name, comment); - g_free(comment); //changed from free + g_free(comment); } } fputc('\n', outfile); diff --git a/src/libmdb/mem.c b/src/libmdb/mem.c index 764d859..eb6c11d 100644 --- a/src/libmdb/mem.c +++ b/src/libmdb/mem.c @@ -18,12 +18,12 @@ #include "mdbtools.h" -void mdb_init() +void MDB_DEPRECATED mdb_init() { fprintf(stderr, "mdb_init() is DEPRECATED and does nothing. Stop calling it.\n"); } -void mdb_exit() +void MDB_DEPRECATED mdb_exit() { fprintf(stderr, "mdb_exit() is DEPRECATED and does nothing. Stop calling it.\n"); } From 46005ae0093e3279b5df0f84a2ebad7347b880f6 Mon Sep 17 00:00:00 2001 From: Jimmytaker Date: Mon, 14 Jan 2013 19:22:53 +0100 Subject: [PATCH 4/4] MDB_DEPRECATED redefined, Constructor MACRO, generate_table_schema changed to not static, date_fmt to ISODate __attribute__ does not exist in Visual Studio. Therefore replaced wherever it appeared with a macro: Redefines MDB_DEPRECATED to support Visual Studio Define a Constructor MACRO so that __attribute__((constructor/destructor)) behavior is achieved in Visual Studio. Just using generate_table_schema through mdb_print_schema deletes the purpose of a very good tool. generate_table_schemas is a rewrite of generate_table_schema but sends the data to a char* instead of FILE*. There is NO fmemopen() or similar in Visual Studio, so there is NO way to access memory through a FILE* except for first writing to the disk and then reading from the disk in memory. I cannot suggest how to handle the case when td == 0 for the dates. The databases I work with often have just 00:00:00 in the DateTime column which is not consistent with the rest of the column either, but I have to deal with it somehow. Leaving void* where char* is needed as a function parameter returns a compilation error in Visual Studio. --- include/mdbtools.h | 20 +++++++++----- src/libmdb/backend.c | 58 +++++++++++++++++++++++++++------------ src/libmdb/data.c | 4 +-- src/libmdb/file.c | 7 +++-- src/libmdb/libmdb.vcxproj | 4 +-- src/libmdb/mem.c | 4 +-- src/libmdb/write.c | 3 ++ 7 files changed, 66 insertions(+), 34 deletions(-) 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