mirror of
https://github.com/tstack/lnav.git
synced 2024-09-11 13:05:51 +03:00
[logline] cache log line schemas to make subsequent queries faster and other tweaks
This commit is contained in:
parent
28ce7329cb
commit
c93172824c
@ -243,6 +243,11 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PCRE_CFLAGS = @PCRE_CFLAGS@
|
||||
PCRE_LIBS = @PCRE_LIBS@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
|
||||
PYTHON_PLATFORM = @PYTHON_PLATFORM@
|
||||
PYTHON_PREFIX = @PYTHON_PREFIX@
|
||||
PYTHON_VERSION = @PYTHON_VERSION@
|
||||
RANLIB = @RANLIB@
|
||||
READLINE_CFLAGS = @READLINE_CFLAGS@
|
||||
READLINE_LIBS = @READLINE_LIBS@
|
||||
@ -297,9 +302,13 @@ mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgpyexecdir = @pkgpyexecdir@
|
||||
pkgpythondir = @pkgpythondir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
pyexecdir = @pyexecdir@
|
||||
pythondir = @pythondir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
|
252
aclocal.m4
vendored
252
aclocal.m4
vendored
@ -716,6 +716,258 @@ AC_DEFUN([_AM_SET_OPTIONS],
|
||||
AC_DEFUN([_AM_IF_OPTION],
|
||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
|
||||
# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
# ---------------------------------------------------------------------------
|
||||
# Adds support for distributing Python modules and packages. To
|
||||
# install modules, copy them to $(pythondir), using the python_PYTHON
|
||||
# automake variable. To install a package with the same name as the
|
||||
# automake package, install to $(pkgpythondir), or use the
|
||||
# pkgpython_PYTHON automake variable.
|
||||
#
|
||||
# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
|
||||
# locations to install python extension modules (shared libraries).
|
||||
# Another macro is required to find the appropriate flags to compile
|
||||
# extension modules.
|
||||
#
|
||||
# If your package is configured with a different prefix to python,
|
||||
# users will have to add the install directory to the PYTHONPATH
|
||||
# environment variable, or create a .pth file (see the python
|
||||
# documentation for details).
|
||||
#
|
||||
# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
|
||||
# cause an error if the version of python installed on the system
|
||||
# doesn't meet the requirement. MINIMUM-VERSION should consist of
|
||||
# numbers and dots only.
|
||||
AC_DEFUN([AM_PATH_PYTHON],
|
||||
[
|
||||
dnl Find a Python interpreter. Python versions prior to 2.0 are not
|
||||
dnl supported. (2.0 was released on October 16, 2000).
|
||||
m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
|
||||
[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl
|
||||
python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0])
|
||||
|
||||
AC_ARG_VAR([PYTHON], [the Python interpreter])
|
||||
|
||||
m4_if([$1],[],[
|
||||
dnl No version check is needed.
|
||||
# Find any Python interpreter.
|
||||
if test -z "$PYTHON"; then
|
||||
AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
|
||||
fi
|
||||
am_display_PYTHON=python
|
||||
], [
|
||||
dnl A version check is needed.
|
||||
if test -n "$PYTHON"; then
|
||||
# If the user set $PYTHON, use it and don't search something else.
|
||||
AC_MSG_CHECKING([whether $PYTHON version is >= $1])
|
||||
AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
|
||||
[AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([Python interpreter is too old])])
|
||||
am_display_PYTHON=$PYTHON
|
||||
else
|
||||
# Otherwise, try each interpreter until we find one that satisfies
|
||||
# VERSION.
|
||||
AC_CACHE_CHECK([for a Python interpreter with version >= $1],
|
||||
[am_cv_pathless_PYTHON],[
|
||||
for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
|
||||
test "$am_cv_pathless_PYTHON" = none && break
|
||||
AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
|
||||
done])
|
||||
# Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
|
||||
if test "$am_cv_pathless_PYTHON" = none; then
|
||||
PYTHON=:
|
||||
else
|
||||
AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
|
||||
fi
|
||||
am_display_PYTHON=$am_cv_pathless_PYTHON
|
||||
fi
|
||||
])
|
||||
|
||||
if test "$PYTHON" = :; then
|
||||
dnl Run any user-specified action, or abort.
|
||||
m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
|
||||
else
|
||||
|
||||
dnl Query Python for its version number. Getting [:3] seems to be
|
||||
dnl the best way to do this; it's what "site.py" does in the standard
|
||||
dnl library.
|
||||
|
||||
AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
|
||||
[am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
|
||||
AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
|
||||
|
||||
dnl Use the values of $prefix and $exec_prefix for the corresponding
|
||||
dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made
|
||||
dnl distinct variables so they can be overridden if need be. However,
|
||||
dnl general consensus is that you shouldn't need this ability.
|
||||
|
||||
AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
|
||||
AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
|
||||
|
||||
dnl At times (like when building shared libraries) you may want
|
||||
dnl to know which OS platform Python thinks this is.
|
||||
|
||||
AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
|
||||
[am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
|
||||
AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
|
||||
|
||||
# Just factor out some code duplication.
|
||||
am_python_setup_sysconfig="\
|
||||
import sys
|
||||
# Prefer sysconfig over distutils.sysconfig, for better compatibility
|
||||
# with python 3.x. See automake bug#10227.
|
||||
try:
|
||||
import sysconfig
|
||||
except ImportError:
|
||||
can_use_sysconfig = 0
|
||||
else:
|
||||
can_use_sysconfig = 1
|
||||
# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
|
||||
# <https://github.com/pypa/virtualenv/issues/118>
|
||||
try:
|
||||
from platform import python_implementation
|
||||
if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7':
|
||||
can_use_sysconfig = 0
|
||||
except ImportError:
|
||||
pass"
|
||||
|
||||
dnl Set up 4 directories:
|
||||
|
||||
dnl pythondir -- where to install python scripts. This is the
|
||||
dnl site-packages directory, not the python standard library
|
||||
dnl directory like in previous automake betas. This behavior
|
||||
dnl is more consistent with lispdir.m4 for example.
|
||||
dnl Query distutils for this directory.
|
||||
AC_CACHE_CHECK([for $am_display_PYTHON script directory],
|
||||
[am_cv_python_pythondir],
|
||||
[if test "x$prefix" = xNONE
|
||||
then
|
||||
am_py_prefix=$ac_default_prefix
|
||||
else
|
||||
am_py_prefix=$prefix
|
||||
fi
|
||||
am_cv_python_pythondir=`$PYTHON -c "
|
||||
$am_python_setup_sysconfig
|
||||
if can_use_sysconfig:
|
||||
sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
|
||||
else:
|
||||
from distutils import sysconfig
|
||||
sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
|
||||
sys.stdout.write(sitedir)"`
|
||||
case $am_cv_python_pythondir in
|
||||
$am_py_prefix*)
|
||||
am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
|
||||
am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
|
||||
;;
|
||||
*)
|
||||
case $am_py_prefix in
|
||||
/usr|/System*) ;;
|
||||
*)
|
||||
am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
])
|
||||
AC_SUBST([pythondir], [$am_cv_python_pythondir])
|
||||
|
||||
dnl pkgpythondir -- $PACKAGE directory under pythondir. Was
|
||||
dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
|
||||
dnl more consistent with the rest of automake.
|
||||
|
||||
AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
|
||||
|
||||
dnl pyexecdir -- directory for installing python extension modules
|
||||
dnl (shared libraries)
|
||||
dnl Query distutils for this directory.
|
||||
AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
|
||||
[am_cv_python_pyexecdir],
|
||||
[if test "x$exec_prefix" = xNONE
|
||||
then
|
||||
am_py_exec_prefix=$am_py_prefix
|
||||
else
|
||||
am_py_exec_prefix=$exec_prefix
|
||||
fi
|
||||
am_cv_python_pyexecdir=`$PYTHON -c "
|
||||
$am_python_setup_sysconfig
|
||||
if can_use_sysconfig:
|
||||
sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
|
||||
else:
|
||||
from distutils import sysconfig
|
||||
sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
|
||||
sys.stdout.write(sitedir)"`
|
||||
case $am_cv_python_pyexecdir in
|
||||
$am_py_exec_prefix*)
|
||||
am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
|
||||
am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
|
||||
;;
|
||||
*)
|
||||
case $am_py_exec_prefix in
|
||||
/usr|/System*) ;;
|
||||
*)
|
||||
am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
])
|
||||
AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
|
||||
|
||||
dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
|
||||
|
||||
AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
|
||||
|
||||
dnl Run any user-specified action.
|
||||
$2
|
||||
fi
|
||||
|
||||
])
|
||||
|
||||
|
||||
# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
|
||||
# ---------------------------------------------------------------------------
|
||||
# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
|
||||
# Run ACTION-IF-FALSE otherwise.
|
||||
# This test uses sys.hexversion instead of the string equivalent (first
|
||||
# word of sys.version), in order to cope with versions such as 2.2c1.
|
||||
# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
|
||||
AC_DEFUN([AM_PYTHON_CHECK_VERSION],
|
||||
[prog="import sys
|
||||
# split strings by '.' and convert to numeric. Append some zeros
|
||||
# because we need at least 4 digits for the hex conversion.
|
||||
# map returns an iterator in Python 3.0 and a list in 2.x
|
||||
minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
|
||||
minverhex = 0
|
||||
# xrange is not present in Python 3.0 and range returns an iterator
|
||||
for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
|
||||
sys.exit(sys.hexversion < minverhex)"
|
||||
AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
|
||||
|
||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# AM_RUN_LOG(COMMAND)
|
||||
# -------------------
|
||||
# Run COMMAND, save the exit status in ac_status, and log it.
|
||||
# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
|
||||
AC_DEFUN([AM_RUN_LOG],
|
||||
[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
|
||||
($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
|
||||
(exit $ac_status); }])
|
||||
|
||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||
|
||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
||||
|
273
configure
vendored
273
configure
vendored
@ -646,6 +646,15 @@ ac_ct_CC
|
||||
CFLAGS
|
||||
CC
|
||||
SQLITE3_CMD
|
||||
pkgpyexecdir
|
||||
pyexecdir
|
||||
pkgpythondir
|
||||
pythondir
|
||||
PYTHON_PLATFORM
|
||||
PYTHON_EXEC_PREFIX
|
||||
PYTHON_PREFIX
|
||||
PYTHON_VERSION
|
||||
PYTHON
|
||||
LN_S
|
||||
RANLIB
|
||||
CFLAGS_PG
|
||||
@ -763,6 +772,7 @@ LDFLAGS
|
||||
LIBS
|
||||
CPPFLAGS
|
||||
CCC
|
||||
PYTHON
|
||||
CC
|
||||
CFLAGS
|
||||
CPP
|
||||
@ -1412,6 +1422,7 @@ Some influential environment variables:
|
||||
LIBS libraries to pass to the linker, e.g. -l<library>
|
||||
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
|
||||
you have headers in a nonstandard directory <include dir>
|
||||
PYTHON the Python interpreter
|
||||
CC C compiler command
|
||||
CFLAGS C compiler flags
|
||||
CPP C preprocessor
|
||||
@ -3947,6 +3958,268 @@ $as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if test -n "$PYTHON"; then
|
||||
# If the user set $PYTHON, use it and don't search something else.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.4" >&5
|
||||
$as_echo_n "checking whether $PYTHON version is >= 2.4... " >&6; }
|
||||
prog="import sys
|
||||
# split strings by '.' and convert to numeric. Append some zeros
|
||||
# because we need at least 4 digits for the hex conversion.
|
||||
# map returns an iterator in Python 3.0 and a list in 2.x
|
||||
minver = list(map(int, '2.4'.split('.'))) + [0, 0, 0]
|
||||
minverhex = 0
|
||||
# xrange is not present in Python 3.0 and range returns an iterator
|
||||
for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
|
||||
sys.exit(sys.hexversion < minverhex)"
|
||||
if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
|
||||
($PYTHON -c "$prog") >&5 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
as_fn_error $? "Python interpreter is too old" "$LINENO" 5
|
||||
fi
|
||||
am_display_PYTHON=$PYTHON
|
||||
else
|
||||
# Otherwise, try each interpreter until we find one that satisfies
|
||||
# VERSION.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.4" >&5
|
||||
$as_echo_n "checking for a Python interpreter with version >= 2.4... " >&6; }
|
||||
if ${am_cv_pathless_PYTHON+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
|
||||
for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do
|
||||
test "$am_cv_pathless_PYTHON" = none && break
|
||||
prog="import sys
|
||||
# split strings by '.' and convert to numeric. Append some zeros
|
||||
# because we need at least 4 digits for the hex conversion.
|
||||
# map returns an iterator in Python 3.0 and a list in 2.x
|
||||
minver = list(map(int, '2.4'.split('.'))) + [0, 0, 0]
|
||||
minverhex = 0
|
||||
# xrange is not present in Python 3.0 and range returns an iterator
|
||||
for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
|
||||
sys.exit(sys.hexversion < minverhex)"
|
||||
if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
|
||||
($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; then :
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5
|
||||
$as_echo "$am_cv_pathless_PYTHON" >&6; }
|
||||
# Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
|
||||
if test "$am_cv_pathless_PYTHON" = none; then
|
||||
PYTHON=:
|
||||
else
|
||||
# Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
|
||||
set dummy $am_cv_pathless_PYTHON; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_PYTHON+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
case $PYTHON in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
PYTHON=$ac_cv_path_PYTHON
|
||||
if test -n "$PYTHON"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
|
||||
$as_echo "$PYTHON" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
am_display_PYTHON=$am_cv_pathless_PYTHON
|
||||
fi
|
||||
|
||||
|
||||
if test "$PYTHON" = :; then
|
||||
as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5
|
||||
else
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
|
||||
$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
|
||||
if ${am_cv_python_version+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
|
||||
$as_echo "$am_cv_python_version" >&6; }
|
||||
PYTHON_VERSION=$am_cv_python_version
|
||||
|
||||
|
||||
|
||||
PYTHON_PREFIX='${prefix}'
|
||||
|
||||
PYTHON_EXEC_PREFIX='${exec_prefix}'
|
||||
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
|
||||
$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
|
||||
if ${am_cv_python_platform+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
|
||||
$as_echo "$am_cv_python_platform" >&6; }
|
||||
PYTHON_PLATFORM=$am_cv_python_platform
|
||||
|
||||
|
||||
# Just factor out some code duplication.
|
||||
am_python_setup_sysconfig="\
|
||||
import sys
|
||||
# Prefer sysconfig over distutils.sysconfig, for better compatibility
|
||||
# with python 3.x. See automake bug#10227.
|
||||
try:
|
||||
import sysconfig
|
||||
except ImportError:
|
||||
can_use_sysconfig = 0
|
||||
else:
|
||||
can_use_sysconfig = 1
|
||||
# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
|
||||
# <https://github.com/pypa/virtualenv/issues/118>
|
||||
try:
|
||||
from platform import python_implementation
|
||||
if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
|
||||
can_use_sysconfig = 0
|
||||
except ImportError:
|
||||
pass"
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
|
||||
$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
|
||||
if ${am_cv_python_pythondir+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test "x$prefix" = xNONE
|
||||
then
|
||||
am_py_prefix=$ac_default_prefix
|
||||
else
|
||||
am_py_prefix=$prefix
|
||||
fi
|
||||
am_cv_python_pythondir=`$PYTHON -c "
|
||||
$am_python_setup_sysconfig
|
||||
if can_use_sysconfig:
|
||||
sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
|
||||
else:
|
||||
from distutils import sysconfig
|
||||
sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
|
||||
sys.stdout.write(sitedir)"`
|
||||
case $am_cv_python_pythondir in
|
||||
$am_py_prefix*)
|
||||
am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
|
||||
am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
|
||||
;;
|
||||
*)
|
||||
case $am_py_prefix in
|
||||
/usr|/System*) ;;
|
||||
*)
|
||||
am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
|
||||
$as_echo "$am_cv_python_pythondir" >&6; }
|
||||
pythondir=$am_cv_python_pythondir
|
||||
|
||||
|
||||
|
||||
pkgpythondir=\${pythondir}/$PACKAGE
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
|
||||
$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
|
||||
if ${am_cv_python_pyexecdir+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test "x$exec_prefix" = xNONE
|
||||
then
|
||||
am_py_exec_prefix=$am_py_prefix
|
||||
else
|
||||
am_py_exec_prefix=$exec_prefix
|
||||
fi
|
||||
am_cv_python_pyexecdir=`$PYTHON -c "
|
||||
$am_python_setup_sysconfig
|
||||
if can_use_sysconfig:
|
||||
sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
|
||||
else:
|
||||
from distutils import sysconfig
|
||||
sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
|
||||
sys.stdout.write(sitedir)"`
|
||||
case $am_cv_python_pyexecdir in
|
||||
$am_py_exec_prefix*)
|
||||
am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
|
||||
am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
|
||||
;;
|
||||
*)
|
||||
case $am_py_exec_prefix in
|
||||
/usr|/System*) ;;
|
||||
*)
|
||||
am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
|
||||
$as_echo "$am_cv_python_pyexecdir" >&6; }
|
||||
pyexecdir=$am_cv_python_pyexecdir
|
||||
|
||||
|
||||
|
||||
pkgpyexecdir=\${pyexecdir}/$PACKAGE
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Extract the first word of "sqlite3", so it can be a program name with args.
|
||||
set dummy sqlite3; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
|
@ -88,6 +88,8 @@ AC_PROG_RANLIB
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
AM_PATH_PYTHON([2.4])
|
||||
|
||||
AC_PATH_PROG(SQLITE3_CMD, [sqlite3])
|
||||
|
||||
if test x"$SQLITE3_CMD" = x""; then
|
||||
|
@ -8,7 +8,10 @@ noinst_LIBRARIES = libdiag.a
|
||||
help.c: $(srcdir)/help.txt bin2c
|
||||
./bin2c -z -c $< $@
|
||||
|
||||
init-sql.c: $(srcdir)/init.sql bin2c
|
||||
init.sql: $(srcdir)/init_sql.py
|
||||
$(PYTHON) $< > $@
|
||||
|
||||
init-sql.c: init.sql bin2c
|
||||
./bin2c -z -c $< $@
|
||||
|
||||
AM_LDFLAGS = \
|
||||
|
@ -268,6 +268,11 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PCRE_CFLAGS = @PCRE_CFLAGS@
|
||||
PCRE_LIBS = @PCRE_LIBS@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
|
||||
PYTHON_PLATFORM = @PYTHON_PLATFORM@
|
||||
PYTHON_PREFIX = @PYTHON_PREFIX@
|
||||
PYTHON_VERSION = @PYTHON_VERSION@
|
||||
RANLIB = @RANLIB@
|
||||
READLINE_CFLAGS = @READLINE_CFLAGS@
|
||||
READLINE_LIBS = @READLINE_LIBS@
|
||||
@ -322,9 +327,13 @@ mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgpyexecdir = @pkgpyexecdir@
|
||||
pkgpythondir = @pkgpythondir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
pyexecdir = @pyexecdir@
|
||||
pythondir = @pythondir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -1012,7 +1021,10 @@ uninstall-am: uninstall-binPROGRAMS
|
||||
help.c: $(srcdir)/help.txt bin2c
|
||||
./bin2c -z -c $< $@
|
||||
|
||||
init-sql.c: $(srcdir)/init.sql bin2c
|
||||
init.sql: $(srcdir)/init_sql.py
|
||||
$(PYTHON) $< > $@
|
||||
|
||||
init-sql.c: init.sql bin2c
|
||||
./bin2c -z -c $< $@
|
||||
|
||||
uncrusty:
|
||||
|
@ -5,15 +5,13 @@ import httplib
|
||||
TABLES = """
|
||||
-- This file was created by init_sql.py --
|
||||
|
||||
CREATE TABLE IF NOT EXISTS http_status_codes (
|
||||
CREATE TABLE IF NOT EXISTS http_status_code (
|
||||
status integer PRIMARY KEY,
|
||||
message text,
|
||||
|
||||
FOREIGN KEY(status) REFERENCES access_log(sc_status)
|
||||
message text
|
||||
);
|
||||
"""
|
||||
|
||||
print TABLES
|
||||
|
||||
for item in httplib.responses.iteritems():
|
||||
print "INSERT INTO http_status_codes VALUES (%d, \"%s\");" % item
|
||||
print "INSERT INTO http_status_code VALUES (%d, \"%s\");" % item
|
||||
|
37
src/lnav.cc
37
src/lnav.cc
@ -395,6 +395,16 @@ bool setup_logline_table()
|
||||
|
||||
walk_sqlite_metadata(lnav_data.ld_db.in(), lnav_sql_meta_callbacks);
|
||||
|
||||
{
|
||||
log_vtab_manager::iterator iter;
|
||||
|
||||
for (iter = lnav_data.ld_vtab_manager->begin();
|
||||
iter != lnav_data.ld_vtab_manager->end();
|
||||
++iter) {
|
||||
iter->second->get_foreign_keys(lnav_data.ld_db_key_names);
|
||||
}
|
||||
}
|
||||
|
||||
stable_sort(lnav_data.ld_db_key_names.begin(),
|
||||
lnav_data.ld_db_key_names.end());
|
||||
|
||||
@ -1666,7 +1676,6 @@ int sql_callback(sqlite3_stmt *stmt)
|
||||
bool graphable;
|
||||
|
||||
graphable = ((type == SQLITE_INTEGER || type == SQLITE_FLOAT) &&
|
||||
colname != "log_line" &&
|
||||
!binary_search(lnav_data.ld_db_key_names.begin(),
|
||||
lnav_data.ld_db_key_names.end(),
|
||||
colname));
|
||||
@ -2705,6 +2714,12 @@ public:
|
||||
cols.push_back(vtab_column("cs_referer", SQLITE3_TEXT));
|
||||
cols.push_back(vtab_column("cs_user_agent", SQLITE3_TEXT));
|
||||
};
|
||||
|
||||
void get_foreign_keys(vector<string> &keys_inout) {
|
||||
this->log_vtab_impl::get_foreign_keys(keys_inout);
|
||||
|
||||
keys_inout.push_back("sc_status");
|
||||
};
|
||||
};
|
||||
|
||||
class syslog_log_table : public log_vtab_impl {
|
||||
@ -2716,7 +2731,13 @@ public:
|
||||
void get_columns(vector<vtab_column> &cols)
|
||||
{
|
||||
cols.push_back(vtab_column("log_hostname", SQLITE3_TEXT));
|
||||
cols.push_back(vtab_column("log_pid", SQLITE3_TEXT));
|
||||
cols.push_back(vtab_column("log_pid", SQLITE_INTEGER));
|
||||
};
|
||||
|
||||
void get_foreign_keys(vector<string> &keys_inout) {
|
||||
this->log_vtab_impl::get_foreign_keys(keys_inout);
|
||||
|
||||
keys_inout.push_back("log_pid");
|
||||
};
|
||||
};
|
||||
|
||||
@ -2979,12 +3000,6 @@ int main(int argc, char *argv[])
|
||||
lnav_data.ld_log_source,
|
||||
sql_progress);
|
||||
|
||||
lnav_data.ld_vtab_manager->register_vtab(new syslog_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new log_vtab_impl("generic_log"));
|
||||
lnav_data.ld_vtab_manager->register_vtab(new access_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new glog_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new strace_log_table());
|
||||
|
||||
{
|
||||
auto_mem<char, sqlite3_free> errmsg;
|
||||
|
||||
@ -2999,6 +3014,12 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
lnav_data.ld_vtab_manager->register_vtab(new syslog_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new log_vtab_impl("generic_log"));
|
||||
lnav_data.ld_vtab_manager->register_vtab(new access_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new glog_log_table());
|
||||
lnav_data.ld_vtab_manager->register_vtab(new strace_log_table());
|
||||
|
||||
DEFAULT_FILES.insert(make_pair(LNF_SYSLOG, string("var/log/messages")));
|
||||
DEFAULT_FILES.insert(make_pair(LNF_SYSLOG, string("var/log/system.log")));
|
||||
DEFAULT_FILES.insert(make_pair(LNF_SYSLOG, string("var/log/syslog")));
|
||||
|
@ -126,6 +126,11 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lf_iter->has_schema() &&
|
||||
!lf_iter->match_schema(this->ldt_schema_id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
string_attrs_t sa;
|
||||
struct line_range body;
|
||||
std::vector<logline_value> line_values;
|
||||
@ -141,6 +146,10 @@ public:
|
||||
data_parser dp(&ds);
|
||||
dp.parse();
|
||||
|
||||
lf_iter->set_schema(dp.dp_schema_id);
|
||||
|
||||
// The cached schema ID in the log line is not complete, so we still
|
||||
// need to check for a full match.
|
||||
if (dp.dp_schema_id != this->ldt_schema_id) {
|
||||
return false;
|
||||
}
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
#include "byte_array.hh"
|
||||
#include "view_curses.hh"
|
||||
|
||||
/**
|
||||
@ -94,7 +95,9 @@ public:
|
||||
ll_time(t),
|
||||
ll_millis(millis),
|
||||
ll_level(l),
|
||||
ll_module(m) { };
|
||||
ll_module(m) {
|
||||
memset(this->ll_schema, 0, sizeof(this->ll_schema));
|
||||
};
|
||||
|
||||
/** @return The offset of the line in the file. */
|
||||
off_t get_offset() const { return this->ll_offset; };
|
||||
@ -124,6 +127,40 @@ public:
|
||||
|
||||
uint8_t get_module() const { return this->ll_module; };
|
||||
|
||||
/**
|
||||
* @return True if there is a schema value set for this log line.
|
||||
*/
|
||||
bool has_schema(void) const {
|
||||
return (this->ll_schema[0] != 0 ||
|
||||
this->ll_schema[1] != 0 ||
|
||||
this->ll_schema[2] != 0 ||
|
||||
this->ll_schema[3] != 0);
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the "schema" for this log line. The schema ID is used to match log
|
||||
* lines that have a similar format when generating the logline table. The
|
||||
* schema is set lazily so that startup is faster.
|
||||
*
|
||||
* @param ba The SHA-1 hash of the constant parts of this log line.
|
||||
*/
|
||||
void set_schema(const byte_array<20> &ba) {
|
||||
memcpy(this->ll_schema, ba.in(), sizeof(this->ll_schema));
|
||||
};
|
||||
|
||||
/**
|
||||
* Perform a partial match of the given schema against this log line.
|
||||
* Storing the full schema is not practical, so we just keep the first four
|
||||
* bytes.
|
||||
*
|
||||
* @param ba The SHA-1 hash of the constant parts of a log line.
|
||||
* @return True if the first four bytes of the given schema match the
|
||||
* schema stored in this log line.
|
||||
*/
|
||||
bool match_schema(const byte_array<20> &ba) const {
|
||||
return memcmp(this->ll_schema, ba.in(), sizeof(this->ll_schema)) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare loglines based on their timestamp.
|
||||
*/
|
||||
@ -142,6 +179,7 @@ private:
|
||||
uint16_t ll_millis;
|
||||
uint8_t ll_level;
|
||||
uint8_t ll_module;
|
||||
char ll_schema[4];
|
||||
};
|
||||
|
||||
class logline_value {
|
||||
|
@ -64,7 +64,7 @@ static string declare_table_statement(log_vtab_impl *vi)
|
||||
std::ostringstream oss;
|
||||
|
||||
oss << "CREATE TABLE unused (\n"
|
||||
<< " log_line text,\n"
|
||||
<< " log_line integer PRIMARY KEY,\n"
|
||||
<< " log_time datetime,\n"
|
||||
<< " log_idle_msecs int,\n"
|
||||
<< " log_level text,\n";
|
||||
|
@ -101,6 +101,10 @@ public:
|
||||
|
||||
virtual void get_columns(std::vector<vtab_column> &cols) { };
|
||||
|
||||
virtual void get_foreign_keys(std::vector<std::string> &keys_inout) {
|
||||
keys_inout.push_back("log_line");
|
||||
};
|
||||
|
||||
virtual void extract(logfile *lf,
|
||||
const std::string &line,
|
||||
std::vector<logline_value> &values)
|
||||
@ -120,6 +124,8 @@ typedef int (*sql_progress_callback_t)(const log_cursor &lc);
|
||||
|
||||
class log_vtab_manager {
|
||||
public:
|
||||
typedef std::map<std::string, log_vtab_impl *>::const_iterator iterator;
|
||||
|
||||
log_vtab_manager(sqlite3 *db,
|
||||
logfile_sub_source &lss,
|
||||
sql_progress_callback_t);
|
||||
@ -134,6 +140,14 @@ public:
|
||||
return this->vm_impls[name];
|
||||
};
|
||||
|
||||
iterator begin() const {
|
||||
return this->vm_impls.begin();
|
||||
};
|
||||
|
||||
iterator end() const {
|
||||
return this->vm_impls.end();
|
||||
};
|
||||
|
||||
private:
|
||||
sqlite3 * vm_db;
|
||||
logfile_sub_source &vm_source;
|
||||
|
@ -536,6 +536,11 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PCRE_CFLAGS = @PCRE_CFLAGS@
|
||||
PCRE_LIBS = @PCRE_LIBS@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
|
||||
PYTHON_PLATFORM = @PYTHON_PLATFORM@
|
||||
PYTHON_PREFIX = @PYTHON_PREFIX@
|
||||
PYTHON_VERSION = @PYTHON_VERSION@
|
||||
RANLIB = @RANLIB@
|
||||
READLINE_CFLAGS = @READLINE_CFLAGS@
|
||||
READLINE_LIBS = @READLINE_LIBS@
|
||||
@ -590,9 +595,13 @@ mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgpyexecdir = @pkgpyexecdir@
|
||||
pkgpythondir = @pkgpythondir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
pyexecdir = @pyexecdir@
|
||||
pythondir = @pythondir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
|
Loading…
Reference in New Issue
Block a user