mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-03-10 00:20:54 +08:00
Merge pull request #32 from evanmiller/backend-thread-safety
Move backend dictionary and state to MdbHandle
This commit is contained in:
@@ -56,10 +56,9 @@
|
|||||||
#define MDB_MEMO_OVERHEAD 12
|
#define MDB_MEMO_OVERHEAD 12
|
||||||
#define MDB_BIND_SIZE 16384
|
#define MDB_BIND_SIZE 16384
|
||||||
|
|
||||||
// Theses 2 atrbutes are not supported by all compilers:
|
// This attribute is not supported by all compilers:
|
||||||
// M$VC see http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc
|
// 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, funcname) type __attribute__((deprecated)) funcname
|
||||||
#define MDB_CONSTRUCTOR(funcname) void __attribute__((constructor)) funcname(void)
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MDB_PAGE_DB = 0,
|
MDB_PAGE_DB = 0,
|
||||||
@@ -207,9 +206,9 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
guint32 capabilities; /* see MDB_SHEXP_* */
|
guint32 capabilities; /* see MDB_SHEXP_* */
|
||||||
MdbBackendType *types_table;
|
const MdbBackendType *types_table;
|
||||||
MdbBackendType *type_shortdate;
|
const MdbBackendType *type_shortdate;
|
||||||
MdbBackendType *type_autonum;
|
const MdbBackendType *type_autonum;
|
||||||
const char *short_now;
|
const char *short_now;
|
||||||
const char *long_now;
|
const char *long_now;
|
||||||
const char *charset_statement;
|
const char *charset_statement;
|
||||||
@@ -232,8 +231,6 @@ typedef struct {
|
|||||||
guint32 jet_version;
|
guint32 jet_version;
|
||||||
guint32 db_key;
|
guint32 db_key;
|
||||||
char db_passwd[14];
|
char db_passwd[14];
|
||||||
MdbBackend *default_backend;
|
|
||||||
char *backend_name;
|
|
||||||
MdbStatistics *stats;
|
MdbStatistics *stats;
|
||||||
/* free map */
|
/* free map */
|
||||||
int map_sz;
|
int map_sz;
|
||||||
@@ -271,15 +268,20 @@ typedef struct {
|
|||||||
unsigned int cur_pos;
|
unsigned int cur_pos;
|
||||||
unsigned char pg_buf[MDB_PGSIZE];
|
unsigned char pg_buf[MDB_PGSIZE];
|
||||||
unsigned char alt_pg_buf[MDB_PGSIZE];
|
unsigned char alt_pg_buf[MDB_PGSIZE];
|
||||||
unsigned int num_catalog;
|
|
||||||
GPtrArray *catalog;
|
|
||||||
MdbBackend *default_backend;
|
|
||||||
char *backend_name;
|
|
||||||
MdbFormatConstants *fmt;
|
MdbFormatConstants *fmt;
|
||||||
MdbStatistics *stats;
|
|
||||||
char date_fmt[64];
|
char date_fmt[64];
|
||||||
const char *boolean_false_value;
|
const char *boolean_false_value;
|
||||||
const char *boolean_true_value;
|
const char *boolean_true_value;
|
||||||
|
unsigned int num_catalog;
|
||||||
|
|
||||||
|
// Non-cloneable fields start here
|
||||||
|
GPtrArray *catalog;
|
||||||
|
MdbBackend *default_backend;
|
||||||
|
char *backend_name;
|
||||||
|
struct S_MdbTableDef *relationships_table;
|
||||||
|
char *relationships_values[5];
|
||||||
|
MdbStatistics *stats;
|
||||||
|
GHashTable *backends;
|
||||||
#ifdef HAVE_ICONV
|
#ifdef HAVE_ICONV
|
||||||
iconv_t iconv_in;
|
iconv_t iconv_in;
|
||||||
iconv_t iconv_out;
|
iconv_t iconv_out;
|
||||||
@@ -520,12 +522,12 @@ void mdb_buffer_dump(const void *buf, off_t start, size_t len);
|
|||||||
/* backend.c */
|
/* backend.c */
|
||||||
MDB_DEPRECATED(char*, mdb_get_coltype_string(MdbBackend *backend, int col_type));
|
MDB_DEPRECATED(char*, mdb_get_coltype_string(MdbBackend *backend, int col_type));
|
||||||
MDB_DEPRECATED(int, mdb_coltype_takes_length(MdbBackend *backend, int col_type));
|
MDB_DEPRECATED(int, mdb_coltype_takes_length(MdbBackend *backend, int col_type));
|
||||||
|
void mdb_init_backends(MdbHandle *mdb);
|
||||||
|
void mdb_remove_backends(MdbHandle *mdb);
|
||||||
const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col);
|
const MdbBackendType* mdb_get_colbacktype(const MdbColumn *col);
|
||||||
const char* mdb_get_colbacktype_string(const MdbColumn *col);
|
const char* mdb_get_colbacktype_string(const MdbColumn *col);
|
||||||
int mdb_colbacktype_takes_length(const MdbColumn *col);
|
int mdb_colbacktype_takes_length(const MdbColumn *col);
|
||||||
MDB_DEPRECATED(void, mdb_init_backends(void));
|
void mdb_register_backend(MdbHandle *mdb, char *backend_name, guint32 capabilities, const MdbBackendType *backend_type, const MdbBackendType *type_shortdate, const 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*));
|
||||||
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*));
|
|
||||||
MDB_DEPRECATED(void, mdb_remove_backends(void));
|
|
||||||
int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name);
|
int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name);
|
||||||
void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options);
|
void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace, guint32 export_options);
|
||||||
|
|
||||||
|
|||||||
@@ -16,165 +16,148 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef JAVA
|
|
||||||
#include "javadefines.h"
|
|
||||||
#define MdbBackendType_STRUCT_ELEMENT(a,b,c,d) new MdbBackendType(a,b,c,d)
|
|
||||||
#else
|
|
||||||
#define MdbBackendType_STRUCT_ELEMENT(a,b,c,d) {a,b,c,d}
|
|
||||||
/*
|
/*
|
||||||
** functions to deal with different backend database engines
|
** functions to deal with different backend database engines
|
||||||
*/
|
*/
|
||||||
#
|
|
||||||
#include "mdbtools.h"
|
#include "mdbtools.h"
|
||||||
|
|
||||||
#ifdef DMALLOC
|
|
||||||
#include "dmalloc.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* JAVA */
|
|
||||||
|
|
||||||
static int is_init;
|
|
||||||
GHashTable *mdb_backends;
|
|
||||||
void _mdb_remove_backends(void);
|
|
||||||
|
|
||||||
/* Access data types */
|
/* Access data types */
|
||||||
static MdbBackendType mdb_access_types[] = {
|
static const MdbBackendType mdb_access_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("Unknown 0x00", 0,0,0),
|
{ .name = "Unknown 0x00" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Boolean", 0,0,0),
|
{ .name = "Boolean" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Byte", 0,0,0),
|
{ .name = "Byte" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Integer", 0,0,0),
|
{ .name = "Integer" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Long Integer", 0,0,0),
|
{ .name = "Long Integer" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Currency", 0,0,0),
|
{ .name = "Currency" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Single", 0,0,0),
|
{ .name = "Single" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Double", 0,0,0),
|
{ .name = "Double" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("DateTime", 0,0,1),
|
{ .name = "DateTime", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Binary", 0,0,0),
|
{ .name = "Binary" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Text", 1,0,1),
|
{ .name = "Text", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("OLE", 1,0,1),
|
{ .name = "OLE", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Memo/Hyperlink",1,0,1),
|
{ .name = "Memo/Hyperlink", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Unknown 0x0d",0,0,0),
|
{ .name = "Unknown 0x0d" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Unknown 0x0e",0,0,0),
|
{ .name = "Unknown 0x0e" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Replication ID",0,0,0),
|
{ .name = "Replication ID" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Numeric",1,1,0)
|
{ .name = "Numeric", .needs_length = 1, .needs_scale = 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Oracle data types */
|
/* Oracle data types */
|
||||||
static MdbBackendType mdb_oracle_types[] = {
|
static const MdbBackendType mdb_oracle_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("Oracle_Unknown 0x00",0,0,0),
|
{ .name = "Oracle_Unknown 0x00" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER(1)",0,0,0),
|
{ .name = "NUMBER(1)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER(3)",0,0,0),
|
{ .name = "NUMBER(3)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER(5)",0,0,0),
|
{ .name = "NUMBER(5)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER(11)",0,0,0),
|
{ .name = "NUMBER(11)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER(15,2)",0,0,0),
|
{ .name = "NUMBER(15,2)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("FLOAT",0,0,0),
|
{ .name = "FLOAT" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("FLOAT",0,0,0),
|
{ .name = "FLOAT" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("TIMESTAMP",0,0,0),
|
{ .name = "TIMESTAMP" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BINARY",0,0,0),
|
{ .name = "BINARY" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("VARCHAR2",1,0,1),
|
{ .name = "VARCHAR2", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB",0,0,0),
|
{ .name = "BLOB" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("CLOB",0,0,0),
|
{ .name = "CLOB" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Oracle_Unknown 0x0d",0,0,0),
|
{ .name = "Oracle_Unknown 0x0d" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Oracle_Unknown 0x0e",0,0,0),
|
{ .name = "Oracle_Unknown 0x0e" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER",1,0,0),
|
{ .name = "NUMBER", .needs_length = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMBER",1,0,0),
|
{ .name = "NUMBER", .needs_length = 1 },
|
||||||
};
|
};
|
||||||
static MdbBackendType mdb_oracle_shortdate_type =
|
static const MdbBackendType mdb_oracle_shortdate_type =
|
||||||
MdbBackendType_STRUCT_ELEMENT("DATE",0,0,0);
|
{ .name = "DATE" };
|
||||||
|
|
||||||
/* Sybase/MSSQL data types */
|
/* Sybase/MSSQL data types */
|
||||||
static MdbBackendType mdb_sybase_types[] = {
|
static const MdbBackendType mdb_sybase_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("Sybase_Unknown 0x00",0,0,0),
|
{ .name = "Sybase_Unknown 0x00" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("bit",0,0,0),
|
{ .name = "bit" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("char",1,0,1),
|
{ .name = "char", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("smallint",0,0,0),
|
{ .name = "smallint" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("int",0,0,0),
|
{ .name = "int" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("money",0,0,0),
|
{ .name = "money" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("real",0,0,0),
|
{ .name = "real" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("float",0,0,0),
|
{ .name = "float" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("smalldatetime",0,0,0),
|
{ .name = "smalldatetime" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Sybase_Unknown 0x09",0,0,0),
|
{ .name = "Sybase_Unknown 0x09" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varchar",1,0,1),
|
{ .name = "varchar", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varbinary",1,0,1),
|
{ .name = "varbinary", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("text",1,0,1),
|
{ .name = "text", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Sybase_Unknown 0x0d",0,0,0),
|
{ .name = "Sybase_Unknown 0x0d" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Sybase_Unknown 0x0e",0,0,0),
|
{ .name = "Sybase_Unknown 0x0e" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Sybase_Replication ID",0,0,0),
|
{ .name = "Sybase_Replication ID" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("numeric",1,1,0),
|
{ .name = "numeric", .needs_length = 1, .needs_scale = 1 },
|
||||||
};
|
};
|
||||||
static MdbBackendType mdb_sybase_shortdate_type =
|
static const MdbBackendType mdb_sybase_shortdate_type =
|
||||||
MdbBackendType_STRUCT_ELEMENT("DATE",0,0,0);
|
{ .name = "DATE" };
|
||||||
|
|
||||||
/* Postgres data types */
|
/* Postgres data types */
|
||||||
static MdbBackendType mdb_postgres_types[] = {
|
static const MdbBackendType mdb_postgres_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("Postgres_Unknown 0x00",0,0,0),
|
{ .name = "Postgres_Unknown 0x00" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BOOL",0,0,0),
|
{ .name = "BOOL" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("SMALLINT",0,0,0),
|
{ .name = "SMALLINT" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER",0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER",0,0,0), /* bigint */
|
{ .name = "INTEGER" }, /* bigint */
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMERIC(15,2)",0,0,0), /* money deprecated ? */
|
{ .name = "NUMERIC(15,2)" }, /* money deprecated ? */
|
||||||
MdbBackendType_STRUCT_ELEMENT("REAL",0,0,0),
|
{ .name = "REAL" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("DOUBLE PRECISION",0,0,0),
|
{ .name = "DOUBLE PRECISION" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("TIMESTAMP WITHOUT TIME ZONE",0,0,0),
|
{ .name = "TIMESTAMP WITHOUT TIME ZONE" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BYTEA",0,0,0),
|
{ .name = "BYTEA" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("VARCHAR",1,0,1),
|
{ .name = "VARCHAR", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BYTEA",0,0,0),
|
{ .name = "BYTEA" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("TEXT",0,0,0),
|
{ .name = "TEXT" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Postgres_Unknown 0x0d",0,0,0),
|
{ .name = "Postgres_Unknown 0x0d" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("Postgres_Unknown 0x0e",0,0,0),
|
{ .name = "Postgres_Unknown 0x0e" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("UUID",0,0,0),
|
{ .name = "UUID" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("NUMERIC",1,1,0),
|
{ .name = "NUMERIC", .needs_length = 1, .needs_scale = 1 },
|
||||||
};
|
};
|
||||||
static MdbBackendType mdb_postgres_shortdate_type =
|
static const MdbBackendType mdb_postgres_shortdate_type =
|
||||||
MdbBackendType_STRUCT_ELEMENT("DATE",0,0,0);
|
{ .name = "DATE" };
|
||||||
static MdbBackendType mdb_postgres_serial_type =
|
static const MdbBackendType mdb_postgres_serial_type =
|
||||||
MdbBackendType_STRUCT_ELEMENT("SERIAL",0,0,0);
|
{ .name = "SERIAL" };
|
||||||
|
|
||||||
/* MySQL data types */
|
/* MySQL data types */
|
||||||
static MdbBackendType mdb_mysql_types[] = {
|
static const MdbBackendType mdb_mysql_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("text",0,0,1),
|
{ .name = "text", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("boolean", 0, 0, 0),
|
{ .name = "boolean" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("tinyint", 0, 0, 0),
|
{ .name = "tinyint" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("smallint", 0, 0, 0),
|
{ .name = "smallint" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("int",0,0,0),
|
{ .name = "int" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("float",0,0,0),
|
{ .name = "float" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("float",0,0,0),
|
{ .name = "float" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("float",0,0,0),
|
{ .name = "float" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("datetime",0,0,1),
|
{ .name = "datetime", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varchar",1,0,1),
|
{ .name = "varchar", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varchar",1,0,1),
|
{ .name = "varchar", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varchar",1,0,1),
|
{ .name = "varchar", .needs_length = 1, .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("text",0,0,1),
|
{ .name = "text", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("blob",0,0,0),
|
{ .name = "blob" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("text",0,0,1),
|
{ .name = "text", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("char(38)",0,0,0),
|
{ .name = "char(38)" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("numeric",1,1,0),
|
{ .name = "numeric", .needs_length = 1, .needs_scale = 1 },
|
||||||
};
|
};
|
||||||
static MdbBackendType mdb_mysql_shortdate_type =
|
static const MdbBackendType mdb_mysql_shortdate_type =
|
||||||
MdbBackendType_STRUCT_ELEMENT("date",0,0,0);
|
{ .name = "date" };
|
||||||
|
|
||||||
/* sqlite data types */
|
/* sqlite data types */
|
||||||
static MdbBackendType mdb_sqlite_types[] = {
|
static const MdbBackendType mdb_sqlite_types[] = {
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,0),
|
{ .name = "BLOB" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0),
|
{ .name = "REAL" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0),
|
{ .name = "REAL" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("REAL", 0,0,0),
|
{ .name = "REAL" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("DateTime", 0,0,1),
|
{ .name = "DateTime", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1),
|
{ .name = "BLOB", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("varchar", 0,0,1),
|
{ .name = "varchar", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1),
|
{ .name = "BLOB", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("TEXT", 0,0,1),
|
{ .name = "TEXT", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1),
|
{ .name = "BLOB", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("BLOB", 0,0,1),
|
{ .name = "BLOB", .needs_quotes = 1 },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
MdbBackendType_STRUCT_ELEMENT("INTEGER", 0,0,0),
|
{ .name = "INTEGER" },
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef JAVA
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MDB_BACKEND_ACCESS = 1,
|
MDB_BACKEND_ACCESS = 1,
|
||||||
MDB_BACKEND_ORACLE,
|
MDB_BACKEND_ORACLE,
|
||||||
@@ -275,35 +258,6 @@ static int mdb_col_is_shortdate(const MdbColumn *col) {
|
|||||||
return format && !strcmp(format, "Short Date");
|
return format && !strcmp(format, "Short Date");
|
||||||
}
|
}
|
||||||
|
|
||||||
MDB_DEPRECATED(char*,
|
|
||||||
mdb_get_coltype_string(MdbBackend *backend, int col_type))
|
|
||||||
{
|
|
||||||
static int warn_deprecated = 0;
|
|
||||||
static char buf[16];
|
|
||||||
|
|
||||||
if (!warn_deprecated) {
|
|
||||||
warn_deprecated = 1;
|
|
||||||
fprintf(stderr, "mdb_get_coltype_string is deprecated. Use mdb_get_colbacktype_string.\n");
|
|
||||||
}
|
|
||||||
if (col_type > 0x10 ) {
|
|
||||||
// return NULL;
|
|
||||||
snprintf(buf,sizeof(buf), "type %04x", col_type);
|
|
||||||
return buf;
|
|
||||||
} else
|
|
||||||
return backend->types_table[col_type].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
MDB_DEPRECATED(int,
|
|
||||||
mdb_coltype_takes_length(MdbBackend *backend, int col_type))
|
|
||||||
{
|
|
||||||
static int warn_deprecated = 0;
|
|
||||||
if (!warn_deprecated) {
|
|
||||||
warn_deprecated = 1;
|
|
||||||
fprintf(stderr, "mdb_coltype_takes_length is deprecated. Use mdb_colbacktype_takes_length.\n");
|
|
||||||
}
|
|
||||||
return backend->types_table[col_type].needs_length;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MdbBackendType*
|
const MdbBackendType*
|
||||||
mdb_get_colbacktype(const MdbColumn *col) {
|
mdb_get_colbacktype(const MdbColumn *col) {
|
||||||
MdbBackend *backend = col->table->entry->mdb->default_backend;
|
MdbBackend *backend = col->table->entry->mdb->default_backend;
|
||||||
@@ -325,8 +279,8 @@ mdb_get_colbacktype_string(const MdbColumn *col)
|
|||||||
const MdbBackendType *type = mdb_get_colbacktype(col);
|
const MdbBackendType *type = mdb_get_colbacktype(col);
|
||||||
if (!type) {
|
if (!type) {
|
||||||
// return NULL;
|
// return NULL;
|
||||||
static char buf[16];
|
static __thread char buf[16];
|
||||||
snprintf(buf,sizeof(buf), "type %04x", col->col_type);
|
snprintf(buf, sizeof(buf), "type %04x", col->col_type);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
return type->name;
|
return type->name;
|
||||||
@@ -339,23 +293,20 @@ mdb_colbacktype_takes_length(const MdbColumn *col)
|
|||||||
return type->needs_length;
|
return type->needs_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDB_DEPRECATED(void,
|
|
||||||
mdb_init_backends())
|
|
||||||
{
|
|
||||||
fprintf(stderr, "mdb_init_backends() is DEPRECATED and does nothing. Stop calling it.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _mdb_init_backends
|
* mdb_init_backends
|
||||||
*
|
*
|
||||||
* Initializes the mdb_backends hash and loads the builtin backends.
|
* Initializes the mdb_backends hash and loads the builtin backends.
|
||||||
* Use mdb_remove_backends() to destroy this hash when done.
|
* Use mdb_remove_backends() to destroy this hash when done.
|
||||||
*/
|
*/
|
||||||
MDB_CONSTRUCTOR(_mdb_init_backends)
|
void mdb_init_backends(MdbHandle *mdb)
|
||||||
{
|
{
|
||||||
mdb_backends = g_hash_table_new(g_str_hash, g_str_equal);
|
if (mdb->backends) {
|
||||||
|
mdb_remove_backends(mdb);
|
||||||
|
}
|
||||||
|
mdb->backends = g_hash_table_new(g_str_hash, g_str_equal);
|
||||||
|
|
||||||
mdb_register_backend("access",
|
mdb_register_backend(mdb, "access",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_DEFVALUES,
|
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_DEFVALUES,
|
||||||
mdb_access_types, NULL, NULL,
|
mdb_access_types, NULL, NULL,
|
||||||
"Date()", "Date()",
|
"Date()", "Date()",
|
||||||
@@ -365,7 +316,7 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
quote_schema_name_bracket_merge);
|
quote_schema_name_bracket_merge);
|
||||||
mdb_register_backend("sybase",
|
mdb_register_backend(mdb, "sybase",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_DEFVALUES,
|
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,
|
mdb_sybase_types, &mdb_sybase_shortdate_type, NULL,
|
||||||
"getdate()", "getdate()",
|
"getdate()", "getdate()",
|
||||||
@@ -375,7 +326,7 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
||||||
"COMMENT ON TABLE %s IS %s;\n",
|
"COMMENT ON TABLE %s IS %s;\n",
|
||||||
quote_schema_name_dquote);
|
quote_schema_name_dquote);
|
||||||
mdb_register_backend("oracle",
|
mdb_register_backend(mdb, "oracle",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES,
|
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES,
|
||||||
mdb_oracle_types, &mdb_oracle_shortdate_type, NULL,
|
mdb_oracle_types, &mdb_oracle_shortdate_type, NULL,
|
||||||
"current_date", "sysdate",
|
"current_date", "sysdate",
|
||||||
@@ -385,7 +336,7 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
||||||
"COMMENT ON TABLE %s IS %s;\n",
|
"COMMENT ON TABLE %s IS %s;\n",
|
||||||
quote_schema_name_dquote);
|
quote_schema_name_dquote);
|
||||||
mdb_register_backend("postgres",
|
mdb_register_backend(mdb, "postgres",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
||||||
mdb_postgres_types, &mdb_postgres_shortdate_type, &mdb_postgres_serial_type,
|
mdb_postgres_types, &mdb_postgres_shortdate_type, &mdb_postgres_serial_type,
|
||||||
"current_date", "now()",
|
"current_date", "now()",
|
||||||
@@ -395,7 +346,7 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
"COMMENT ON COLUMN %s.%s IS %s;\n",
|
||||||
"COMMENT ON TABLE %s IS %s;\n",
|
"COMMENT ON TABLE %s IS %s;\n",
|
||||||
quote_schema_name_dquote);
|
quote_schema_name_dquote);
|
||||||
mdb_register_backend("mysql",
|
mdb_register_backend(mdb, "mysql",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_INDEXES|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_INDEXES|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
||||||
mdb_mysql_types, &mdb_mysql_shortdate_type, NULL,
|
mdb_mysql_types, &mdb_mysql_shortdate_type, NULL,
|
||||||
"current_date", "now()",
|
"current_date", "now()",
|
||||||
@@ -405,7 +356,7 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
quote_schema_name_rquotes_merge);
|
quote_schema_name_rquotes_merge);
|
||||||
mdb_register_backend("sqlite",
|
mdb_register_backend(mdb, "sqlite",
|
||||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
MDB_SHEXP_DROPTABLE|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_BULK_INSERT,
|
||||||
mdb_sqlite_types, NULL, NULL,
|
mdb_sqlite_types, NULL, NULL,
|
||||||
"date('now')", "date('now')",
|
"date('now')", "date('now')",
|
||||||
@@ -415,11 +366,14 @@ MDB_CONSTRUCTOR(_mdb_init_backends)
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
quote_schema_name_rquotes_merge);
|
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*))
|
void mdb_register_backend(MdbHandle *mdb, char *backend_name, guint32 capabilities,
|
||||||
|
const MdbBackendType *backend_type, const MdbBackendType *type_shortdate, const 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));
|
MdbBackend *backend = (MdbBackend *) g_malloc0(sizeof(MdbBackend));
|
||||||
backend->capabilities = capabilities;
|
backend->capabilities = capabilities;
|
||||||
@@ -434,13 +388,7 @@ void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendTy
|
|||||||
backend->column_comment_statement = column_comment_statement;
|
backend->column_comment_statement = column_comment_statement;
|
||||||
backend->table_comment_statement = table_comment_statement;
|
backend->table_comment_statement = table_comment_statement;
|
||||||
backend->quote_schema_name = quote_schema_name;
|
backend->quote_schema_name = quote_schema_name;
|
||||||
g_hash_table_insert(mdb_backends, backend_name, backend);
|
g_hash_table_insert(mdb->backends, backend_name, backend);
|
||||||
}
|
|
||||||
|
|
||||||
MDB_DEPRECATED(void,
|
|
||||||
mdb_remove_backends())
|
|
||||||
{
|
|
||||||
fprintf(stderr, "mdb_remove_backends() is DEPRECATED and does nothing. Stop calling it.\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -449,10 +397,10 @@ mdb_remove_backends())
|
|||||||
* Removes all entries from and destroys the mdb_backends hash.
|
* Removes all entries from and destroys the mdb_backends hash.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
_mdb_remove_backends()
|
mdb_remove_backends(MdbHandle *mdb)
|
||||||
{
|
{
|
||||||
g_hash_table_foreach(mdb_backends, mdb_drop_backend, NULL);
|
g_hash_table_foreach(mdb->backends, mdb_drop_backend, NULL);
|
||||||
g_hash_table_destroy(mdb_backends);
|
g_hash_table_destroy(mdb->backends);
|
||||||
}
|
}
|
||||||
static void mdb_drop_backend(gpointer key, gpointer value, gpointer data)
|
static void mdb_drop_backend(gpointer key, gpointer value, gpointer data)
|
||||||
{
|
{
|
||||||
@@ -473,12 +421,15 @@ int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name)
|
|||||||
{
|
{
|
||||||
MdbBackend *backend;
|
MdbBackend *backend;
|
||||||
|
|
||||||
backend = (MdbBackend *) g_hash_table_lookup(mdb_backends, backend_name);
|
if (!mdb->backends) {
|
||||||
|
mdb_init_backends(mdb);
|
||||||
|
}
|
||||||
|
backend = (MdbBackend *) g_hash_table_lookup(mdb->backends, backend_name);
|
||||||
if (backend) {
|
if (backend) {
|
||||||
mdb->default_backend = backend;
|
mdb->default_backend = backend;
|
||||||
g_free(mdb->backend_name); // NULL is ok
|
g_free(mdb->backend_name); // NULL is ok
|
||||||
mdb->backend_name = (char *) g_strdup(backend_name);
|
mdb->backend_name = (char *) g_strdup(backend_name);
|
||||||
is_init = 0;
|
mdb->relationships_table = NULL;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -644,8 +595,7 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl
|
|||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
gchar *text = NULL; /* String to be returned */
|
gchar *text = NULL; /* String to be returned */
|
||||||
static char *bound[5]; /* Bound values */
|
char **bound = mdb->relationships_values; /* Bound values */
|
||||||
static MdbTableDef *table; /* Relationships table */
|
|
||||||
int backend = 0;
|
int backend = 0;
|
||||||
char *quoted_table_1, *quoted_column_1,
|
char *quoted_table_1, *quoted_column_1,
|
||||||
*quoted_table_2, *quoted_column_2,
|
*quoted_table_2, *quoted_column_2,
|
||||||
@@ -658,55 +608,42 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl
|
|||||||
backend = MDB_BACKEND_POSTGRES;
|
backend = MDB_BACKEND_POSTGRES;
|
||||||
} else if (!strcmp(mdb->backend_name, "sqlite")) {
|
} else if (!strcmp(mdb->backend_name, "sqlite")) {
|
||||||
backend = MDB_BACKEND_SQLITE;
|
backend = MDB_BACKEND_SQLITE;
|
||||||
} else {
|
} else if (!mdb->relationships_table) {
|
||||||
if (is_init == 0) { /* the first time through */
|
return (char *) g_strconcat(
|
||||||
is_init = 1;
|
"-- relationships are not implemented for ",
|
||||||
return (char *) g_strconcat(
|
mdb->backend_name, "\n", NULL);
|
||||||
"-- relationships are not implemented for ",
|
|
||||||
mdb->backend_name, "\n", NULL);
|
|
||||||
} else { /* the second time through */
|
|
||||||
is_init = 0;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_init == 0) {
|
if (!mdb->relationships_table) {
|
||||||
table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE);
|
mdb->relationships_table = mdb_read_table_by_name(mdb, "MSysRelationships", MDB_TABLE);
|
||||||
if ((!table) || (table->num_rows == 0)) {
|
if (!mdb->relationships_table || !mdb->relationships_table->num_rows) {
|
||||||
fprintf(stderr, "No MSysRelationships\n");
|
fprintf(stderr, "No MSysRelationships\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mdb_read_columns(table);
|
mdb_read_columns(mdb->relationships_table);
|
||||||
for (i=0;i<5;i++) {
|
for (i=0;i<5;i++) {
|
||||||
bound[i] = (char *) g_malloc0(MDB_BIND_SIZE);
|
bound[i] = (char *) g_malloc0(MDB_BIND_SIZE);
|
||||||
}
|
}
|
||||||
mdb_bind_column_by_name(table, "szColumn", bound[0], NULL);
|
mdb_bind_column_by_name(mdb->relationships_table, "szColumn", bound[0], NULL);
|
||||||
mdb_bind_column_by_name(table, "szObject", bound[1], NULL);
|
mdb_bind_column_by_name(mdb->relationships_table, "szObject", bound[1], NULL);
|
||||||
mdb_bind_column_by_name(table, "szReferencedColumn", bound[2], NULL);
|
mdb_bind_column_by_name(mdb->relationships_table, "szReferencedColumn", bound[2], NULL);
|
||||||
mdb_bind_column_by_name(table, "szReferencedObject", bound[3], NULL);
|
mdb_bind_column_by_name(mdb->relationships_table, "szReferencedObject", bound[3], NULL);
|
||||||
mdb_bind_column_by_name(table, "grbit", bound[4], NULL);
|
mdb_bind_column_by_name(mdb->relationships_table, "grbit", bound[4], NULL);
|
||||||
mdb_rewind_table(table);
|
mdb_rewind_table(mdb->relationships_table);
|
||||||
|
|
||||||
is_init = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!table) {
|
|
||||||
fprintf(stderr, "table is NULL\n");
|
|
||||||
}
|
|
||||||
if (table->cur_row >= table->num_rows) { /* past the last row */
|
|
||||||
for (i=0;i<5;i++)
|
|
||||||
g_free(bound[i]);
|
|
||||||
is_init = 0;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (mdb->relationships_table->cur_row >= mdb->relationships_table->num_rows) { /* past the last row */
|
||||||
|
for (i=0;i<5;i++)
|
||||||
|
g_free(bound[i]);
|
||||||
|
mdb->relationships_table = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!mdb_fetch_row(table)) {
|
if (!mdb_fetch_row(mdb->relationships_table)) {
|
||||||
for (i=0;i<5;i++)
|
for (i=0;i<5;i++)
|
||||||
g_free(bound[i]);
|
g_free(bound[i]);
|
||||||
is_init = 0;
|
mdb->relationships_table = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!tablename || !strcmp(bound[1], tablename))
|
if (!tablename || !strcmp(bound[1], tablename))
|
||||||
@@ -968,4 +905,3 @@ mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *dbnamespace
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include "mdbtools.h"
|
#include "mdbtools.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -303,6 +304,7 @@ mdb_close(MdbHandle *mdb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mdb_iconv_close(mdb);
|
mdb_iconv_close(mdb);
|
||||||
|
mdb_remove_backends(mdb);
|
||||||
|
|
||||||
g_free(mdb);
|
g_free(mdb);
|
||||||
}
|
}
|
||||||
@@ -322,19 +324,24 @@ MdbHandle *mdb_clone_handle(MdbHandle *mdb)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
newmdb = (MdbHandle *) g_memdup(mdb, sizeof(MdbHandle));
|
newmdb = (MdbHandle *) g_memdup(mdb, sizeof(MdbHandle));
|
||||||
newmdb->stats = NULL;
|
|
||||||
|
memset(&newmdb->catalog, 0, sizeof(MdbHandle) - offsetof(MdbHandle, catalog));
|
||||||
|
|
||||||
newmdb->catalog = g_ptr_array_new();
|
newmdb->catalog = g_ptr_array_new();
|
||||||
for (i=0;i<mdb->num_catalog;i++) {
|
for (i=0;i<mdb->num_catalog;i++) {
|
||||||
entry = g_ptr_array_index(mdb->catalog,i);
|
entry = g_ptr_array_index(mdb->catalog,i);
|
||||||
data = g_memdup(entry,sizeof(MdbCatalogEntry));
|
data = g_memdup(entry,sizeof(MdbCatalogEntry));
|
||||||
|
data->mdb = newmdb;
|
||||||
data->props = NULL;
|
data->props = NULL;
|
||||||
g_ptr_array_add(newmdb->catalog, data);
|
g_ptr_array_add(newmdb->catalog, data);
|
||||||
}
|
}
|
||||||
mdb->backend_name = NULL;
|
|
||||||
|
mdb_iconv_init(newmdb);
|
||||||
|
mdb_set_default_backend(newmdb, mdb->backend_name);
|
||||||
|
|
||||||
if (mdb->f) {
|
if (mdb->f) {
|
||||||
mdb->f->refs++;
|
mdb->f->refs++;
|
||||||
}
|
}
|
||||||
mdb_iconv_init(mdb);
|
|
||||||
|
|
||||||
return newmdb;
|
return newmdb;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user