mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-06-28 15:39:02 +08:00
patch default_values from Nirgal Vourgère
This commit is contained in:
parent
39277312d4
commit
d794c6e2a1
@ -14,6 +14,8 @@ OPTIONS
|
||||
--no-drop-table Don't issue DROP TABLE statement. This is the default.
|
||||
--not-null Issue NOT NULL constraints. This is the default.
|
||||
--no-not-null Don't issue NOT NULL constraints.
|
||||
--default-values Issue DEFAULT values.
|
||||
--no-default-values Don't issue DEFAULT values. This is the default.
|
||||
--not-empty Issue CHECK <> '' constraints.
|
||||
--no-not-empty Don't issue CHECK <> '' constraints. This is the default.
|
||||
--indexes Export INDEXes. This is the default.
|
||||
|
@ -159,9 +159,10 @@ enum {
|
||||
MDB_SHEXP_CST_NOTNULL = 1<<1, /* generate NOT NULL constraints */
|
||||
MDB_SHEXP_CST_NOTEMPTY = 1<<2, /* <>'' constraints */
|
||||
MDB_SHEXP_COMMENTS = 1<<3, /* export comments on columns & tables */
|
||||
MDB_SHEXP_INDEXES = 1<<4, /* export indices */
|
||||
MDB_SHEXP_RELATIONS = 1<<5, /* export relation (foreign keys) */
|
||||
MDB_SHEXP_SANITIZE = 1<<6 /* clean up names */
|
||||
MDB_SHEXP_DEFVALUES = 1<<4, /* export default values */
|
||||
MDB_SHEXP_INDEXES = 1<<5, /* export indices */
|
||||
MDB_SHEXP_RELATIONS = 1<<6, /* export relation (foreign keys) */
|
||||
MDB_SHEXP_SANITIZE = 1<<7 /* clean up names */
|
||||
};
|
||||
#define MDB_SHEXP_DEFAULT (MDB_SHEXP_CST_NOTNULL | MDB_SHEXP_COMMENTS | MDB_SHEXP_INDEXES | MDB_SHEXP_RELATIONS)
|
||||
|
||||
@ -184,6 +185,8 @@ typedef struct {
|
||||
MdbBackendType *types_table;
|
||||
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;
|
||||
@ -487,7 +490,7 @@ 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_register_backend(char *backend_name, guint32 capabilities, MdbBackendType *backend_type, MdbBackendType *type_shortdate, MdbBackendType *type_autonum, 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_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 int mdb_set_default_backend(MdbHandle *mdb, const char *backend_name);
|
||||
extern void mdb_print_schema(MdbHandle *mdb, FILE *outfile, char *tabname, char *namespace, guint32 export_options);
|
||||
|
@ -15,7 +15,7 @@
|
||||
<widget class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">33</property>
|
||||
<property name="n_rows">9</property>
|
||||
<property name="n_rows">10</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="column_spacing">30</property>
|
||||
<property name="row_spacing">8</property>
|
||||
@ -247,8 +247,8 @@
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">8</property>
|
||||
<property name="bottom_attach">9</property>
|
||||
<property name="top_attach">9</property>
|
||||
<property name="bottom_attach">10</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
@ -266,27 +266,8 @@
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">7</property>
|
||||
<property name="bottom_attach">8</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkCheckButton" id="cstnotempty_checkbox">
|
||||
<property name="label" translatable="yes">Include Not Empty constraints</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">5</property>
|
||||
<property name="bottom_attach">6</property>
|
||||
<property name="top_attach">8</property>
|
||||
<property name="bottom_attach">9</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
@ -304,8 +285,8 @@
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">6</property>
|
||||
<property name="bottom_attach">7</property>
|
||||
<property name="top_attach">7</property>
|
||||
<property name="bottom_attach">8</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
@ -325,6 +306,47 @@
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkCheckButton" id="cstnotempty_checkbox">
|
||||
<property name="label" translatable="yes">Include Not Empty constraints</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">6</property>
|
||||
<property name="bottom_attach">7</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkCheckButton" id="defaults_checkbox1">
|
||||
<property name="label" translatable="yes">Include Default values</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">5</property>
|
||||
<property name="bottom_attach">6</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="fill">False</property>
|
||||
|
@ -40,6 +40,7 @@ static struct {
|
||||
{ "cstnotnull_checkbox", MDB_SHEXP_CST_NOTNULL },
|
||||
{ "cstnotempty_checkbox", MDB_SHEXP_CST_NOTEMPTY},
|
||||
{ "comments_checkbox", MDB_SHEXP_COMMENTS},
|
||||
{ "defaults_checkbox", MDB_SHEXP_DEFVALUES },
|
||||
{ "index_checkbox", MDB_SHEXP_INDEXES},
|
||||
{ "rel_checkbox", MDB_SHEXP_RELATIONS}
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* MDB Tools - A library for reading MS Access database files
|
||||
* Copyright (C) 2000 Brian Bruns
|
||||
* Copyright (C) 2000-2011 Brian Bruns and others
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
@ -255,7 +255,7 @@ quote_schema_name_rquotes_merge(const gchar* schema, const gchar *name)
|
||||
}
|
||||
|
||||
static gchar*
|
||||
quote_with_squotes(gchar* value)
|
||||
quote_with_squotes(const gchar* value)
|
||||
{
|
||||
return quote_generic(value, '\'', '\'');
|
||||
}
|
||||
@ -337,8 +337,9 @@ void mdb_init_backends()
|
||||
mdb_backends = g_hash_table_new(g_str_hash, g_str_equal);
|
||||
|
||||
mdb_register_backend("access",
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_SANITIZE,
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_DEFVALUES|MDB_SHEXP_SANITIZE,
|
||||
mdb_access_types, NULL, NULL,
|
||||
"Date()", "Date()",
|
||||
"-- That file uses encoding %s\n",
|
||||
"DROP TABLE %s;\n",
|
||||
NULL,
|
||||
@ -346,8 +347,9 @@ void mdb_init_backends()
|
||||
NULL,
|
||||
quote_schema_name_bracket_merge);
|
||||
mdb_register_backend("sybase",
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_SANITIZE,
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_SANITIZE,
|
||||
mdb_sybase_types, &mdb_sybase_shortdate_type, NULL,
|
||||
"getdate()", "getdate()",
|
||||
"-- That file uses encoding %s\n",
|
||||
"DROP TABLE %s;\n",
|
||||
"ALTER TABLE %s ADD CHECK (%s <>'');\n",
|
||||
@ -355,8 +357,9 @@ void mdb_init_backends()
|
||||
"COMMENT ON TABLE %s IS %s;\n",
|
||||
quote_schema_name_dquote);
|
||||
mdb_register_backend("oracle",
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_SANITIZE,
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_SANITIZE,
|
||||
mdb_oracle_types, &mdb_oracle_shortdate_type, NULL,
|
||||
"current_date", "sysdate",
|
||||
"-- That file uses encoding %s\n",
|
||||
"DROP TABLE %s;\n",
|
||||
NULL,
|
||||
@ -364,8 +367,9 @@ void mdb_init_backends()
|
||||
"COMMENT ON TABLE %s IS %s;\n",
|
||||
quote_schema_name_dquote);
|
||||
mdb_register_backend("postgres",
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_INDEXES|MDB_SHEXP_RELATIONS|MDB_SHEXP_SANITIZE,
|
||||
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_SANITIZE,
|
||||
mdb_postgres_types, &mdb_postgres_shortdate_type, &mdb_postgres_serial_type,
|
||||
"current_date", "now()",
|
||||
"SET client_encoding = '%s';\n",
|
||||
"DROP TABLE IF EXISTS %s;\n",
|
||||
"ALTER TABLE %s ADD CHECK (%s <>'');\n",
|
||||
@ -373,8 +377,9 @@ void mdb_init_backends()
|
||||
"COMMENT ON TABLE %s IS %s;\n",
|
||||
quote_schema_name_dquote);
|
||||
mdb_register_backend("mysql",
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_SANITIZE,
|
||||
MDB_SHEXP_DROPTABLE|MDB_SHEXP_CST_NOTNULL|MDB_SHEXP_CST_NOTEMPTY|MDB_SHEXP_COMMENTS|MDB_SHEXP_DEFVALUES|MDB_SHEXP_SANITIZE,
|
||||
mdb_mysql_types, &mdb_mysql_shortdate_type, NULL,
|
||||
"current_date", "now()",
|
||||
"-- That file uses encoding %s\n",
|
||||
"DROP TABLE IF EXISTS %s;\n",
|
||||
"ALTER TABLE %s ADD CHECK (%s <>'');\n",
|
||||
@ -382,13 +387,15 @@ void mdb_init_backends()
|
||||
"COMMENT ON TABLE %s IS %s;\n",
|
||||
quote_schema_name_rquotes_merge);
|
||||
}
|
||||
void mdb_register_backend(char *backend_name, guint32 capabilities, MdbBackendType *backend_type, MdbBackendType *type_shortdate, MdbBackendType *type_autonum, 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*))
|
||||
{
|
||||
MdbBackend *backend = (MdbBackend *) g_malloc0(sizeof(MdbBackend));
|
||||
backend->capabilities = capabilities;
|
||||
backend->types_table = backend_type;
|
||||
backend->type_shortdate = type_shortdate;
|
||||
backend->type_autonum = type_autonum;
|
||||
backend->short_now = short_now;
|
||||
backend->long_now = long_now;
|
||||
backend->charset_statement = charset_statement;
|
||||
backend->drop_statement = drop_statement;
|
||||
backend->constaint_not_empty_statement = constaint_not_empty_statement;
|
||||
@ -661,7 +668,7 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *namespace, gu
|
||||
char* quoted_name;
|
||||
int sanitize = export_options & MDB_SHEXP_SANITIZE;
|
||||
MdbProperties *props;
|
||||
char *prop_value;
|
||||
const char *prop_value;
|
||||
|
||||
if (sanitize)
|
||||
quoted_table_name = sanitize_name(entry->object_name);
|
||||
@ -712,6 +719,44 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *namespace, gu
|
||||
fputs(" NOT NULL", outfile);
|
||||
}
|
||||
}
|
||||
|
||||
if (export_options & MDB_SHEXP_DEFVALUES) {
|
||||
int done = 0;
|
||||
if (col->props) {
|
||||
gchar *defval = g_hash_table_lookup(col->props->hash, "DefaultValue");
|
||||
if (defval) {
|
||||
size_t def_len = strlen(defval);
|
||||
fputs(" DEFAULT ", outfile);
|
||||
/* ugly hack to detect the type */
|
||||
if (defval[0]=='"' && defval[def_len-1]=='"') {
|
||||
/* this is a string */
|
||||
gchar *output_default = malloc(def_len-1);
|
||||
gchar *output_default_escaped = malloc(def_len-1);
|
||||
memcpy(output_default, defval+1, def_len-2);
|
||||
output_default[def_len-2] = 0;
|
||||
output_default_escaped = quote_with_squotes(output_default);
|
||||
fputs(output_default_escaped, outfile);
|
||||
g_free(output_default_escaped);
|
||||
free(output_default);
|
||||
} else if (!strcmp(defval, "Yes"))
|
||||
fputs("TRUE", outfile);
|
||||
else if (!strcmp(defval, "No"))
|
||||
fputs("FALSE", outfile);
|
||||
else if (!strcasecmp(defval, "date()")) {
|
||||
if (!strcmp(mdb_col_get_prop(col, "Format"), "Short Date"))
|
||||
fputs(mdb->default_backend->short_now, outfile);
|
||||
else
|
||||
fputs(mdb->default_backend->long_now, outfile);
|
||||
}
|
||||
else
|
||||
fputs(defval, outfile);
|
||||
}
|
||||
done = 1;
|
||||
}
|
||||
if (!done && col->col_type == MDB_BOOL)
|
||||
/* access booleans are false by default */
|
||||
fputs(" DEFAULT FALSE", outfile);
|
||||
}
|
||||
if (i < table->num_cols - 1)
|
||||
fputs(", \n", outfile);
|
||||
else
|
||||
@ -722,8 +767,6 @@ generate_table_schema(FILE *outfile, MdbCatalogEntry *entry, char *namespace, gu
|
||||
|
||||
/* Add the constraints on columns */
|
||||
for (i = 0; i < table->num_cols; i++) {
|
||||
const gchar *prop_value;
|
||||
|
||||
col = g_ptr_array_index (table->columns, i);
|
||||
props = col->props;
|
||||
if (!props)
|
||||
|
@ -52,6 +52,8 @@ main (int argc, char **argv)
|
||||
{"namespace", 1, NULL, 'N'},
|
||||
{"drop-table", 0, NULL, 0},
|
||||
{"no-drop-table", 0, NULL, 0},
|
||||
{"default-values", 0, NULL, 0},
|
||||
{"no-default-values", 0, NULL, 0},
|
||||
{"not-null", 0, NULL, 0},
|
||||
{"no-not-null", 0, NULL, 0},
|
||||
{"not-empty", 0, NULL, 0},
|
||||
@ -88,6 +90,14 @@ main (int argc, char **argv)
|
||||
export_options &= ~MDB_SHEXP_CST_NOTNULL;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(long_options[option_index].name, "default-values")) {
|
||||
export_options |= MDB_SHEXP_DEFVALUES;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(long_options[option_index].name, "no-default-values")) {
|
||||
export_options &= ~MDB_SHEXP_DEFVALUES;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(long_options[option_index].name, "not-empty")) {
|
||||
export_options |= MDB_SHEXP_CST_NOTEMPTY;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user