merge with master

This commit is contained in:
Nirgal Vourgère 2013-01-13 23:50:42 +01:00 committed by Jimmytaker
parent cf7980923e
commit a972c1638d
3 changed files with 71 additions and 97 deletions

View File

@ -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);

View File

@ -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;j<idx->num_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);

View File

@ -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");
}