Changeset: 602d7a1062ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=602d7a1062ed
Modified Files:
        ctest/tools/monetdbe/example_proxy.c
        monetdb5/modules/mal/remote.c
        sql/backends/monet5/sql_result.c
        tools/monetdbe/monetdbe.c
Branch: monetdbe-proxy
Log Message:

Fix redundant flush bug and refine remote's MAPI result handling.


diffs (184 lines):

diff --git a/ctest/tools/monetdbe/example_proxy.c 
b/ctest/tools/monetdbe/example_proxy.c
--- a/ctest/tools/monetdbe/example_proxy.c
+++ b/ctest/tools/monetdbe/example_proxy.c
@@ -34,6 +34,9 @@ main(void)
                error("Failed to open database")
 
        // Assumes the existance of a table test (x INT, y STRING)  on the 
remote.
+       if ((err = monetdbe_query(mdbe, "INSERT INTO test VALUES (100, 
'WHAAT'); ", NULL, NULL)) != NULL)
+               error(err)
+
        if ((err = monetdbe_query(mdbe, "SELECT x, y FROM test; ", &result, 
NULL)) != NULL)
                error(err)
 
@@ -76,6 +79,55 @@ main(void)
 
        if ((err = monetdbe_cleanup_result(mdbe, result)) != NULL)
                error(err)
+
+       if ((err = monetdbe_query(mdbe, "DELETE FROM test where x = 100;", 
NULL, NULL)) != NULL)
+               error(err)
+
+
+       if ((err = monetdbe_query(mdbe, "SELECT x, y, 1 AS some_int FROM test 
WHERE x > 10; ", &result, NULL)) != NULL)
+               error(err)
+
+       fprintf(stdout, "Query result with %zu cols and %"PRId64" rows\n", 
result->ncols, result->nrows);
+       for (int64_t r = 0; r < result->nrows; r++) {
+               for (size_t c = 0; c < result->ncols; c++) {
+                       monetdbe_column* rcol;
+                       if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
+                               error(err)
+                       switch (rcol->type) {
+                               case monetdbe_int32_t: {
+                                       monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
+                                       if (col->data[r] == col->null_value) {
+                                               printf("NULL");
+                                       } else {
+                                               printf("%d", col->data[r]);
+                                       }
+                                       break;
+                               }
+                               case monetdbe_str: {
+                                       monetdbe_column_str * col = 
(monetdbe_column_str *) rcol;
+                                       if (col->is_null(col->data[r])) {
+                                               printf("NULL");
+                                       } else {
+                                               printf("%s", (char*) 
col->data[r]);
+                                       }
+                                       break;
+                               }
+                               default: {
+                                       printf("UNKNOWN");
+                               }
+                       }
+
+                       if (c + 1 < result->ncols) {
+                               printf(", ");
+                       }
+               }
+               printf("\n");
+       }
+
+       if ((err = monetdbe_cleanup_result(mdbe, result)) != NULL)
+               error(err)
+
+
        if (monetdbe_close(mdbe))
                error("Failed to close database")
        return 0;
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -1102,7 +1102,7 @@ str RMTexec(Client cntxt, MalBlkPtr mb, 
 
        /* Temporary hack:
         * use a callback to immediately handle columnar results before hdl is 
destroyed. */
-       if(tmp == MAL_SUCCEED && rcb && mhdl) {
+       if(tmp == MAL_SUCCEED && rcb && mhdl && mapi_get_field_count(mhdl) == 
Q_TABLE) {
 
                int fields = mapi_get_field_count(mhdl);
 
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -953,8 +953,6 @@ mvc_export_binary_bat(stream *s, BAT* bn
                        if (sendtheap)
                                mnstr_write(s, /* theap */ Tbase(bn), 
bn->tvheap->free, 1);
                }
-
-               mnstr_flush(s);
 }
 
 static int
@@ -996,9 +994,9 @@ mvc_export_prepare_columnar(stream *out,
                        if (    BUNappend(btype,        &t->type->localtype     
, false) != GDK_SUCCEED ||
                                        BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
                                        BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bschema,      &schema         
                , false) != GDK_SUCCEED ||
-                                       BUNappend(btable,       &rname          
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bcolumn,      &name           
                , false) != GDK_SUCCEED)
+                                       BUNappend(bschema,      schema          
                , false) != GDK_SUCCEED ||
+                                       BUNappend(btable,       rname           
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bcolumn,      name            
                , false) != GDK_SUCCEED)
                                goto bailout;
                }
        }
@@ -1013,9 +1011,9 @@ mvc_export_prepare_columnar(stream *out,
                        if (    BUNappend(btype,        &t->type->localtype     
, false) != GDK_SUCCEED ||
                                        BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
                                        BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bschema,      &str_nil        
                , false) != GDK_SUCCEED ||
-                                       BUNappend(btable,       &str_nil        
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bcolumn,      &str_nil        
                , false) != GDK_SUCCEED)
+                                       BUNappend(bschema,      str_nil         
                , false) != GDK_SUCCEED ||
+                                       BUNappend(btable,       str_nil         
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bcolumn,      str_nil         
                , false) != GDK_SUCCEED)
                                goto bailout;
                }
        }
@@ -1124,6 +1122,7 @@ mvc_export_prepare(backend *b, stream *o
        }
 
        if (b->client->protocol == PROTOCOL_COLUMNAR) {
+               if (mnstr_flush(out) < 0) return -1;
                mvc_export_prepare_columnar(out, q, nrows, r);
        }
        else {
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -919,7 +919,7 @@ monetdbe_result_cb(void* context, char* 
 }
 
 static char*
-monetdbe_query_remote(monetdbe_database_internal *mdbe, char* query, 
monetdbe_result** result, monetdbe_cnt* affected_rows)
+monetdbe_query_remote(monetdbe_database_internal *mdbe, char* query, 
monetdbe_result** result, monetdbe_cnt* affected_rows, int *prepare_id)
 {
        // TODO: do something with affected_rows
        (void) affected_rows;
@@ -945,6 +945,25 @@ monetdbe_query_remote(monetdbe_database_
        o = pushStr(mb, o, mdbe->mid);
        o = pushBit(mb, o, TRUE);
 
+
+       if (prepare_id) {
+               size_t query_len, input_query_len, prep_len = 0;
+               input_query_len = strlen(query);
+               query_len = input_query_len + 3;
+               const char PREPARE[] = "PREPARE ";
+               prep_len = sizeof(PREPARE)-1;
+               query_len += prep_len;
+               char *nq = NULL;
+               if (!(nq = GDKmalloc(query_len))) {
+                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_remote", "Could not setup query stream");
+                       return mdbe->msg;
+               }
+               strcpy(nq, PREPARE);
+               strcpy(nq + prep_len, query);
+               strcpy(nq + prep_len + input_query_len, "\n;");
+               query = nq;
+       }
+
        InstrPtr p = newStmt(mb, remoteRef, putRef);
        p = pushStr(mb, p, mdbe->mid);
        p = pushStr(mb, p, query);
@@ -997,7 +1016,7 @@ monetdbe_query(monetdbe_database dbhdl, 
        monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
 
        if (mdbe->mid) {
-               mdbe->msg = monetdbe_query_remote(mdbe, query, result, 
affected_rows);
+               mdbe->msg = monetdbe_query_remote(mdbe, query, result, 
affected_rows, NULL);
        }
        else {
                mdbe->msg = monetdbe_query_internal(mdbe, query, result, 
affected_rows, NULL, 'S');
@@ -1040,6 +1059,9 @@ monetdbe_prepare(monetdbe_database dbhdl
        
        if (!stmt)
                mdbe->msg = createException(MAL, "monetdbe.monetdbe_prepare", 
"Parameter stmt is NULL");
+       else if (mdbe->mid) {
+               mdbe->msg = monetdbe_query_remote(mdbe, query, NULL, NULL, 
&prepare_id);
+       }
        else {
                mdbe->msg = monetdbe_query_internal(mdbe, query, NULL, NULL, 
&prepare_id, 'S');
        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to