Changeset: 7450987b4dba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7450987b4dba
Modified Files:
        clients/mapiclient/mclient.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
Branch: client_interrupts
Log Message:

More interrupt handling.
When interrupted after query was sent but before a response comes in, we
can now also abort.
Clean up out-of-band messages before starting to read a new query on the
server side.


diffs (135 lines):

diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -1405,6 +1405,7 @@ SQLpagemove(int *len, int fields, int *p
        if (sz < 0 && mnstr_errnr(fromConsole) == MNSTR_INTERRUPT) {
                /* interrupted, equivalent to typing 'q' */
                mnstr_clearerr(fromConsole);
+               mnstr_printf(toConsole, "\n");
                *skiprest = true;
        } else if (sz > 0) {
                if (buf[0] == 'c')
@@ -1422,14 +1423,16 @@ SQLpagemove(int *len, int fields, int *p
 static volatile sig_atomic_t state;
 #define READING                1
 #define WRITING                2
+#define QUERYING       3
 #define IDLING         0
+#define INTERRUPT      (-1)
 
 static void
 sigint_handler(int signum)
 {
        (void) signum;
 
-       state = IDLING;
+       state = INTERRUPT;
 #ifdef HAVE_LIBREADLINE
        readline_int_handler();
 #endif
@@ -1469,6 +1472,13 @@ SQLrenderer(MapiHdl hdl)
                exit(2);
        }
 
+       if (state == INTERRUPT) {
+               free(len);
+               free(hdr);
+               free(rest);
+               free(numeric);
+               return;
+       }
        state = WRITING;
 
        total = 0;
@@ -1651,14 +1661,15 @@ SQLrenderer(MapiHdl hdl)
 
                if (ps > 0 && lines >= ps && fromConsole != NULL) {
                        SQLpagemove(len, printfields, &ps, &skiprest);
-                       lines = 0;
                        if (skiprest) {
                                mapi_finish(hdl);
                                break;
                        }
+                       lines = 0;
                }
 
-               if (state == IDLING) {
+               if (state == INTERRUPT) {
+                       skiprest = true;
                        mapi_finish(hdl);
                        break;
                }
@@ -1666,6 +1677,7 @@ SQLrenderer(MapiHdl hdl)
                nrows++;
                lines += SQLrow(len, numeric, rest, printfields, 2, 0);
        }
+       state = IDLING;
        if (fields && !skiprest)
                SQLseparator(len, printfields, '-');
        if (skiprest)
@@ -1970,6 +1982,8 @@ format_result(Mapi mid, MapiHdl hdl, boo
                        SQLdebugRendering(hdl);
                        continue;
                }
+               if (state == INTERRUPT)
+                       break;
                if (debugMode())
                        RAWrenderer(hdl);
                else {
@@ -2014,7 +2028,7 @@ format_result(Mapi mid, MapiHdl hdl, boo
 
                        timerHuman(sqloptimizer, maloptimizer, querytime, 
singleinstr, false);
                }
-       } while (mnstr_errnr(toConsole) == MNSTR_NO__ERROR && (rc = 
mapi_next_result(hdl)) == 1);
+       } while (state != INTERRUPT && mnstr_errnr(toConsole) == 
MNSTR_NO__ERROR && (rc = mapi_next_result(hdl)) == 1);
        /*
         * in case we called timerHuman() in the loop above with "total == 
false",
         * call it again with "total == true" to get the total wall-clock time
@@ -2031,6 +2045,10 @@ format_result(Mapi mid, MapiHdl hdl, boo
        end_pager(saveFD);
 #endif
 
+       if (state == INTERRUPT)
+               mnstr_printf(toConsole, "\n");
+       state = IDLING;
+
        return rc;
 }
 
@@ -2395,7 +2413,7 @@ doFile(Mapi mid, stream *fp, bool useins
                        char *newbuf;
                        state = READING;
                        l = mnstr_readline(fp, buf + length, bufsiz - length);
-                       if (l == -1 && state == IDLING) {
+                       if (l == -1 && state == INTERRUPT) {
                                /* we were interrupted */
                                mnstr_clearerr(fp);
                                mnstr_write(toConsole, "\n", 1, 1);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2480,8 +2480,10 @@ mvc_result_set_wrap( Client cntxt, MalBl
        bat_iterator_end(&iterdig);
        bat_iterator_end(&iterscl);
        /* now send it to the channel cntxt->fdout */
-       if (!msg && (ok = mvc_export_result(cntxt->sqlcontext, cntxt->fdout, 
res, true, cntxt->qryctx.starttime, mb->optimize)) < 0)
-               msg = createException(SQL, "sql.resultSet", SQLSTATE(45000) 
"Result set construction failed: %s", mvc_export_error(cntxt->sqlcontext, 
cntxt->fdout, ok));
+       if (bstream_getoob(cntxt->fdin))
+               msg = createException(SQL, "sql.resultSet", SQLSTATE(HY000) 
"Query aboted");
+       else if (!msg && (ok = mvc_export_result(be, cntxt->fdout, res, true, 
cntxt->qryctx.starttime, mb->optimize)) < 0)
+               msg = createException(SQL, "sql.resultSet", SQLSTATE(45000) 
"Result set construction failed: %s", mvc_export_error(be, cntxt->fdout, ok));
   wrapup_result_set:
        cntxt->qryctx.starttime = 0;
        cntxt->qryctx.endtime = 0;
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -1069,6 +1069,8 @@ SQLreader(Client c, backend *be)
                                }
                                in->eof = false;
                        }
+                       while (bstream_getoob(in) > 0)
+                               ;
                        if (in->buf == NULL) {
                                more = false;
                                go = false;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to