From 7a3650a711bb40a5dde815309975fde76b09052b Mon Sep 17 00:00:00 2001 From: tstack Date: Sat, 13 Feb 2010 10:23:13 -0800 Subject: [PATCH] fix some minor glitches, add idle_msecs column to log tables --- src/Makefile.am | 3 +- src/Makefile.in | 3 +- src/lnav.cc | 69 +++++++++++++++++++++++++++++++----------- src/log_vtab_impl.cc | 23 ++++++++++++-- src/readline_curses.cc | 26 ++++++++-------- test/scripty.cc | 2 +- 6 files changed, 90 insertions(+), 36 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index ceaea56f..7faf6b69 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,7 +25,8 @@ endif AM_LDFLAGS = \ $(SQLITE3_LDFLAGS) \ $(PCRE_LDFLAGS) \ - -pthread + -pthread \ + -static AM_CPPFLAGS = \ -Wall \ diff --git a/src/Makefile.in b/src/Makefile.in index b086b84b..8492b206 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -211,7 +211,8 @@ noinst_LIBRARIES = libdiag.a AM_LDFLAGS = \ $(SQLITE3_LDFLAGS) \ $(PCRE_LDFLAGS) \ - -pthread + -pthread \ + -static AM_CPPFLAGS = \ -Wall \ diff --git a/src/lnav.cc b/src/lnav.cc index 9efef4a0..29bc442a 100644 --- a/src/lnav.cc +++ b/src/lnav.cc @@ -98,7 +98,6 @@ typedef enum { } lnav_status_t; typedef enum { - LG_SEARCH, LG_GRAPH, LG_CAPTURE, @@ -264,6 +263,8 @@ static struct { stack ld_view_stack; textview_curses ld_views[LNV__MAX]; + auto_ptr ld_search_child[LNV__MAX]; + vis_line_t ld_search_start_line; readline_curses *ld_rl_view; logfile_sub_source ld_log_source; @@ -417,6 +418,11 @@ static void rebuild_indexes(bool force) lnav_data.ld_grep_child[lpc]->get_grep_proc()->start(); } } + if (lnav_data.ld_search_child[LNV_LOG].get() != NULL) { + lnav_data.ld_search_child[LNV_LOG]->get_grep_proc()-> + queue_request(start_line); + lnav_data.ld_search_child[LNV_LOG]->get_grep_proc()->start(); + } } lnav_data.ld_bottom_source.update_filtered(lss); @@ -624,11 +630,6 @@ static bool toggle_view(textview_curses *toggle_tc) lnav_data.ld_view_stack.pop(); } else { - int lpc; - - for (lpc = 0; lpc < LG__MAX; lpc++) { - lnav_data.ld_grep_child[lpc].reset(); - } lnav_data.ld_view_stack.push(toggle_tc); retval = true; } @@ -639,6 +640,15 @@ static bool toggle_view(textview_curses *toggle_tc) return retval; } +static void ensure_view(textview_curses *expected_tc) +{ + textview_curses *tc = lnav_data.ld_view_stack.top(); + + if (tc != expected_tc) { + toggle_view(expected_tc); + } +} + static void moveto_cluster(vis_line_t (bookmark_vector::*f)(vis_line_t), bookmark_type_t *bt, vis_line_t top) @@ -1000,6 +1010,8 @@ static void handle_paging_key(int ch) case '/': lnav_data.ld_mode = LNM_SEARCH; + lnav_data.ld_search_start_line = lnav_data.ld_view_stack.top()-> + get_top(); lnav_data.ld_rl_view->focus(LNM_SEARCH, "/"); break; @@ -1466,7 +1478,6 @@ static int sql_callback(void *arg, { db_label_source &dls = lnav_data.ld_db_rows; hist_source &hs = lnav_data.ld_db_source; - double num_value = 0.0; int row_number; int lpc, retval = 0; @@ -1481,6 +1492,8 @@ static int sql_callback(void *arg, } } for (lpc = 0; lpc < ncols; lpc++) { + double num_value = 0.0; + dls.push_column(values[lpc]); sscanf(values[lpc], "%lf", &num_value); hs.add_value(row_number, bucket_type_t(lpc), num_value); @@ -1491,18 +1504,16 @@ static int sql_callback(void *arg, static void rl_search(void *dummy, readline_curses *rc) { - static string last_search[LG__MAX]; + static string last_search[LNV__MAX]; string name; - int index; switch (lnav_data.ld_mode) { case LNM_SEARCH: - index = LG_SEARCH; name = "(search"; break; case LNM_CAPTURE: - index = LG_CAPTURE; + assert(0); name = "(capture"; break; @@ -1530,6 +1541,10 @@ static void rl_search(void *dummy, readline_curses *rc) lnav_data.ld_bottom_source. grep_error(string("sql error: ") + string(errmsg)); } + else { + lnav_data.ld_bottom_source. + grep_error(""); + } } return; default: @@ -1537,10 +1552,11 @@ static void rl_search(void *dummy, readline_curses *rc) break; } - auto_ptr &gc = lnav_data.ld_grep_child[index]; + textview_curses *tc = lnav_data.ld_view_stack.top(); + int index = (tc - lnav_data.ld_views); + auto_ptr &gc = lnav_data.ld_search_child[index]; if ((gc.get() == NULL) || (rc->get_value() != last_search[index])) { - textview_curses *tc = lnav_data.ld_view_stack.top(); const char *errptr; pcre *code; int eoff; @@ -1552,6 +1568,8 @@ static void rl_search(void *dummy, readline_curses *rc) gc.reset(); fprintf(stderr, "start search for: %s\n", rc->get_value().c_str()); + + tc->set_top(lnav_data.ld_search_start_line); if (rc->get_value().empty()) { lnav_data.ld_bottom_source.grep_error(""); @@ -1663,8 +1681,9 @@ static void rl_callback(void *dummy, readline_curses *rc) hs.analyze(); lnav_data.ld_views[LNV_DB].reload_data(); - if (dls.dls_rows.size() > 0) - toggle_view(&lnav_data.ld_views[LNV_DB]); + if (dls.dls_rows.size() > 0) { + ensure_view(&lnav_data.ld_views[LNV_DB]); + } } } @@ -1808,6 +1827,7 @@ static void looper(void) "from", "group", "having", + "idle_msecs", "index", "indexed", "inner", @@ -2005,10 +2025,15 @@ static void looper(void) rc = select(lnav_data.ld_max_fd + 1, &ready_rfds, NULL, NULL, &to); + + { + int index; - if (lnav_data.ld_grep_child[LG_SEARCH].get() != NULL) { - lnav_data.ld_bottom_source. - update_hits(lnav_data.ld_view_stack.top()); + index = lnav_data.ld_view_stack.top() - lnav_data.ld_views; + if (lnav_data.ld_search_child[index].get() != NULL) { + lnav_data.ld_bottom_source. + update_hits(lnav_data.ld_view_stack.top()); + } } if (rc < 0) { @@ -2068,6 +2093,14 @@ static void looper(void) } } } + for (lpc = 0; lpc < LNV__MAX; lpc++) { + auto_ptr &gc = + lnav_data.ld_search_child[lpc]; + + if (gc.get() != NULL) { + gc->get_grep_proc()->check_fd_set(ready_rfds); + } + } rlc.check_fd_set(ready_rfds); } diff --git a/src/log_vtab_impl.cc b/src/log_vtab_impl.cc index 0a347851..64053d94 100644 --- a/src/log_vtab_impl.cc +++ b/src/log_vtab_impl.cc @@ -17,6 +17,7 @@ static string declare_table_statement(log_vtab_impl *vi) << " line_number int,\n" << " path text,\n" << " log_time datetime,\n" + << " idle_msecs int,\n" << " level text,\n" << " raw_line text"; vi->get_columns(cols); @@ -205,6 +206,24 @@ static int vt_column(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int col) } break; case 3: + if (vc->curr_line == 0) { + sqlite3_result_int64( ctx, 0 ); + } + else { + content_line_t prev_cl(vt->lss->at(vis_line_t(vc->curr_line - 1))); + logfile *prev_lf = vt->lss->find(prev_cl); + logfile::iterator prev_ll = prev_lf->begin() + prev_cl; + uint64_t prev_time, curr_line_time; + + prev_time = prev_ll->get_time() * 1000ULL; + prev_time += prev_ll->get_millis(); + curr_line_time = ll->get_time() * 1000ULL; + curr_line_time += ll->get_millis(); + assert(curr_line_time >= prev_time); + sqlite3_result_int64( ctx, curr_line_time - prev_time ); + } + break; + case 4: { const char *level_name = ll->get_level_name(); @@ -214,7 +233,7 @@ static int vt_column(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int col) SQLITE_STATIC); } break; - case 4: + case 5: { string line; @@ -232,7 +251,7 @@ static int vt_column(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int col) line_iter = lf->begin() + cl; lf->read_line(line_iter, line); - vt->vi->extract(line, col - 5, ctx); + vt->vi->extract(line, col - 6, ctx); } break; } diff --git a/src/readline_curses.cc b/src/readline_curses.cc index 7c84f47b..3996a417 100644 --- a/src/readline_curses.cc +++ b/src/readline_curses.cc @@ -179,6 +179,8 @@ readline_curses::readline_curses() signal(SIGALRM, sigalrm); signal(SIGWINCH, sigwinch); + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); dup2(this->rc_pty[RCF_SLAVE], STDIN_FILENO); dup2(this->rc_pty[RCF_SLAVE], STDOUT_FILENO); @@ -404,26 +406,24 @@ void readline_curses::check_fd_set(fd_set &ready_rfds) char buffer[128]; rc = read(this->rc_pty[RCF_MASTER], buffer, sizeof(buffer)); - assert(rc != 0); - assert(rc != -1 && (errno != EINTR || errno != EIO)); - - { - int lpc; - - fprintf(stderr, "from child %d|", rc); - for (lpc = 0; lpc < rc; lpc++) { - fprintf(stderr, " %d", buffer[lpc]); + if (rc > 0) { + { + int lpc; + + fprintf(stderr, "from child %d|", rc); + for (lpc = 0; lpc < rc; lpc++) { + fprintf(stderr, " %d", buffer[lpc]); + } + fprintf(stderr, "\n"); } - fprintf(stderr, "\n"); + + this->map_output(buffer, rc); } - - this->map_output(buffer, rc); } if (FD_ISSET(this->rc_command_pipe[RCF_MASTER], &ready_rfds)) { char msg[1024 + 1]; rc = read(this->rc_command_pipe[RCF_MASTER], msg, sizeof(msg) - 1); - assert(rc != 0); if (rc >= 2) { string old_value = this->rc_value; diff --git a/test/scripty.cc b/test/scripty.cc index 0e7da4b2..bcd6dcb7 100644 --- a/test/scripty.cc +++ b/test/scripty.cc @@ -198,7 +198,7 @@ static char *hex2bits(const char *src) len = strlen(src) / 2; retval = new char[sizeof(int) + len]; *((int *)retval) = len; - while (src[0]) { + while (pos < (sizeof(int) + len)) { int val; sscanf(src, "%2x", &val);