Update of /cvsroot/monetdb/sql/src/backends/monet4
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv11383/src/backends/monet4

Modified Files:
        sql_gencode.mx sql_result.mx sql_server.mx 
Log Message:
added support for copy select .. into 'filename';



Index: sql_result.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet4/sql_result.mx,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -d -r1.75 -r1.76
--- sql_result.mx       25 Dec 2007 21:34:30 -0000      1.75
+++ sql_result.mx       3 Jan 2008 09:41:17 -0000       1.76
@@ -682,12 +682,10 @@
 }
 
 static int
-mvc_export_row(mvc *m, stream *s, res_table *t)
+mvc_export_row(mvc *m, stream *s, res_table *t, str btag, str sep, str rsep, 
str ssep)
 {
-       char *sep = ",\t";
-       char *rsep = "\t]\n";
-       int seplen= 2;
-       int rseplen= 3;
+       int seplen = strlen(sep);
+       int rseplen= strlen(rsep);
        char *buf = NULL;
        int len = 0;
        int i, ok = 1;
@@ -695,7 +693,9 @@
        if (!s)
                return 0;
 
-       ok = (stream_write(s, "[ ", 2, 1) == 1);
+       (void)ssep;
+       if (btag[0])
+               ok = (stream_write(s, btag, strlen(btag), 1) == 1);
        for (i = 0; i < t->nr_cols && ok; i++) {
                res_col *c = t->cols + i;
 
@@ -717,11 +717,8 @@
 }
 
 static int
-mvc_export_table(mvc *m, stream *s, res_table *t, BAT *order, size_t offset, 
size_t nr)
+mvc_export_table(mvc *m, stream *s, res_table *t, BAT *order, size_t offset, 
size_t nr, char *btag, char *sep, char *rsep, char *ssep )
 {
-       char *sep = ",\t";
-       char *rsep = "\t]\n";
-
        ascii as;
        ascii_io *fmt;
        ssize_t i;
@@ -739,7 +736,7 @@
        memset(fmt, 0, (as.nr_attrs + 1) * sizeof(ascii_io));
 
        fmt[0].c = NULL;
-       fmt[0].sep = _strdup("[ ");
+       fmt[0].sep = _strdup(btag);
        fmt[0].seplen = _strlen(fmt[0].sep);
        fmt[0].ws = 0;
 
@@ -763,6 +760,7 @@
                fmt[i].len = 0;
                fmt[i].nillen = 0;
                fmt[i].ws = 0;
+               fmt[i].quote = ssep?ssep[0]:0;
                if (c->type.type->eclass == EC_DEC) {
                        fmt[i].tostr = &dec_tostr;
                        fmt[i].frstr = &dec_frstr;
@@ -985,6 +983,34 @@
 }
 
 int
+mvc_export_file(mvc *m, res_table *t) 
+{
+       int res = 0;
+       size_t count;
+       stream *s;
+       BAT *order = NULL;
+
+       s = open_wastream(t->filename);
+       if (!s || stream_errnr(s)) {
+               GDKerror("failed to open %s\n", t->filename);
+               return -1;
+       }
+
+       if (!t->order) {
+               res = mvc_export_row(m, s, t, "", t->tsep, t->rsep, t->ssep);
+       } else {
+               order = BATdescriptor(t->order);
+               count = BATcount(order);
+               res = mvc_export_table(m, s, t, order, 0, count, "", t->tsep, 
t->rsep, t->ssep);
+               BBPunfix(order->batCacheid);
+               m->results = res_tables_remove(m->results, t);
+       } 
+       stream_close(s);
+       stream_destroy(s);
+       return res;
+}
+
+int
 mvc_export_result(mvc *m, stream *s, int res_id, str w)
 {
        int i, clean = 0, res = 0;
@@ -997,6 +1023,8 @@
 
        /* we shouldn't have anything else but Q_TABLE here */
        assert(t->query_type == Q_TABLE);
+       if (t->filename)
+               return mvc_export_file(m, t);
 
        /* query type: Q_TABLE */
        if (!(stream_write(s, "&1 ", 3, 1) == 1))
@@ -1077,14 +1105,14 @@
                return export_error(order);
 
        if (!t->order)
-               return mvc_export_row(m, s, t);
+               return mvc_export_row(m, s, t, "[ ", ",\t", "\t]\n", "\"");
 
        count = m->reply_size;
        if (count == 0 || count >= BATcount(order)) {
                count = BATcount(order);
                clean = 1;
        }
-       res = mvc_export_table(m, s, t, order, 0, count);
+       res = mvc_export_table(m, s, t, order, 0, count, "[ ", ",\t", "\t]\n", 
"\"");
        BBPunfix(order->batCacheid);
        if (clean)
                m->results = res_tables_remove(m->results, t);
@@ -1140,7 +1168,7 @@
        if (stream_write(s, "\n", 1, 1) != 1)
                return export_error(order);
 
-       res = mvc_export_table(m, s, t, order, offset, cnt);
+       res = mvc_export_table(m, s, t, order, offset, cnt, "[ ", ",\t", 
"\t]\n", "\"");
        BBPunfix(order->batCacheid);
        return res;
 }

Index: sql_server.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet4/sql_server.mx,v
retrieving revision 1.184
retrieving revision 1.185
diff -u -d -r1.184 -r1.185
--- sql_server.mx       13 Dec 2007 16:08:16 -0000      1.184
+++ sql_server.mx       3 Jan 2008 09:41:17 -0000       1.185
@@ -127,6 +127,8 @@
 can be shipped to the front-end for display or exported over a
 stream.
 @m
+       .COMMAND mvc_result_file( mvc m, int nr_cols, str filename, str tsep, 
str rsep, str ssep, BAT[oid,any] order ) : int = mvc_result_file_wrap; "Create 
structure to cache a file query result" 
+
        .COMMAND mvc_result_table( mvc m, int nr_cols, int type, any order ) : 
int = mvc_result_row_wrap; "Create structure to cache a row query result" 
 
        .COMMAND mvc_result_table( mvc m, int nr_cols, int type, BAT[oid,any] 
order ) : int = mvc_result_table_wrap; "Create structure to cache a table query 
result" 
@@ -712,6 +714,21 @@
        return m->results->id;
 }
 
+int
+mvc_result_file_wrap(int *res_id, mvc *M, int *nr_cols, str filename, str 
tsep, str rsep, str ssep, BAT *order )
+{
+       mvc *m = *(mvc**)M;
+       res_table *t = res_table_create(m->session->tr, m->result_id++, 
*nr_cols, Q_TABLE, m->results, order);
+       m->results = t;
+       t->filename = _strdup(filename);
+       t->tsep = _strdup(tsep);
+       t->rsep = _strdup(rsep);
+       t->ssep = _strdup(ssep);
+       *res_id = t->id;
+       if (*res_id < 0)
+               return GDK_FAIL;
+       return GDK_SUCCEED;
+}
 
 int
 mvc_result_table_wrap(int *res_id, mvc *M, int *nr_cols, int *qtype, BAT 
*order)

Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet4/sql_gencode.mx,v
retrieving revision 1.163
retrieving revision 1.164
diff -u -d -r1.163 -r1.164
--- sql_gencode.mx      30 Dec 2007 18:23:49 -0000      1.163
+++ sql_gencode.mx      3 Jan 2008 09:41:17 -0000       1.164
@@ -1129,7 +1129,7 @@
                case st_rs_column:
                        dump_2(sql, s, "find", nr);
                        break;
-               case st_bulkinsert:{
+               case st_import:{
                        char *tname = s->op1.stval->op1.tval->base.name;
                        node *n = s->op2.lval->h;
                        char *sep = n->data;
@@ -1188,7 +1188,8 @@
                        backend_dump_nil(sql, s->op1.stval);
                        break;
                }
-               case st_output:{
+               case st_output:
+               case st_export:{
                        stmt *order = NULL;
                        stmt *lst = s->op1.stval;
 
@@ -1213,7 +1214,8 @@
                                f = n->data;
 
                                /* single value result, has a fast exit */
-                               if (cnt == 1 && !order && f->nrcols <= 0){
+                               if (cnt == 1 && !order && f->nrcols <= 0 && 
+                                   s->type != st_export){
                                        stmt *c = n->data;
                                        sql_subtype *t = tail_type(c);
                                        char *tname = table_name(c);
@@ -1254,7 +1256,17 @@
                                        buflen += BUFSIZ;
                                        buf = RENEW_ARRAY(char, buf, buflen);
                                }
-                               len = snprintf(buf, buflen, "var s%d := 
mvc_result_table(myc, %d, %d, s%d);\n", -s->nr, cnt, sql->mvc->type, order->nr);
+                               if (s->type == st_export) {
+                                       int file = 
backend_dumpstmt_(s->op4.stval, nr, sql);
+                                       node *n = s->op2.lval->h;
+                                       char *sep = n->data;
+                                       char *rsep = n->next->data;
+                                       char *ssep = 
sql_escape_ident(n->next->next->data);
+                                       len = snprintf(buf, buflen, "var s%d := 
mvc_result_file(myc, %d, s%d, \"%s\", \"%s\", \"%s\", s%d);\n", -s->nr, cnt, 
file, sep, rsep, ssep, order->nr);
+                                       _DELETE(ssep);
+                               } else {
+                                       len = snprintf(buf, buflen, "var s%d := 
mvc_result_table(myc, %d, %d, s%d);\n", -s->nr, cnt, sql->mvc->type, order->nr);
+                               }
                                assert(len <= buflen);
                                write_command(sql, buf);
                                write_part(sql, buf, len);


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to