On Sun, May 10, 2009 at 02:52:14PM +0200, Stefan de Konink wrote:
Stefan de Konink wrote:
I am looking at this now I agree with you that this could help a lot. Will need to move some stuff around because of the -D option that (imho) should inline everything.
As attached.
Ok to commit?
As Fabian suggested, please explain during MADAM what you did why and how, and then we'll discuss.
If so could anyone help with approving tests?
First, see the Mtest & Mapprove documentation in .../testing/README and/or http://monetdb.cwi.nl/projects/monetdb/Development/TestWeb/Mtest/index.html More then during/after MADAM. Stefan
Stefan
Index: dump.c =================================================================== RCS file: /cvsroot/monetdb/clients/src/mapiclient/dump.c,v retrieving revision 1.38 diff -u -r1.38 dump.c --- dump.c 26 Apr 2009 08:56:59 -0000 1.38 +++ dump.c 10 May 2009 12:50:26 -0000 @@ -105,6 +105,279 @@ return sname; }
+static void dump_constraints(Mapi mid, char *schema, char *tname, stream *toConsole) { + + MapiHdl hdl; + int cnt; + char *query; + size_t maxquerylen = 0; + + if (tname == NULL) { + query = "SELECT \"c\".\"name\"," /* 0 */ + "\"c\".\"null\"," /* 1 */ + "\"c\".\"default\"," /* 2 */ + "\"c\".\"number\"," /* 3 */ + "\"s\".\"name\"," /* 4 */ + "\"t\".\"name\" " /* 5 */ + "FROM \"sys\".\"_columns\" \"c\", " + "\"sys\".\"_tables\" \"t\", " + "\"sys\".\"schemas\" \"s\" " + "WHERE \"c\".\"table_id\" = \"t\".\"id\" " + "AND \"t\".\"schema_id\" = \"s\".\"id\" " + "ORDER BY \"s\".\"name\", \"t\".\"name\", \"number\""; + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { + if (hdl) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + } else + mapi_explain(mid, stderr); + goto bailout; + } + + while ((mapi_fetch_row(hdl)) != 0) { + char *c_name = mapi_fetch_field(hdl, 0); + char *c_null = mapi_fetch_field(hdl, 1); + char *c_default = mapi_fetch_field(hdl, 2); + char *s_name = mapi_fetch_field(hdl, 4); + char *t_name = mapi_fetch_field(hdl, 5); + + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + + if (strcmp(c_null, "false") == 0) { + stream_printf(toConsole, "ALTER TABLE "); + quoted_print(toConsole, s_name); + stream_printf(toConsole, "."); + quoted_print(toConsole, t_name); + stream_printf(toConsole, " ALTER COLUMN "); + quoted_print(toConsole, c_name); + stream_printf(toConsole, " SET NOT NULL;\n"); + } + + if (c_default != NULL) { + stream_printf(toConsole, "ALTER TABLE "); + quoted_print(toConsole, s_name); + stream_printf(toConsole, "."); + quoted_print(toConsole, t_name); + stream_printf(toConsole, " ALTER COLUMN "); + quoted_print(toConsole, c_name); + stream_printf(toConsole, " SET DEFAULT %s;\n", c_default); + } + } + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + mapi_close_handle(hdl); + } + + /* presumably we don't need to order on id, since there should + only be a single primary key, but it doesn't hurt, and the + code is then close to the code for the uniqueness + constraint */ + + if (tname != NULL) { + maxquerylen = 512 + strlen(tname) + strlen(schema); + query = malloc(maxquerylen); + snprintf(query, maxquerylen, + "SELECT \"kc\".\"column\", " /* 0 */ + "\"kc\".\"nr\", " /* 1 */ + "\"k\".\"name\", " /* 2 */ + "\"k\".\"id\", " /* 3 */ + "\"s\".\"name\", " /* 4 */ + "\"t\".\"name\" " /* 5 */ + "FROM \"sys\".\"keycolumns\" \"kc\", " + "\"sys\".\"keys\" \"k\", " + "\"sys\".\"schemas\" \"s\", " + "\"sys\".\"_tables\" \"t\" " + "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " + "\"k\".\"table_id\" = \"t\".\"id\" AND " + "\"k\".\"type\" = 0 AND " + "\"t\".\"schema_id\" = \"s\".\"id\" AND " + "\"s\".\"name\" = '%s' AND " + "\"t\".\"name\" = '%s' " + "ORDER BY \"id\", \"nr\"", schema, tname); + } else { + query = "SELECT \"kc\".\"column\"," /* 0 */ + "\"kc\".\"nr\", " /* 1 */ + "\"k\".\"name\", " /* 2 */ + "\"k\".\"id\"," /* 3 */ + "\"s\".\"name\"," /* 4 */ + "\"t\".\"name\" " /* 5 */ + "FROM \"sys\".\"keycolumns\" \"kc\", " + "\"sys\".\"keys\" \"k\", " + "\"sys\".\"schemas\" \"s\", " + "\"sys\".\"_tables\" \"t\" " + "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " + "\"k\".\"table_id\" = \"t\".\"id\" AND " + "\"k\".\"type\" = 0 AND " + "\"t\".\"schema_id\" = \"s\".\"id\" " + "ORDER BY \"s\".\"name\", \"t\".\"name\", \"id\", \"nr\""; + } + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { + if (hdl) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + } else + mapi_explain(mid, stderr); + goto bailout; + } + cnt = 0; + while ((mapi_fetch_row(hdl)) != 0) { + char *c_column = mapi_fetch_field(hdl, 0); + char *k_name = mapi_fetch_field(hdl, 2); + char *s_name = mapi_fetch_field(hdl, 4); + char *t_name = mapi_fetch_field(hdl, 5); + + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + if (cnt == 0) { + if (tname) { + stream_printf(toConsole, ",\n\t"); + } else { + if (s_name) { + if (cnt > 0) stream_printf(toConsole, ");\n"); + stream_printf(toConsole, "ALTER TABLE "); + quoted_print(toConsole, s_name); + stream_printf(toConsole, "."); + quoted_print(toConsole, t_name); + stream_printf(toConsole, " ADD "); + } + } + + if (k_name) { + stream_printf(toConsole, "CONSTRAINT "); + quoted_print(toConsole, k_name); + stream_write(toConsole, " ", 1, 1); + } + stream_printf(toConsole, "PRIMARY KEY ("); + } else + stream_printf(toConsole, ", "); + quoted_print(toConsole, c_column); + cnt++; + } + if (cnt) { + stream_printf(toConsole, ")"); + if (!tname) + stream_printf(toConsole, ";\n"); + } + + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + mapi_close_handle(hdl); + + if (tname != NULL) { + snprintf(query, maxquerylen, + "SELECT \"kc\".\"column\"," /* 0 */ + "\"kc\".\"nr\"," /* 1 */ + "\"k\".\"name\"," /* 2 */ + "\"k\".\"id\"," /* 3 */ + "\"s\".\"name\"," /* 4 */ + "\"t\".\"name\" " /* 5 */ + "FROM \"sys\".\"keycolumns\" \"kc\", " + "\"sys\".\"keys\" \"k\", " + "\"sys\".\"schemas\" \"s\", " + "\"sys\".\"_tables\" \"t\" " + "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " + "\"k\".\"table_id\" = \"t\".\"id\" AND " + "\"k\".\"type\" = 1 AND " + "\"t\".\"schema_id\" = \"s\".\"id\" AND " + "\"s\".\"name\" = '%s' AND " + "\"t\".\"name\" = '%s' " + "ORDER BY \"id\", \"nr\"", schema, tname); + } else { + query = "SELECT \"kc\".\"column\"," /* 0 */ + "\"kc\".\"nr\"," /* 1 */ + "\"k\".\"name\"," /* 2 */ + "\"k\".\"id\"," /* 3 */ + "\"s\".\"name\"," /* 4 */ + "\"t\".\"name\" " /* 5 */ + "FROM \"sys\".\"keycolumns\" \"kc\", " + "\"sys\".\"keys\" \"k\", " + "\"sys\".\"schemas\" \"s\", " + "\"sys\".\"_tables\" \"t\" " + "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " + "\"k\".\"table_id\" = \"t\".\"id\" AND " + "\"k\".\"type\" = 1 AND " + "\"t\".\"schema_id\" = \"s\".\"id\" " + "ORDER BY \"s\".\"name\", \"t\".\"name\",\"id\", \"nr\""; + } + + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { + if (hdl) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + } else + mapi_explain(mid, stderr); + goto bailout; + } + cnt = 0; + while ((mapi_fetch_row(hdl)) != 0) { + char *c_column = mapi_fetch_field(hdl, 0); + char *kc_nr = mapi_fetch_field(hdl, 1); + char *k_name = mapi_fetch_field(hdl, 2); + char *s_name = mapi_fetch_field(hdl, 4); + char *t_name = mapi_fetch_field(hdl, 5); + + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + if (strcmp(kc_nr, "0") == 0) { + if (cnt) + stream_write(toConsole, ")", 1, 1); + + if (t_name) { + stream_printf(toConsole, ",\n\t"); + } else { + if (cnt > 0) stream_printf(toConsole, ");\n"); + stream_printf(toConsole, "ALTER TABLE "); + quoted_print(toConsole, s_name); + stream_printf(toConsole, "."); + quoted_print(toConsole, t_name); + stream_printf(toConsole, " ADD "); + } + + if (k_name) { + stream_printf(toConsole, "CONSTRAINT "); + quoted_print(toConsole, k_name); + stream_write(toConsole, " ", 1, 1); + } + stream_printf(toConsole, "UNIQUE ("); + cnt = 1; + } else + stream_printf(toConsole, ", "); + quoted_print(toConsole, c_column); + } + if (cnt) { + stream_write(toConsole, ")", 1, 1); + if (!tname) + stream_printf(toConsole, ";\n"); + } + + if (mapi_error(mid)) { + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + goto bailout; + } + mapi_close_handle(hdl); + +bailout: + if (query != NULL && maxquerylen != 0) + free(query); +} + static void dump_foreign_keys(Mapi mid, char *schema, char *tname, stream *toConsole) { @@ -117,14 +390,14 @@ maxquerylen = 1024 + strlen(tname) + strlen(schema); query = malloc(maxquerylen); snprintf(query, maxquerylen, - "SELECT \"ps\".\"name\"," /* 0 */ - "\"pkt\".\"name\"," /* 1 */ - "\"pkkc\".\"column\"," /* 2 */ - "\"fkkc\".\"column\"," /* 3 */ - "\"fkkc\".\"nr\"," /* 4 */ - "\"fkk\".\"name\"," /* 5 */ - "\"fkk\".\"action\"," /* 6 */ - "\"fs\".\"name\"," /* 7 */ + "SELECT \"ps\".\"name\", " /* 0 */ + "\"pkt\".\"name\", " /* 1 */ + "\"pkkc\".\"column\", " /* 2 */ + "\"fkkc\".\"column\", " /* 3 */ + "\"fkkc\".\"nr\", " /* 4 */ + "\"fkk\".\"name\", " /* 5 */ + "\"fkk\".\"action\", " /* 6 */ + "\"fs\".\"name\", " /* 7 */ "\"fkt\".\"name\" " /* 8 */ "FROM \"sys\".\"_tables\" \"fkt\"," "\"sys\".\"keycolumns\" \"fkkc\"," @@ -478,71 +751,14 @@ } else { stream_printf(toConsole, "%s(%s,%s)", c_type, c_type_digits, c_type_scale); } - if (strcmp(c_null, "false") == 0) - stream_printf(toConsole, " NOT NULL"); - if (c_default != NULL) - stream_printf(toConsole, " DEFAULT %s", c_default); - cnt++; - } - if (mapi_error(mid)) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - goto bailout; - } - mapi_close_handle(hdl); - /* presumably we don't need to order on id, since there should - only be a single primary key, but it doesn't hurt, and the - code is then close to the code for the uniqueness - constraint */ - snprintf(query, maxquerylen, - "SELECT \"kc\".\"column\"," /* 0 */ - "\"kc\".\"nr\", " /* 1 */ - "\"k\".\"name\", " /* 2 */ - "\"k\".\"id\" " /* 3 */ - "FROM \"sys\".\"keycolumns\" \"kc\", " - "\"sys\".\"keys\" \"k\", " - "\"sys\".\"schemas\" \"s\", " - "\"sys\".\"_tables\" \"t\" " - "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " - "\"k\".\"table_id\" = \"t\".\"id\" AND " - "\"k\".\"type\" = 0 AND " - "\"t\".\"schema_id\" = \"s\".\"id\" AND " - "\"s\".\"name\" = '%s' AND " - "\"t\".\"name\" = '%s' " - "ORDER BY \"id\", \"nr\"", schema, tname); - if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { - if (hdl) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - } else - mapi_explain(mid, stderr); - goto bailout; - } - cnt = 0; - while ((mapi_fetch_row(hdl)) != 0) { - char *c_column = mapi_fetch_field(hdl, 0); - char *k_name = mapi_fetch_field(hdl, 2); - - if (mapi_error(mid)) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - goto bailout; + if (describe) { + if (strcmp(c_null, "false") == 0) + stream_printf(toConsole, " NOT NULL"); + if (c_default != NULL) + stream_printf(toConsole, " DEFAULT %s", c_default); } - if (cnt == 0) { - stream_printf(toConsole, ",\n\t"); - if (k_name) { - stream_printf(toConsole, "CONSTRAINT "); - quoted_print(toConsole, k_name); - stream_write(toConsole, " ", 1, 1); - } - stream_printf(toConsole, "PRIMARY KEY ("); - } else - stream_printf(toConsole, ", "); - quoted_print(toConsole, c_column); cnt++; } - if (cnt) - stream_printf(toConsole, ")"); if (mapi_error(mid)) { mapi_explain_query(hdl, stderr); mapi_close_handle(hdl); @@ -550,64 +766,8 @@ } mapi_close_handle(hdl);
- snprintf(query, maxquerylen, - "SELECT \"kc\".\"column\"," /* 0 */ - "\"kc\".\"nr\", " /* 1 */ - "\"k\".\"name\", " /* 2 */ - "\"k\".\"id\" " /* 3 */ - "FROM \"sys\".\"keycolumns\" \"kc\", " - "\"sys\".\"keys\" \"k\", " - "\"sys\".\"schemas\" \"s\", " - "\"sys\".\"_tables\" \"t\" " - "WHERE \"kc\".\"id\" = \"k\".\"id\" AND " - "\"k\".\"table_id\" = \"t\".\"id\" AND " - "\"k\".\"type\" = 1 AND " - "\"t\".\"schema_id\" = \"s\".\"id\" AND " - "\"s\".\"name\" = '%s' AND " - "\"t\".\"name\" = '%s' " - "ORDER BY \"id\", \"nr\"", schema, tname); - if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { - if (hdl) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - } else - mapi_explain(mid, stderr); - goto bailout; - } - cnt = 0; - while ((mapi_fetch_row(hdl)) != 0) { - char *c_column = mapi_fetch_field(hdl, 0); - char *kc_nr = mapi_fetch_field(hdl, 1); - char *k_name = mapi_fetch_field(hdl, 2); - - if (mapi_error(mid)) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - goto bailout; - } - if (strcmp(kc_nr, "0") == 0) { - if (cnt) - stream_write(toConsole, ")", 1, 1); - stream_printf(toConsole, ",\n\t"); - if (k_name) { - stream_printf(toConsole, "CONSTRAINT "); - quoted_print(toConsole, k_name); - stream_write(toConsole, " ", 1, 1); - } - stream_printf(toConsole, "UNIQUE ("); - cnt = 1; - } else - stream_printf(toConsole, ", "); - quoted_print(toConsole, c_column); - } - if (cnt) - stream_write(toConsole, ")", 1, 1); - if (mapi_error(mid)) { - mapi_explain_query(hdl, stderr); - mapi_close_handle(hdl); - goto bailout; - } - mapi_close_handle(hdl); + if (describe) + dump_constraints(mid, schema, tname, toConsole);
if (foreign) dump_foreign_keys(mid, schema, tname, toConsole); @@ -1158,6 +1318,7 @@ mapi_close_handle(hdl);
if (!describe) { + dump_constraints(mid, NULL, NULL, toConsole); dump_foreign_keys(mid, NULL, NULL, toConsole);
/* dump sequences, part 2 */
------------------------------------------------------------------------------ The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your production scanning environment may not be a perfect world - but thanks to Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 Series Scanner you'll get full speed at 300 dpi even with all image processing features enabled. http://p.sf.net/sfu/kodak-com _______________________________________________ Monetdb-developers mailing list Monetdb-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/monetdb-developers
-- | Dr. Stefan Manegold | mailto:Stefan.Manegold@cwi.nl | | CWI, P.O.Box 94079 | http://www.cwi.nl/~manegold/ | | 1090 GB Amsterdam | Tel.: +31 (20) 592-4212 | | The Netherlands | Fax : +31 (20) 592-4312 |