mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-10-21 11:07:41 +08:00
Various mdb-sql improvements
This commit is contained in:
@@ -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:
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user