From 7ef02592d0cc046726a8f7554d4380a83a53da8c Mon Sep 17 00:00:00 2001 From: brianb Date: Mon, 9 Feb 2004 03:52:25 +0000 Subject: [PATCH] half of patch #857342, still need to fix NULL values --- src/util/mdb-export.c | 51 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/util/mdb-export.c b/src/util/mdb-export.c index b66dc36..790aabc 100644 --- a/src/util/mdb-export.c +++ b/src/util/mdb-export.c @@ -27,6 +27,9 @@ #define MDB_BIND_SIZE 200000 #define is_text_type(x) (x==MDB_TEXT || x==MDB_MEMO || x==MDB_SDATETIME) + +static char *sanitize_name(char *str, int sanitize); + void print_col(gchar *col_val, int quote_text, int col_type) { @@ -54,11 +57,13 @@ main(int argc, char **argv) /* doesn't handle tables > 256 columns. Can that happen? */ char *bound_values[256]; char *delimiter = ","; + char *row_delimiter = "\n"; char header_row = 1; char quote_text = 1; + char insert_statements = 0; int opt; - while ((opt=getopt(argc, argv, "HQd:D:"))!=-1) { + while ((opt=getopt(argc, argv, "HQd:D:R:I"))!=-1) { switch (opt) { case 'H': header_row = 0; @@ -70,6 +75,14 @@ main(int argc, char **argv) delimiter = (char *) malloc(strlen(optarg)+1); strcpy(delimiter, optarg); break; + case 'R': + row_delimiter = (char *) malloc(strlen(optarg)+1); + strcpy(row_delimiter, optarg); + break; + case 'I': + insert_statements = 1; + header_row = 0; + break; case 'D': mdb_set_date_fmt(optarg); break; @@ -88,6 +101,8 @@ main(int argc, char **argv) fprintf(stderr," -H supress header row\n"); fprintf(stderr," -Q don't wrap text-like fields in quotes\n"); fprintf(stderr," -d specify a column delimiter\n"); + fprintf(stderr," -R specify a row delimiter\n"); + fprintf(stderr," -I INSERT statements (instead of CSV)\n"); fprintf(stderr," -D set the date format (see strftime(3) for details)\n"); exit(1); } @@ -127,6 +142,18 @@ main(int argc, char **argv) } while(mdb_fetch_row(table)) { + + if (insert_statements) { + fprintf(stdout, "INSERT INTO %s (", + sanitize_name(argv[optind + 1],1)); + for (j=0;jnum_cols;j++) { + if (j>0) fprintf(stdout, ", "); + col=g_ptr_array_index(table->columns,j); + fprintf(stdout,"%s", sanitize_name(col->name,1)); + } + fprintf(stdout, ") VALUES ("); + } + col=g_ptr_array_index(table->columns,0); if (col->col_type == MDB_OLE) { mdb_ole_read(mdb, col, bound_values[0], MDB_BIND_SIZE); @@ -147,7 +174,8 @@ main(int argc, char **argv) quote_text, col->col_type); } - fprintf(stdout,"\n"); + if (insert_statements) fprintf(stdout,")"); + fprintf(stdout,"%s", row_delimiter); } for (j=0;jnum_cols;j++) { free(bound_values[j]); @@ -163,3 +191,22 @@ main(int argc, char **argv) exit(0); } +static char *sanitize_name(char *str, int sanitize) +{ + static char namebuf[256]; + char *p = namebuf; + + if (!sanitize) + return str; + + while (*str) { + *p = isalnum(*str) ? *str : '_'; + p++; + str++; + } + + *p = 0; + + return namebuf; +} +