#!/bin/sh
-# $Id: buildconf.sh,v 1.13 2006-10-13 10:31:54 adam Exp $
+# $Id: buildconf.sh,v 1.14 2008-02-27 11:08:48 adam Exp $
automake=automake
aclocal=aclocal
autoconf, automake, libtool, gcc, g++, make,
xsltproc, docbook, docbook-xml, docbook-xsl, trang,
libxslt1-dev, libyazpp-dev,
- libboost-thread-dev, libboost-date-time-dev,
- libboost-program-options-dev, libboost-test-dev
+ libboost-thread-dev, libboost-test-dev
and for the image-processing needed to build the documentation:
inkscape
AC_CHECK_LIB(dl,dlopen)
AC_CHECK_LIB(m,main)
+AC_CHECK_FUNCS([localtime_r])
+
## YAZPP checks
YAZPP_INIT([threads],[1.1.0])
if test -z "$YAZPPLIB"; then
if test "$ax_cv_boost_base" = "no"; then
AC_MSG_ERROR([install libboost-dev or similar])
fi
-if test "$ax_cv_boost_date_time" = "no"; then
- AC_MSG_ERROR([install libboost-date-time-dev or similar])
-fi
if test "$ax_cv_boost_thread" = "no"; then
AC_MSG_ERROR([install libboost-thread-dev or similar])
fi
Standards-Version: 3.6.2
Maintainer: Marc Cromme <marc@indexdata.dk>
Priority: extra
-Build-Depends: debhelper (>= 4), libyaz3-dev, libyazpp3-dev (>= 1.1.0), libxslt1-dev, libboost-dev, libboost-thread-dev, libboost-date-time-dev, libboost-test-dev
+Build-Depends: debhelper (>= 4), libyaz3-dev, libyazpp3-dev (>= 1.1.0), libxslt1-dev, libboost-dev, libboost-thread-dev, libboost-test-dev
Package: metaproxy
Section: net
-->
<!NOTATION PDF SYSTEM "PDF">
]>
-<!-- $Id: book.xml,v 1.62 2007-09-18 19:15:53 adam Exp $ -->
+<!-- $Id: book.xml,v 1.63 2008-02-27 11:08:49 adam Exp $ -->
<book id="metaproxy">
<bookinfo>
<title>Metaproxy - User's Guide and Reference</title>
apt-get install libyazpp2-dev
apt-get install libboost-dev
apt-get install libboost-thread-dev
- apt-get install libboost-date-time-dev
- apt-get install libboost-program-options-dev
apt-get install libboost-test-dev
</screen>
<para>
<?xml version="1.0"?>
-<!-- $Id: config0.xml,v 1.5 2007-05-22 19:45:58 adam Exp $ -->
+<!-- $Id: config0.xml,v 1.6 2008-02-27 11:08:49 adam Exp $ -->
<metaproxy xmlns="http://indexdata.com/metaproxy" version="1.0">
<start route="start"/>
<filters>
<routes>
<route id="start">
<filter refid="frontend"/>
- <filter type="log"><category user-access="true"/></filter>
+ <filter type="log"><category user-access="true" apdu="true" /></filter>
<filter type="backend_test"/>
<filter type="bounce"/>
</route>
<?xml version="1.0"?>
-<!-- $Id: config5.xml,v 1.8 2007-01-25 10:28:06 adam Exp $ -->
+<!-- $Id: config5.xml,v 1.9 2008-02-27 11:08:49 adam Exp $ -->
<!-- Uses dummy backend + query rewrite filter.. -->
<metaproxy xmlns="http://indexdata.com/metaproxy" version="1.0">
<start route="start"/>
<filter refid="frontend"/>
<filter type="log">
<message>F</message>
+ <time-format>%Y%m%d-%H%M%S</time-format>
<filename>my.log</filename>
</filter>
<filter type="query_rewrite">
</filter>
<filter type="log">
<message>B</message>
- <filename>my.log</filename>
- <category request-session="true" response-session="true"
- request-apdu="false" response-apdu="false"
+ <filename>my.log</filename>
+ <time-format>%Y%m%d-%H%M%S</time-format>
+ <category init-options="true" request-session="true" response-session="true"
+ request-apdu="true" response-apdu="true"
/>
</filter>
<filter type="backend_test"/>
-## $Id: Makefile.am,v 1.66 2007-11-02 17:25:33 adam Exp $
+## $Id: Makefile.am,v 1.67 2008-02-27 11:08:49 adam Exp $
MAINTAINERCLEANFILES = Makefile.in config.in config.hpp
test_filter1 test_filter2 \
test_session1 test_session2 \
test_thread_pool_observer \
- test_boost_threads test_boost_time \
+ test_boost_threads \
test_filter_auth_simple \
test_filter_factory \
test_filter_frontend_net \
test_session1_SOURCES=test_session1.cpp
test_session2_SOURCES=test_session2.cpp
test_boost_threads_SOURCES=test_boost_threads.cpp
-test_boost_time_SOURCES=test_boost_time.cpp
test_thread_pool_observer_SOURCES = test_thread_pool_observer.cpp
test_filter_auth_simple_SOURCES = test_filter_auth_simple.cpp
test_filter_factory_SOURCES = test_filter_factory.cpp
test_session1_LDADD = $(TESTLDADD)
test_session2_LDADD = $(TESTLDADD)
test_boost_threads_LDADD = $(TESTLDADD)
-test_boost_time_LDADD = $(TESTLDADD)
test_filter_auth_simple_LDADD = $(TESTLDADD)
test_filter_factory_LDADD = $(TESTLDADD)
test_filter_frontend_net_LDADD = $(TESTLDADD)
-/* $Id: filter_load_balance.cpp,v 1.10 2008-02-20 15:07:52 adam Exp $
+/* $Id: filter_load_balance.cpp,v 1.11 2008-02-27 11:08:49 adam Exp $
Copyright (c) 2005-2007, Index Data.
This file is part of Metaproxy.
#include <boost/thread/mutex.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <yaz/zgdu.h>
}
}
-// getting timestamp for receiving of package
-//boost::posix_time::ptime receive_time
-// = boost::posix_time::microsec_clock::local_time();
-// //<< receive_time << " "
-// //<< to_iso_string(receive_time) << " "
-//<< to_iso_extended_string(receive_time) << " "
-
-
// statistic manipulating functions,
void yf::LoadBalance::Impl::add_dead(unsigned long session_id){
-/* $Id: filter_log.cpp,v 1.34 2008-02-26 23:56:28 adam Exp $
- Copyright (c) 2005-2007, Index Data.
+/* $Id: filter_log.cpp,v 1.35 2008-02-27 11:08:49 adam Exp $
+ Copyright (c) 2005-2008, Index Data.
This file is part of Metaproxy.
#include <string>
#include <sstream>
+#include <iomanip>
#include <boost/thread/mutex.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include "gduutil.hpp"
#include "util.hpp"
#include <yaz/wrbuf.h>
#include <yaz/log.h>
#include <yaz/querytowrbuf.h>
+#include <yaz/timing.h>
#include <stdio.h>
-
+#include <time.h>
namespace mp = metaproxy_1;
namespace yf = metaproxy_1::filter;
bool m_res_session;
bool m_init_options;
LFilePtr m_file;
- // Only used during configure stage (no threading),
+ std::string m_time_format;
+ // Only used during confiqgure stage (no threading),
// for performance avoid opening files which other log filter
// instances already have opened
static std::list<LFilePtr> filter_log_files;
~LFile();
LFile(std::string fname);
LFile(std::string fname, FILE *outf);
+ void log(const std::string &date_format,
+ std::ostringstream &os);
+ void flush();
};
}
}
-// define Implementation stuff
-
// static initialization
std::list<yf::Log::Impl::LFilePtr> yf::Log::Impl::filter_log_files;
-// yf::Log::Impl::Impl()
-// {
-// m_access = true;
-// m_req_apdu = false;
-// m_res_apdu = false;
-// m_req_session = false;
-// m_res_session = false;
-// m_init_options = false;
-// openfile("");
-// }
-
yf::Log::Impl::Impl(const std::string &x)
: m_msg_config(x),
m_access(true),
m_res_apdu(false),
m_req_session(false),
m_res_session(false),
- m_init_options(false)
+ m_init_options(false),
+ m_time_format("%H:%M:%S-%d/%m")
{
openfile("");
}
std::string fname = mp::xml::get_text(ptr);
openfile(fname);
}
+ else if (!strcmp((const char *) ptr->name, "time-format"))
+ {
+ m_time_format = mp::xml::get_text(ptr);
+ }
else if (!strcmp((const char *) ptr->name, "category"))
{
const struct _xmlAttr *attr;
"init-options"))
m_init_options =
mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "init-options"))
+ m_init_options =
+ mp::xml::get_bool(attr->children, true);
else
throw mp::filter::FilterException(
"Bad attribute " + std::string((const char *)
Z_GDU *gdu = package.request().get();
std::string user("-");
- // getting timestamp for receiving of package
- boost::posix_time::ptime receive_time
- = boost::posix_time::microsec_clock::local_time();
+ yaz_timing_t timer = yaz_timing_create();
// scope for session lock
{
}
// scope for locking Ostream
{
- std::ostringstream os;
boost::mutex::scoped_lock scoped_lock(m_file->m_mutex);
if (m_access)
{
if (gdu)
{
- os << to_iso_extended_string(receive_time) << " "
- << m_msg_config << " "
+ std::ostringstream os;
+ os << m_msg_config << " "
<< package << " "
- << "000000.000000" << " "
- << *gdu
- << "\n";
+ << "0.000000" << " "
+ << *gdu;
+ m_file->log(m_time_format, os);
}
}
{
if (gdu)
{
- os << to_iso_extended_string(receive_time) << " "
- << m_msg_config << " " << user << " "
+ std::ostringstream os;
+ os << m_msg_config << " " << user << " "
<< package << " "
- << "000000.000000" << " "
- << *gdu
- << "\n";
+ << "0.000000" << " "
+ << *gdu;
+ m_file->log(m_time_format, os);
}
}
if (m_req_session)
{
- os << receive_time << " " << m_msg_config;
+ std::ostringstream os;
+ os << m_msg_config;
os << " request id=" << package.session().id();
os << " close="
- << (package.session().is_closed() ? "yes" : "no")
- << "\n";
+ << (package.session().is_closed() ? "yes" : "no");
+ m_file->log(m_time_format, os);
}
if (m_init_options)
if (gdu && gdu->which == Z_GDU_Z3950 &&
gdu->u.z3950->which == Z_APDU_initRequest)
{
- os << receive_time << " " << m_msg_config;
- os << " init options:";
+ std::ostringstream os;
+ os << m_msg_config << " init options:";
yaz_init_opt_decode(gdu->u.z3950->u.initRequest->options,
- option_write, m_file->fhandle);
- os << "\n";
+ option_write, &os);
+ m_file->log(m_time_format, os);
}
}
z_GDU(odr, &gdu, 0, 0);
}
}
- fputs(os.str().c_str(), m_file->fhandle);
- fflush(m_file->fhandle);
}
// unlocked during move
gdu = package.response().get();
- // getting timestamp for sending of package
- boost::posix_time::ptime send_time
- = boost::posix_time::microsec_clock::local_time();
-
- boost::posix_time::time_duration duration = send_time - receive_time;
+ yaz_timing_stop(timer);
+ double duration = yaz_timing_get_real(timer);
// scope for locking Ostream
{
boost::mutex::scoped_lock scoped_lock(m_file->m_mutex);
- std::ostringstream os;
if (m_access)
{
if (gdu)
{
- os << to_iso_extended_string(send_time) << " "
- << m_msg_config << " "
+ std::ostringstream os;
+ os << m_msg_config << " "
<< package << " "
- << to_iso_string(duration) << " "
- << *gdu
- << "\n";
- }
+ << std::fixed << std::setprecision (6) << duration
+ << " "
+ << *gdu;
+ m_file->log(m_time_format, os);
+ }
}
if (m_user_access)
{
if (gdu)
{
- os << to_iso_extended_string(send_time) << " "
- << m_msg_config << " " << user << " "
+ std::ostringstream os;
+ os << m_msg_config << " " << user << " "
<< package << " "
- << to_iso_string(duration) << " "
- << *gdu
- << "\n";
+ << std::fixed << std::setprecision (6) << duration << " "
+ << *gdu;
+ m_file->log(m_time_format, os);
}
}
if (m_res_session)
{
- os << send_time << " " << m_msg_config;
+ std::ostringstream os;
+ os << m_msg_config;
os << " response id=" << package.session().id();
os << " close="
- << (package.session().is_closed() ? "yes " : "no ")
- << "duration=" << duration
- << "\n";
+ << (package.session().is_closed() ? "yes " : "no ")
+ << "duration="
+ << std::fixed << std::setprecision (6) << duration;
+ m_file->log(m_time_format, os);
}
if (m_init_options)
if (gdu && gdu->which == Z_GDU_Z3950 &&
gdu->u.z3950->which == Z_APDU_initResponse)
{
- os << receive_time << " " << m_msg_config;
+ std::ostringstream os;
+ os << m_msg_config;
os << " init options:";
yaz_init_opt_decode(gdu->u.z3950->u.initResponse->options,
- option_write, m_file->fhandle);
- os << "\n";
+ option_write, &os);
+ m_file->log(m_time_format, os);
}
}
z_GDU(odr, &gdu, 0, 0);
}
}
- fputs(os.str().c_str(), m_file->fhandle);
- fflush(m_file->fhandle);
}
+ m_file->flush();
+ yaz_timing_destroy(&timer);
}
return;
}
}
- // open stdout for empty file
- LFilePtr newfile(fname.length() == 0
- ? new LFile(fname, yaz_log_file())
- : new LFile(fname));
+ LFilePtr newfile(new LFile(fname));
filter_log_files.push_back(newfile);
m_file = newfile;
}
void yf::Log::Impl::stream_write(ODR o, void *handle, int type, const char *buf, int len)
{
- FILE *fhandle = (FILE*) handle;
- fwrite(buf, len, 1, fhandle);
+ FILE *f = (FILE*) handle;
+ fwrite(buf, len, 1, f ? f : yaz_log_file());
}
void yf::Log::Impl::option_write(const char *name, void *handle)
{
- FILE *fhandle = (FILE*) handle;
- fprintf(fhandle, " %s", name);
+ std::ostringstream *os = (std::ostringstream *) handle;
+ *os << " " << name;
}
m_fname(fname)
{
- fhandle = fopen(fname.c_str(), "a");
+ if (fname.c_str())
+ fhandle = fopen(fname.c_str(), "a");
+ else
+ fhandle = 0;
}
-yf::Log::Impl::LFile::LFile(std::string fname, FILE *outf) :
- m_fname(fname)
+yf::Log::Impl::LFile::~LFile()
{
- fhandle = outf;
}
-yf::Log::Impl::LFile::~LFile()
+void yf::Log::Impl::LFile::log(const std::string &date_format,
+ std::ostringstream &os)
{
+ if (fhandle)
+ {
+ char datestr[80];
+ time_t ti = time(0);
+#if HAVE_LOCALTIME_R
+ struct tm tm0, *tm = &tm0;
+ localtime_r(&ti, tm);
+#else
+ struct tm *tm = localtime(&ti);
+#endif
+ if (strftime(datestr, sizeof(datestr)-1, date_format.c_str(), tm))
+ {
+ fputs(datestr, fhandle);
+ fputs(" ", fhandle);
+ }
+ fputs(os.str().c_str(), fhandle);
+ fputc('\n', fhandle);
+ }
+ else
+ yaz_log(YLOG_LOG, "%s", os.str().c_str());
}
+void yf::Log::Impl::LFile::flush()
+{
+ if (fhandle)
+ fflush(fhandle);
+}
static mp::filter::Base* filter_creator()
{
+++ /dev/null
-/* $Id: test_boost_time.cpp,v 1.12 2007-11-02 17:47:41 adam Exp $
- Copyright (c) 2005-2007, Index Data.
-
-This file is part of Metaproxy.
-
-Metaproxy is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Metaproxy; see the file LICENSE. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
- */
-
-#include <iostream>
-
-#include "config.hpp"
-#include "boost/date_time/posix_time/posix_time.hpp"
-
-#define BOOST_AUTO_TEST_MAIN
-#define BOOST_TEST_DYN_LINK
-#include <boost/test/auto_unit_test.hpp>
-
-using namespace boost::unit_test;
-
-
-
-BOOST_AUTO_TEST_CASE( testboosttime1 )
-{
-
- // test session
- try {
-
- boost::posix_time::ptime now
- = boost::posix_time::microsec_clock::local_time();
- //std::cout << now << std::endl;
-
- sleep(1);
-
- boost::posix_time::ptime then
- = boost::posix_time::microsec_clock::local_time();
- //std::cout << then << std::endl;
-
- boost::posix_time::time_period period(now, then);
- //std::cout << period << std::endl;
-
- boost::posix_time::time_duration duration = then - now;
- //std::cout << duration << std::endl;
-
- BOOST_CHECK (duration.total_seconds() >= 1);
- BOOST_CHECK (duration.fractional_seconds() > 0);
-
- }
- catch (std::exception &e) {
- std::cout << e.what() << "\n";
- BOOST_CHECK (false);
- }
- catch (...) {
- BOOST_CHECK (false);
- }
-}
-
-/*
- * Local variables:
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * c-file-style: "stroustrup"
- * End:
- * vim: shiftwidth=4 tabstop=8 expandtab
- */
# Metaproxy XML config file schemas
-# $Id: metaproxy.rnc,v 1.21 2007-11-18 10:44:40 adam Exp $
+# $Id: metaproxy.rnc,v 1.22 2008-02-27 11:08:50 adam Exp $
#
-# Copyright (c) 2005-2007, Index Data.
+# Copyright (c) 2005-2008, Index Data.
#
# See the LICENSE file for details
#
attribute name { xsd:NCName }?,
element mp:message { xsd:string }?,
element mp:filename { xsd:string }?,
+ element mp:time-format { xsd:string }?,
element mp:category {
attribute user-access { xsd:boolean }?,
attribute access { xsd:boolean }?,