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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/monetdb-developers


-- 
| Dr. Stefan Manegold | mailto:[email protected] |
| 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       |

------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-developers

Reply via email to