mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-01-02 12:27:09 +08:00
added man pages for utils.
lots of gmdb2 work. added statistics collection.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump prole updrow
|
||||
bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump prole updrow prindex
|
||||
LIBS = $(GLIB_LIBS) $(READLINE_LIBS) @LEXLIB@
|
||||
INCLUDES = -I$(top_srcdir)/include $(GLIB_CFLAGS)
|
||||
LDADD = ../libmdb/libmdb.la
|
||||
|
||||
@@ -24,8 +24,16 @@
|
||||
#include <string.h>
|
||||
#include "mdbsql.h"
|
||||
|
||||
void dump_results(MdbSQL *sql);
|
||||
void dump_results_pp(MdbSQL *sql);
|
||||
|
||||
#if SQL
|
||||
|
||||
int headers = 1;
|
||||
int footers = 1;
|
||||
int pretty_print = 1;
|
||||
char *delimiter;
|
||||
|
||||
#ifndef HAVE_READLINE
|
||||
char *readline(char *prompt)
|
||||
{
|
||||
@@ -65,6 +73,166 @@ int parse(MdbSQL *sql, char *buf)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
do_set_cmd(MdbSQL *sql, char *s)
|
||||
{
|
||||
char *level1, *level2;
|
||||
level1 = strtok(s, " \t\n");
|
||||
if (!strcmp(level1,"stats")) {
|
||||
level2 = strtok(NULL, " \t");
|
||||
if (!strcmp(level2,"on")) {
|
||||
mdb_stats_on(sql->mdb);
|
||||
} else if (!strcmp(level2,"off")) {
|
||||
mdb_stats_off(sql->mdb);
|
||||
mdb_dump_stats(sql->mdb);
|
||||
} else {
|
||||
printf("Unknown stats option %s\n", level2);
|
||||
}
|
||||
} else {
|
||||
printf("Unknown set command %s\n", level1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
run_query(MdbSQL *sql, char *mybuf)
|
||||
{
|
||||
if (!parse(sql, mybuf) && sql->cur_table) {
|
||||
mdbsql_bind_all(sql);
|
||||
if (pretty_print)
|
||||
dump_results_pp(sql);
|
||||
else
|
||||
dump_results(sql);
|
||||
}
|
||||
}
|
||||
|
||||
void print_value(char *v, int sz, int first)
|
||||
{
|
||||
int i;
|
||||
int vlen;
|
||||
|
||||
if (first) {
|
||||
fprintf(stdout,"|");
|
||||
}
|
||||
vlen = strlen(v);
|
||||
for (i=0;i<sz;i++) {
|
||||
fprintf(stdout,"%c",i >= vlen ? ' ' : v[i]);
|
||||
}
|
||||
fprintf(stdout,"|");
|
||||
}
|
||||
static void print_break(int sz, int first)
|
||||
{
|
||||
int i;
|
||||
if (first) {
|
||||
fprintf(stdout,"+");
|
||||
}
|
||||
for (i=0;i<sz;i++) {
|
||||
fprintf(stdout,"-");
|
||||
}
|
||||
fprintf(stdout,"+");
|
||||
}
|
||||
void
|
||||
dump_results(MdbSQL *sql)
|
||||
{
|
||||
int j;
|
||||
MdbSQLColumn *sqlcol;
|
||||
unsigned long row_count = 0;
|
||||
|
||||
if (headers) {
|
||||
for (j=0;j<sql->num_columns-1;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
fprintf(stdout, "%s%s", sqlcol->name, delimiter);
|
||||
}
|
||||
sqlcol = g_ptr_array_index(sql->columns,sql->num_columns-1);
|
||||
fprintf(stdout, "%s", sqlcol->name);
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
while(mdb_fetch_row(sql->cur_table)) {
|
||||
row_count++;
|
||||
for (j=0;j<sql->num_columns-1;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
fprintf(stdout, "%s%s", sql->bound_values[j], delimiter);
|
||||
}
|
||||
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, "%d Rows retrieved\n", row_count);
|
||||
}
|
||||
mdb_sql_reset(sql);
|
||||
}
|
||||
|
||||
void
|
||||
dump_results_pp(MdbSQL *sql)
|
||||
{
|
||||
int j;
|
||||
MdbSQLColumn *sqlcol;
|
||||
unsigned long row_count = 0;
|
||||
|
||||
/* print header */
|
||||
if (headers) {
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_break(sqlcol->disp_size, !j);
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_value(sqlcol->name,sqlcol->disp_size,!j);
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_break(sqlcol->disp_size, !j);
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
|
||||
/* print each row */
|
||||
while(mdb_fetch_row(sql->cur_table)) {
|
||||
row_count++;
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_value(sql->bound_values[j],sqlcol->disp_size,!j);
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
|
||||
/* footer */
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
sqlcol = g_ptr_array_index(sql->columns,j);
|
||||
print_break(sqlcol->disp_size, !j);
|
||||
}
|
||||
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, "%d Rows retrieved\n", row_count);
|
||||
}
|
||||
|
||||
/* clean up */
|
||||
for (j=0;j<sql->num_columns;j++) {
|
||||
if (sql->bound_values[j]) free(sql->bound_values[j]);
|
||||
}
|
||||
|
||||
/* the column and table names are no good now */
|
||||
mdb_sql_reset(sql);
|
||||
}
|
||||
|
||||
void myexit(int r)
|
||||
{
|
||||
free(delimiter);
|
||||
exit(r);
|
||||
}
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
char *s;
|
||||
@@ -74,11 +242,54 @@ char *mybuf;
|
||||
int bufsz = 4096;
|
||||
int done = 0;
|
||||
MdbSQL *sql;
|
||||
int opt;
|
||||
FILE *in = NULL, *out = NULL;
|
||||
|
||||
|
||||
if (!isatty(fileno(stdin))) {
|
||||
in = stdin;
|
||||
}
|
||||
while ((opt=getopt(argc, argv, "hfpd:i:o:"))!=-1) {
|
||||
switch (opt) {
|
||||
case 'd':
|
||||
delimiter = malloc(strlen(optarg)+1);
|
||||
strcpy(delimiter, optarg);
|
||||
break;
|
||||
case 'p':
|
||||
pretty_print=0;
|
||||
break;
|
||||
case 'H':
|
||||
headers=0;
|
||||
break;
|
||||
case 'F':
|
||||
footers=0;
|
||||
break;
|
||||
case 'i':
|
||||
if (!strcmp(optarg, "stdin"))
|
||||
in = stdin;
|
||||
else if (!(in = fopen(optarg, "r"))) {
|
||||
fprintf(stderr,"Unable to open file %s\n", optarg);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
if (!(out = fopen(optarg, "w"))) {
|
||||
fprintf(stderr,"Unable to open file %s\n", optarg);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stdout,"Unknown option.\nUsage: %s [-HFp] [-d <delimiter>] [-i <file>] [-o <file>] [<database>]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if (!delimiter) {
|
||||
delimiter = strdup("\t");
|
||||
}
|
||||
/* initialize the SQL engine */
|
||||
sql = mdb_sql_init();
|
||||
if (argc>1) {
|
||||
mdb_sql_open(sql, argv[1]);
|
||||
if (argc>optind) {
|
||||
mdb_sql_open(sql, argv[optind]);
|
||||
}
|
||||
|
||||
/* give the buffer an initial size */
|
||||
@@ -86,15 +297,20 @@ MdbSQL *sql;
|
||||
mybuf = (char *) malloc(bufsz);
|
||||
mybuf[0]='\0';
|
||||
|
||||
sprintf(prompt,"1 => ");
|
||||
s=readline(prompt);
|
||||
if (in) {
|
||||
s=malloc(256);
|
||||
if (!fgets(s, 256, in)) myexit(0);
|
||||
} else {
|
||||
sprintf(prompt,"1 => ");
|
||||
s=readline(prompt);
|
||||
}
|
||||
while (!done) {
|
||||
if (!strcmp(s,"go")) {
|
||||
if (line==1 && !strncmp(s,"set ", 4)) {
|
||||
do_set_cmd(sql, &s[4]);
|
||||
line = 0;
|
||||
if (!parse(sql, mybuf) && sql->cur_table) {
|
||||
mdbsql_bind_all(sql);
|
||||
mdbsql_dump_results(sql);
|
||||
}
|
||||
} else if (!strcmp(s,"go")) {
|
||||
line = 0;
|
||||
run_query(sql, mybuf);
|
||||
mybuf[0]='\0';
|
||||
} else if (!strcmp(s,"reset")) {
|
||||
line = 0;
|
||||
@@ -109,16 +325,27 @@ MdbSQL *sql;
|
||||
/* preserve line numbering for the parser */
|
||||
strcat(mybuf,"\n");
|
||||
}
|
||||
sprintf(prompt,"%d => ",++line);
|
||||
free(s);
|
||||
s=readline(prompt);
|
||||
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);
|
||||
myexit(0);
|
||||
}
|
||||
if (s[strlen(s)-1]=='\n') s[strlen(s)-1]=0;
|
||||
} else {
|
||||
sprintf(prompt,"%d => ",++line);
|
||||
s=readline(prompt);
|
||||
}
|
||||
if (!strcmp(s,"exit") || !strcmp(s,"quit") || !strcmp(s,"bye")) {
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
mdb_sql_exit(sql);
|
||||
|
||||
exit(0);
|
||||
myexit(0);
|
||||
}
|
||||
#else
|
||||
int main(int argc, char **argv)
|
||||
|
||||
@@ -74,7 +74,7 @@ char *sargname = NULL;
|
||||
void dump_ole(MdbTableDef *table, char *colname, char *sargname)
|
||||
{
|
||||
int i, found = 0;
|
||||
char ole_data[12000];
|
||||
char ole_data[200000];
|
||||
int len;
|
||||
MdbColumn *col;
|
||||
MdbSarg sarg;
|
||||
|
||||
Reference in New Issue
Block a user