Changeset: 010f0721d4f7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=010f0721d4f7
Modified Files:
        clients/mapiclient/tachograph.c
Branch: default
Log Message:

Upgrade the progress display
- use the pc count instead of pc position
- show an instruction being processed after bar update
- only show the arguments in the call, no variables.


diffs (270 lines):

diff --git a/clients/mapiclient/tachograph.c b/clients/mapiclient/tachograph.c
--- a/clients/mapiclient/tachograph.c
+++ b/clients/mapiclient/tachograph.c
@@ -20,8 +20,7 @@
 /* (c) M Kersten
  * Progress indicator
  * tachograph -d demo 
- * which connects to the demo database server and
- * will present a progress bar for each query.
+ * which connects to the demo database server and presents a server progress 
bar.
 */
 
 #include "monetdb_config.h"
@@ -81,7 +80,10 @@ static char *dbname;
 static int beat = 5000;
 static Mapi dbh;
 static MapiHdl hdl = NULL;
+static int interactive = 1;
 static int capturing=0;
+static int lastpc;
+static int pccount;
 
 #define RUNNING 1
 #define FINISHED 2
@@ -106,6 +108,7 @@ usageTachograph(void)
     fprintf(stderr, "  -p | --port=<portnr>\n");
     fprintf(stderr, "  -h | --host=<hostname>\n");
        fprintf(stderr, "  -b | --beat=<delay> in milliseconds (default 
5000)\n");
+       fprintf(stderr, "  -i | --interactive=<o | 1> show trace on stdout\n");
     fprintf(stderr, "  -o | --output=<webfile>\n");
     fprintf(stderr, "  -? | --help\n");
        exit(-1);
@@ -134,7 +137,7 @@ lng finishtime = 0;
 lng duration =0;
 int malsize = 0;
 char *prevquery= 0;
-int prevprogress =0;
+lng prevprogress =0;
 
 static FILE *tachofd;
 
@@ -151,6 +154,8 @@ static void resetTachograph(void){
        fclose(tachofd);
        tachofd = 0;
        prevprogress = 0;
+       lastpc = 0;
+       pccount = 0;
        printf("\n"); 
        fflush(stdout);
        if( events){
@@ -174,13 +179,39 @@ rendertime(lng ticks, int flg)
        snprintf(stamp,BUFSIZ,"%02d:%02d:%02d", hr,min,sec); 
 }
 
-// determine maximal width
-// line is built from 76 + size of stmt
+// determine maximal line width TODO
+
 #define MSGLEN 100
+
 static void
-showBar(int progress, lng clk, char *stmt)
+renderCall(char *line, char *stmt)
 {
-       int i =0;
+       char *limit= line + MSGLEN-1, *l, *c = stmt;
+
+       for( c= stmt, l= line; *c && l < limit; ) {
+               if( *c == 'X' && *(c+1)=='_') {
+                       for(; *c && *c != '='; c++) {
+                               //skip variables
+                       }
+                       if ( *c) c++;
+               }
+               if ( *c == 'A' && strchr(c,'=')){
+                       for(; *c && *c != '='; c++) {
+                               //skip argument variables
+                       }
+                       if ( *c) c++;
+               }
+               if(*c) *l++ = *c++;
+       }
+       for(; l < limit; l++)
+               *l= ' ';
+       *l = 0;
+}
+
+static void
+showBar(int level, lng clk, char *stmt)
+{
+       lng i =0;
        char line[BUFSIZ], *c;
 
        rendertime(duration,0);
@@ -188,12 +219,12 @@ showBar(int progress, lng clk, char *stm
        if( prevprogress)
                for( i=76+MSGLEN-1; i> prevprogress/2; i--)
                        printf("\b \b");
-       for( ; i < progress/2; i++)
+       for( ; i < level/2; i++)
                putchar('#');
        for( ; i < 50; i++)
                putchar('.');
        putchar(']');
-       printf(" %3d%%",progress);
+       printf(" %3d%%",level);
        if( duration && duration- clk > 0){
                rendertime(duration - clk,0);
                printf("  %s",stamp);
@@ -208,9 +239,9 @@ showBar(int progress, lng clk, char *stm
        if(stmt){
                c = strstr(stmt,":=");
                if( c )
-                       snprintf(line,MSGLEN,"%-*s",MSGLEN,c+2);
+                       renderCall(line,c+2);
                else
-                       snprintf(line,MSGLEN,"%-*s",MSGLEN,stmt);
+                       renderCall(line,stmt);
        } 
        printf("%s",line);
        fflush(stdout);
@@ -241,7 +272,7 @@ progressBarInit(void)
 static void
 update(EventRecord *ev)
 {
-       int progress=0;
+       double progress=0;
        int i;
        char *qry, *q = 0, *c;
        int uid = 0,qid = 0;
@@ -296,7 +327,7 @@ update(EventRecord *ev)
        }
        ev->clkticks -= starttime;
 
-       if ( !capturing || ev->thread >= MAXTHREADS)
+       if ( !capturing)
                return;
 
        /* start of instruction box */
@@ -306,6 +337,7 @@ update(EventRecord *ev)
                        currentquery = malarguments[0];
                        malsize = atoi(malarguments[3]);
                        events = (Event*) malloc(malsize * sizeof(Event));
+                       memset((char*)events, 0, malsize * sizeof(Event));
                        // use the truncated query text, beware that the \ is 
already escaped in the call argument.
                        q = qry = (char *) malloc(strlen(currentquery) * 2);
                        for (c= currentquery; *c; ){
@@ -326,7 +358,8 @@ update(EventRecord *ev)
                events[ev->pc].state = RUNNING;
                events[ev->pc].stmt = ev->stmt;
                events[ev->pc].etc = ev->ticks;
-               free(ev->fcn);
+               if( ev->pc > lastpc)
+                       lastpc = ev->pc;
                fprintf(tachofd,"{\n");
                
fprintf(tachofd,"\"qid\":\"%s\",\n",currentfunction?currentfunction:"");
                fprintf(tachofd,"\"pc\":%d,\n",ev->pc);
@@ -336,6 +369,8 @@ update(EventRecord *ev)
                fprintf(tachofd,"\"stmt\": \"%s\"\n",ev->stmt);
                fprintf(tachofd,"},\n");
                fflush(tachofd);
+
+               clearArguments();
                return;
        }
        if( tachofd == NULL){
@@ -344,11 +379,10 @@ update(EventRecord *ev)
        }
        /* end the instruction box */
        if (ev->state == DONE ){
-               if( events[ev->pc].stmt){
+               if( events[ev->pc].stmt)
                        free(events[ev->pc].stmt);
-                       events[ev->pc].stmt= 0;
-                       events[ev->pc].state= FINISHED;
-               }
+               events[ev->pc].stmt= 0;
+               events[ev->pc].state= FINISHED;
                        
                fprintf(tachofd,"{\n");
                
fprintf(tachofd,"\"qid\":\"%s\",\n",currentfunction?currentfunction:"");
@@ -360,24 +394,22 @@ update(EventRecord *ev)
                fprintf(tachofd,"},\n");
                fflush(tachofd);
 
-               free(ev->fcn);
                free(ev->stmt);
-               if( duration){
+               if( duration)
                        progress = (int)(ev->clkticks / (duration/100.0));
-                       if ( progress > 100)
-                               progress = 100;
-               } else {
-                       progress = (int)( ev->pc / (malsize/100.0));
+               else
+                       progress = (int)( pccount++ / (malsize/100.0));
+               if( progress > prevprogress ){
+                       // pick up last unfinished instruction
+                       for(i= lastpc; i >0; i--)
+                               if( events[i].state == RUNNING && 
events[i].stmt)
+                                       break;
+                       if( progress < prevprogress)
+                               progress = prevprogress;
+                       
showBar((progress>100.0?(int)100:(int)progress),ev->clkticks,events[i].stmt);
+                       prevprogress = progress>100.0?100: (int)progress;
                }
-               if( progress > prevprogress) {
-                       // pick up last unfinished instruction
-                       for(i= ev->pc; i >0; i--)
-                               if( events[i].state == RUNNING)
-                                       break;
-                       showBar(progress,ev->clkticks,events[i].stmt);
-                       //printf("progress "LLFMT" %d\n", 
ev->clkticks,progress);
-                       prevprogress = progress;
-               }
+               clearArguments();
        }
        if (ev->state == DONE && ev->fcn && strncmp(ev->fcn, "function", 8) == 
0) {
                if (currentfunction && strcmp(currentfunction, ev->fcn+9) == 0) 
{
@@ -391,8 +423,6 @@ update(EventRecord *ev)
                                fprintf(stderr, "Leave function %s capture 
%d\n", currentfunction, capturing);
                        resetTachograph();
                } 
-               if( capturing == 0)
-                       return;
        }
 }
 
@@ -419,6 +449,7 @@ main(int argc, char **argv)
                { "host", 1, 0, 'h' },
                { "help", 0, 0, '?' },
                { "beat", 1, 0, 'b' },
+               { "interactive", 1, 0, 'i' },
                { "output", 1, 0, 'o' },
                { "debug", 0, 0, 'D' },
                { 0, 0, 0, 0 }
@@ -429,11 +460,14 @@ main(int argc, char **argv)
 
        while (1) {
                int option_index = 0;
-               int c = getopt_long(argc, argv, "d:u:p:P:h:?:b:o:D",
+               int c = getopt_long(argc, argv, "d:u:p:P:h:?:b:i:o:D",
                                        long_options, &option_index);
                if (c == -1)
                        break;
                switch (c) {
+               case 'i':
+                       interactive = atoi(optarg ? optarg : "1") == 1;
+                       break;
                case 'b':
                        beat = atoi(optarg ? optarg : "5000");
                        break;
@@ -560,8 +594,6 @@ main(int argc, char **argv)
        len = 0;
        while ((n = mnstr_read(conn, buf + len, 1, BUFSIZ - len)) > 0) {
                buf[len + n] = 0;
-               if( trace) 
-                       fprintf(trace,"%s",buf);
                response = buf;
                while ((e = strchr(response, '\n')) != NULL) {
                        *e = 0;
@@ -570,6 +602,8 @@ main(int argc, char **argv)
                        i= eventparser(response, &event);
                        if (debug  )
                                fprintf(stderr, "PARSE %d:%s\n", i, response);
+                       if( trace && i >=0 && capturing) 
+                               fprintf(trace,"%s\n",response);
                        update(&event);
                        response = e + 1;
                }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to