diff --git a/ChangeLog b/ChangeLog index 88d4b7d..9408d7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +Wed Oct 27 22:32:33 CDT 2004 Jeff Smith + * src/util/mdb-sql.c: Various mdb-sql improvements + Sun Oct 24 23:07:16 CDT 2004 Jeff Smith * configure.in: * src/gmdb2/Makefile.am: diff --git a/src/util/mdb-sql.c b/src/util/mdb-sql.c index a1c6fc9..497886f 100644 --- a/src/util/mdb-sql.c +++ b/src/util/mdb-sql.c @@ -52,7 +52,7 @@ extern int read_history (); #include "dmalloc.h" #endif -void dump_results(MdbSQL *sql); +void dump_results(MdbSQL *sql, char *delimiter); void dump_results_pp(MdbSQL *sql); int yyparse(void); @@ -61,7 +61,6 @@ int yyparse(void); int headers = 1; int footers = 1; int pretty_print = 1; -char *delimiter; int showplan = 0; int noexec = 0; @@ -112,6 +111,10 @@ do_set_cmd(MdbSQL *sql, char *s) { char *level1, *level2; level1 = strtok(s, " \t\n"); + if (!level1) { + printf("Usage: set [stats|showplan|noexec] [on|off]\n"); + return; + } if (!strcmp(level1,"stats")) { level2 = strtok(NULL, " \t"); if (!level2) { @@ -125,6 +128,7 @@ do_set_cmd(MdbSQL *sql, char *s) mdb_dump_stats(sql->mdb); } else { printf("Unknown stats option %s\n", level2); + printf("Usage: set stats [on|off]\n"); } } else if (!strcmp(level1,"showplan")) { level2 = strtok(NULL, " \t"); @@ -138,6 +142,7 @@ do_set_cmd(MdbSQL *sql, char *s) showplan=0; } else { printf("Unknown showplan option %s\n", level2); + printf("Usage: set showplan [on|off]\n"); } } else if (!strcmp(level1,"noexec")) { level2 = strtok(NULL, " \t"); @@ -150,10 +155,12 @@ do_set_cmd(MdbSQL *sql, char *s) } else if (!strcmp(level2,"off")) { noexec=0; } else { - printf("Unknown showplan option %s\n", level2); + printf("Unknown noexec option %s\n", level2); + printf("Usage: set noexec [on|off]\n"); } } else { printf("Unknown set command %s\n", level1); + printf("Usage: set [stats|showplan|noexec] [on|off]\n"); } } @@ -192,7 +199,7 @@ read_file(char *s, int line, unsigned int *bufsz, char *mybuf) return lines; } void -run_query(MdbSQL *sql, char *mybuf) +run_query(MdbSQL *sql, char *mybuf, char *delimiter) { MdbTableDef *table; @@ -213,7 +220,7 @@ run_query(MdbSQL *sql, char *mybuf) if (pretty_print) dump_results_pp(sql); else - dump_results(sql); + dump_results(sql, delimiter); } } @@ -242,8 +249,17 @@ int i; } fprintf(stdout,"+"); } +void print_rows_retrieved(unsigned long row_count) +{ + if (!row_count) + fprintf(stdout, "No Rows retrieved\n"); + else if (row_count==1) + fprintf(stdout, "1 Row retrieved\n"); + else + fprintf(stdout, "%lu Rows retrieved\n", row_count); +} void -dump_results(MdbSQL *sql) +dump_results(MdbSQL *sql, char *delimiter) { unsigned int j; MdbSQLColumn *sqlcol; @@ -252,7 +268,8 @@ dump_results(MdbSQL *sql) if (headers) { for (j=0;jnum_columns-1;j++) { sqlcol = g_ptr_array_index(sql->columns,j); - fprintf(stdout, "%s%s", sqlcol->name, delimiter); + fprintf(stdout, "%s%s", sqlcol->name, + delimiter ? delimiter : "\t"); } sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1); fprintf(stdout, "%s", sqlcol->name); @@ -262,20 +279,17 @@ dump_results(MdbSQL *sql) row_count++; for (j=0;jnum_columns-1;j++) { sqlcol = g_ptr_array_index(sql->columns,j); - fprintf(stdout, "%s%s", sql->bound_values[j], delimiter); + fprintf(stdout, "%s%s", sql->bound_values[j], + delimiter ? delimiter : "\t"); } sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1); fprintf(stdout, "%s", sql->bound_values[sql->num_columns-1]); fprintf(stdout,"\n"); } if (footers) { - if (!row_count) - fprintf(stdout, "No Rows retrieved\n"); - else if (row_count==1) - fprintf(stdout, "1 Row retrieved\n"); - else - fprintf(stdout, "%lu Rows retrieved\n", row_count); + print_rows_retrieved(row_count); } + mdb_sql_reset(sql); } @@ -285,11 +299,6 @@ dump_results_pp(MdbSQL *sql) unsigned int j; MdbSQLColumn *sqlcol; unsigned long row_count = 0; - /* - int rows, rc, i; - MdbHandle *mdb = sql->mdb; - MdbFormatConstants *fmt = mdb->fmt; - */ /* print header */ if (headers) { @@ -330,12 +339,7 @@ dump_results_pp(MdbSQL *sql) } fprintf(stdout,"\n"); if (footers) { - if (!row_count) - fprintf(stdout, "No Rows retrieved\n"); - else if (row_count==1) - fprintf(stdout, "1 Row retrieved\n"); - else - fprintf(stdout, "%lu Rows retrieved\n", row_count); + print_rows_retrieved(row_count); } /* clean up */ @@ -343,29 +347,23 @@ dump_results_pp(MdbSQL *sql) g_free(sql->bound_values[j]); } - /* the column and table names are no good now */ mdb_sql_reset(sql); } -void myexit(int r) -{ - g_free(delimiter); - exit(r); -} int main(int argc, char **argv) { char *s; char prompt[20]; -int line = 1; +int line; char *mybuf; -unsigned int bufsz = 4096; -int done = 0; +unsigned int bufsz; MdbSQL *sql; int opt; FILE *in = NULL, *out = NULL; char *home = getenv("HOME"); char *histpath; +char *delimiter = NULL; #ifdef HAVE_READLINE_HISTORY @@ -411,9 +409,6 @@ char *histpath; exit(1); } } - if (!delimiter) { - delimiter = (char *) g_strdup("\t"); - } /* initialize the SQL engine */ sql = mdb_sql_init(); if (argc>optind) { @@ -424,28 +419,36 @@ char *histpath; bufsz = 4096; mybuf = (char *) g_malloc(bufsz); mybuf[0]='\0'; + line = 0; - if (in) { - s=malloc(256); - if (!fgets(s, 256, in)) { - if (s) free (s); - g_free (mybuf); - myexit(0); + while (1) { + line ++; + if (in) { + s=malloc(256); + if ((!s) || (!fgets(s, 256, in))) { + /* if we have something in the buffer, run it */ + if (strlen(mybuf)) + run_query(sql, mybuf, delimiter); + break; + } + if (s[strlen(s)-1]=='\n') + s[strlen(s)-1]=0; + } else { + sprintf(prompt, "%d => ", line); + s=readline(prompt); + if (!s) + break; } - } else { - sprintf(prompt,"1 => "); - s=readline(prompt); - if (!s) done = 1; - if (s && (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye"))) - done = 1; - } - while (!done) { - if (line==1 && !strncmp(s,"set ", 4)) { - do_set_cmd(sql, &s[4]); + + if (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye")) + break; + + if (line==1 && (!strncmp(s,"set ",4) || !strcmp(s,"set"))) { + do_set_cmd(sql, &s[3]); line = 0; } else if (!strcmp(s,"go")) { line = 0; - run_query(sql, mybuf); + run_query(sql, mybuf, delimiter); mybuf[0]='\0'; } else if (!strcmp(s,"reset")) { line = 0; @@ -465,31 +468,14 @@ char *histpath; /* preserve line numbering for the parser */ strcat(mybuf,"\n"); } - if (s) free(s); - if (in) { - s=malloc(256); - if (!fgets(s, 256, in)) { - /* if we have something in the buffer, run it */ - if (strlen(mybuf)) - run_query(sql, mybuf); - if (s) free (s); - g_free (mybuf); - myexit(0); - } - if (s[strlen(s)-1]=='\n') s[strlen(s)-1]=0; - } else { - sprintf(prompt,"%d => ",++line); - s=readline(prompt); - if (!s) done = 1; - } - if( s && (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye"))) { - done = 1; - } } mdb_sql_exit(sql); g_free(mybuf); + g_free(delimiter); if (s) free(s); + if (out) fclose(out); + if ((in) && (in != stdin)) fclose(in); #ifdef HAVE_READLINE_HISTORY if (home) { @@ -499,9 +485,7 @@ char *histpath; } #endif - myexit(0); - - return 0; /* make gcc -Wall happy */ + exit(0); } #else int main(int argc, char **argv)