Various mdb-sql improvements

This commit is contained in:
whydoubt
2004-10-28 03:33:20 +00:00
parent 5d53a0f463
commit 8b9c2cda5a
2 changed files with 64 additions and 77 deletions

View File

@@ -1,3 +1,6 @@
Wed Oct 27 22:32:33 CDT 2004 Jeff Smith <whydoubt@yahoo.com>
* src/util/mdb-sql.c: Various mdb-sql improvements
Sun Oct 24 23:07:16 CDT 2004 Jeff Smith <whydoubt@yahoo.com> Sun Oct 24 23:07:16 CDT 2004 Jeff Smith <whydoubt@yahoo.com>
* configure.in: * configure.in:
* src/gmdb2/Makefile.am: * src/gmdb2/Makefile.am:

View File

@@ -52,7 +52,7 @@ extern int read_history ();
#include "dmalloc.h" #include "dmalloc.h"
#endif #endif
void dump_results(MdbSQL *sql); void dump_results(MdbSQL *sql, char *delimiter);
void dump_results_pp(MdbSQL *sql); void dump_results_pp(MdbSQL *sql);
int yyparse(void); int yyparse(void);
@@ -61,7 +61,6 @@ int yyparse(void);
int headers = 1; int headers = 1;
int footers = 1; int footers = 1;
int pretty_print = 1; int pretty_print = 1;
char *delimiter;
int showplan = 0; int showplan = 0;
int noexec = 0; int noexec = 0;
@@ -112,6 +111,10 @@ do_set_cmd(MdbSQL *sql, char *s)
{ {
char *level1, *level2; char *level1, *level2;
level1 = strtok(s, " \t\n"); level1 = strtok(s, " \t\n");
if (!level1) {
printf("Usage: set [stats|showplan|noexec] [on|off]\n");
return;
}
if (!strcmp(level1,"stats")) { if (!strcmp(level1,"stats")) {
level2 = strtok(NULL, " \t"); level2 = strtok(NULL, " \t");
if (!level2) { if (!level2) {
@@ -125,6 +128,7 @@ do_set_cmd(MdbSQL *sql, char *s)
mdb_dump_stats(sql->mdb); mdb_dump_stats(sql->mdb);
} else { } else {
printf("Unknown stats option %s\n", level2); printf("Unknown stats option %s\n", level2);
printf("Usage: set stats [on|off]\n");
} }
} else if (!strcmp(level1,"showplan")) { } else if (!strcmp(level1,"showplan")) {
level2 = strtok(NULL, " \t"); level2 = strtok(NULL, " \t");
@@ -138,6 +142,7 @@ do_set_cmd(MdbSQL *sql, char *s)
showplan=0; showplan=0;
} else { } else {
printf("Unknown showplan option %s\n", level2); printf("Unknown showplan option %s\n", level2);
printf("Usage: set showplan [on|off]\n");
} }
} else if (!strcmp(level1,"noexec")) { } else if (!strcmp(level1,"noexec")) {
level2 = strtok(NULL, " \t"); level2 = strtok(NULL, " \t");
@@ -150,10 +155,12 @@ do_set_cmd(MdbSQL *sql, char *s)
} else if (!strcmp(level2,"off")) { } else if (!strcmp(level2,"off")) {
noexec=0; noexec=0;
} else { } else {
printf("Unknown showplan option %s\n", level2); printf("Unknown noexec option %s\n", level2);
printf("Usage: set noexec [on|off]\n");
} }
} else { } else {
printf("Unknown set command %s\n", level1); 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; return lines;
} }
void void
run_query(MdbSQL *sql, char *mybuf) run_query(MdbSQL *sql, char *mybuf, char *delimiter)
{ {
MdbTableDef *table; MdbTableDef *table;
@@ -213,7 +220,7 @@ run_query(MdbSQL *sql, char *mybuf)
if (pretty_print) if (pretty_print)
dump_results_pp(sql); dump_results_pp(sql);
else else
dump_results(sql); dump_results(sql, delimiter);
} }
} }
@@ -242,8 +249,17 @@ int i;
} }
fprintf(stdout,"+"); 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 void
dump_results(MdbSQL *sql) dump_results(MdbSQL *sql, char *delimiter)
{ {
unsigned int j; unsigned int j;
MdbSQLColumn *sqlcol; MdbSQLColumn *sqlcol;
@@ -252,7 +268,8 @@ dump_results(MdbSQL *sql)
if (headers) { if (headers) {
for (j=0;j<sql->num_columns-1;j++) { for (j=0;j<sql->num_columns-1;j++) {
sqlcol = g_ptr_array_index(sql->columns,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); sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1);
fprintf(stdout, "%s", sqlcol->name); fprintf(stdout, "%s", sqlcol->name);
@@ -262,20 +279,17 @@ dump_results(MdbSQL *sql)
row_count++; row_count++;
for (j=0;j<sql->num_columns-1;j++) { for (j=0;j<sql->num_columns-1;j++) {
sqlcol = g_ptr_array_index(sql->columns,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); sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1);
fprintf(stdout, "%s", sql->bound_values[sql->num_columns-1]); fprintf(stdout, "%s", sql->bound_values[sql->num_columns-1]);
fprintf(stdout,"\n"); fprintf(stdout,"\n");
} }
if (footers) { if (footers) {
if (!row_count) print_rows_retrieved(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);
} }
mdb_sql_reset(sql); mdb_sql_reset(sql);
} }
@@ -285,11 +299,6 @@ dump_results_pp(MdbSQL *sql)
unsigned int j; unsigned int j;
MdbSQLColumn *sqlcol; MdbSQLColumn *sqlcol;
unsigned long row_count = 0; unsigned long row_count = 0;
/*
int rows, rc, i;
MdbHandle *mdb = sql->mdb;
MdbFormatConstants *fmt = mdb->fmt;
*/
/* print header */ /* print header */
if (headers) { if (headers) {
@@ -330,12 +339,7 @@ dump_results_pp(MdbSQL *sql)
} }
fprintf(stdout,"\n"); fprintf(stdout,"\n");
if (footers) { if (footers) {
if (!row_count) print_rows_retrieved(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);
} }
/* clean up */ /* clean up */
@@ -343,29 +347,23 @@ dump_results_pp(MdbSQL *sql)
g_free(sql->bound_values[j]); g_free(sql->bound_values[j]);
} }
/* the column and table names are no good now */
mdb_sql_reset(sql); mdb_sql_reset(sql);
} }
void myexit(int r)
{
g_free(delimiter);
exit(r);
}
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char *s; char *s;
char prompt[20]; char prompt[20];
int line = 1; int line;
char *mybuf; char *mybuf;
unsigned int bufsz = 4096; unsigned int bufsz;
int done = 0;
MdbSQL *sql; MdbSQL *sql;
int opt; int opt;
FILE *in = NULL, *out = NULL; FILE *in = NULL, *out = NULL;
char *home = getenv("HOME"); char *home = getenv("HOME");
char *histpath; char *histpath;
char *delimiter = NULL;
#ifdef HAVE_READLINE_HISTORY #ifdef HAVE_READLINE_HISTORY
@@ -411,9 +409,6 @@ char *histpath;
exit(1); exit(1);
} }
} }
if (!delimiter) {
delimiter = (char *) g_strdup("\t");
}
/* initialize the SQL engine */ /* initialize the SQL engine */
sql = mdb_sql_init(); sql = mdb_sql_init();
if (argc>optind) { if (argc>optind) {
@@ -424,28 +419,36 @@ char *histpath;
bufsz = 4096; bufsz = 4096;
mybuf = (char *) g_malloc(bufsz); mybuf = (char *) g_malloc(bufsz);
mybuf[0]='\0'; mybuf[0]='\0';
line = 0;
if (in) { while (1) {
s=malloc(256); line ++;
if (!fgets(s, 256, in)) { if (in) {
if (s) free (s); s=malloc(256);
g_free (mybuf); if ((!s) || (!fgets(s, 256, in))) {
myexit(0); /* 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 => "); if (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye"))
s=readline(prompt); break;
if (!s) done = 1;
if (s && (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye"))) if (line==1 && (!strncmp(s,"set ",4) || !strcmp(s,"set"))) {
done = 1; do_set_cmd(sql, &s[3]);
}
while (!done) {
if (line==1 && !strncmp(s,"set ", 4)) {
do_set_cmd(sql, &s[4]);
line = 0; line = 0;
} else if (!strcmp(s,"go")) { } else if (!strcmp(s,"go")) {
line = 0; line = 0;
run_query(sql, mybuf); run_query(sql, mybuf, delimiter);
mybuf[0]='\0'; mybuf[0]='\0';
} else if (!strcmp(s,"reset")) { } else if (!strcmp(s,"reset")) {
line = 0; line = 0;
@@ -465,31 +468,14 @@ char *histpath;
/* preserve line numbering for the parser */ /* preserve line numbering for the parser */
strcat(mybuf,"\n"); 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); mdb_sql_exit(sql);
g_free(mybuf); g_free(mybuf);
g_free(delimiter);
if (s) free(s); if (s) free(s);
if (out) fclose(out);
if ((in) && (in != stdin)) fclose(in);
#ifdef HAVE_READLINE_HISTORY #ifdef HAVE_READLINE_HISTORY
if (home) { if (home) {
@@ -499,9 +485,7 @@ char *histpath;
} }
#endif #endif
myexit(0); exit(0);
return 0; /* make gcc -Wall happy */
} }
#else #else
int main(int argc, char **argv) int main(int argc, char **argv)