-/* $Id: yaz-proxy.cpp,v 1.3 2004-04-11 12:25:01 adam Exp $
+/* $Id: yaz-proxy.cpp,v 1.6 2004-08-29 13:01:43 adam Exp $
Copyright (c) 1998-2004, Index Data.
This file is part of the yaz-proxy.
-Zebra is free software; you can redistribute it and/or modify it under
+YAZ proxy 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.
-Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+YAZ proxy 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.
#include <unistd.h>
#endif
+#if HAVE_GETTIMEOFDAY
+#include <sys/time.h>
+#endif
+
#include <assert.h>
#include <time.h>
#include <sys/types.h>
#include <yazproxy/proxy.h>
#include <yaz/pquery.h>
+#if HAVE_XSLT
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/transform.h>
+#endif
+
static const char *apdu_name(Z_APDU *apdu)
{
switch (apdu->which)
m_s2z_stylesheet = 0;
m_s2z_database = 0;
m_schema = 0;
+ m_backend_type = 0;
+ m_backend_charset = 0;
+ m_frontend_type = 0;
m_initRequest_apdu = 0;
m_initRequest_mem = 0;
m_initRequest_preferredMessageSize = 0;
m_soap_ns = 0;
m_s2z_packing = Z_SRW_recordPacking_string;
#if HAVE_GETTIMEOFDAY
- m_time_tv.tv_sec = 0;
- m_time_tv.tv_usec = 0;
+ m_time_tv = xmalloc(sizeof(struct timeval));
+ struct timeval *tv = (struct timeval *) m_time_tv;
+ tv->tv_sec = 0;
+ tv->tv_usec = 0;
+#else
+ m_time_tv = 0;
#endif
if (!m_parent)
low_socket_open();
#if HAVE_XSLT
if (m_stylesheet_xsp)
- xsltFreeStylesheet(m_stylesheet_xsp);
+ xsltFreeStylesheet((xsltStylesheetPtr) m_stylesheet_xsp);
#endif
+ xfree (m_time_tv);
+
xfree (m_schema);
+ xfree (m_backend_type);
+ xfree (m_backend_charset);
if (m_s2z_odr_init)
odr_destroy(m_s2z_odr_init);
if (m_s2z_odr_search)
yaz_log(LOG_LOG, "%sXSLT convert %d",
m_session_str, m_stylesheet_offset);
- res = xsltApplyStylesheet(m_stylesheet_xsp, doc, 0);
+ res = xsltApplyStylesheet((xsltStylesheetPtr) m_stylesheet_xsp,
+ doc, 0);
if (res)
{
m_stylesheet_nprl = 0;
#if HAVE_XSLT
if (m_stylesheet_xsp)
- xsltFreeStylesheet(m_stylesheet_xsp);
+ xsltFreeStylesheet((xsltStylesheetPtr) m_stylesheet_xsp);
#endif
m_stylesheet_xsp = 0;
timeout(m_client_idletime);
timeout(0);
}
-void Yaz_Proxy::convert_to_marcxml(Z_NamePlusRecordList *p)
+void Yaz_Proxy::convert_to_frontend_type(Z_NamePlusRecordList *p)
+{
+ if (m_frontend_type != VAL_NONE)
+ {
+ int i;
+ for (i = 0; i < p->num_records; i++)
+ {
+ Z_NamePlusRecord *npr = p->records[i];
+ if (npr->which == Z_NamePlusRecord_databaseRecord)
+ {
+ Z_External *r = npr->u.databaseRecord;
+ if (r->which == Z_External_octet)
+ {
+ npr->u.databaseRecord =
+ z_ext_record(odr_encode(),
+ m_frontend_type,
+ (char*) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len);
+ }
+ }
+ }
+ }
+}
+
+void Yaz_Proxy::convert_to_marcxml(Z_NamePlusRecordList *p,
+ const char *backend_charset)
{
int i;
+ if (!backend_charset)
+ backend_charset = "MARC-8";
yaz_iconv_t cd = yaz_iconv_open("UTF-8", "MARC-8");
yaz_marc_t mt = yaz_marc_create();
yaz_marc_xml(mt, YAZ_MARC_MARCXML);
void Yaz_Proxy::logtime()
{
#if HAVE_GETTIMEOFDAY
- if (m_time_tv.tv_sec)
+ struct timeval *tv = (struct timeval*) m_time_tv;
+ if (tv->tv_sec)
{
- struct timeval tv;
- gettimeofday(&tv, 0);
- long diff = (tv.tv_sec - m_time_tv.tv_sec)*1000000 +
- (tv.tv_usec - m_time_tv.tv_usec);
+ struct timeval tv1;
+ gettimeofday(&tv1, 0);
+ long diff = (tv1.tv_sec - tv->tv_sec)*1000000 +
+ (tv1.tv_usec - tv->tv_usec);
if (diff >= 0)
yaz_log(LOG_LOG, "%sElapsed %ld.%03ld", m_session_str,
diff/1000000, (diff/1000)%1000);
}
- m_time_tv.tv_sec = 0;
- m_time_tv.tv_usec = 0;
+ tv->tv_sec = 0;
+ tv->tv_usec = 0;
#endif
}
{
if (p && p->which == Z_Records_DBOSD)
{
+ if (m_backend_type)
+ convert_to_frontend_type(p->u.databaseOrSurDiagnostics);
if (m_marcxml_flag)
- convert_to_marcxml(p->u.databaseOrSurDiagnostics);
+ convert_to_marcxml(p->u.databaseOrSurDiagnostics,
+ m_backend_charset);
if (convert_xsl(p->u.databaseOrSurDiagnostics, apdu))
return 0;
}
if (p && p->which == Z_Records_DBOSD)
{
+ if (m_backend_type)
+ convert_to_frontend_type(p->u.databaseOrSurDiagnostics);
if (m_marcxml_flag)
- convert_to_marcxml(p->u.databaseOrSurDiagnostics);
+ convert_to_marcxml(p->u.databaseOrSurDiagnostics,
+ m_backend_charset);
if (convert_xsl(p->u.databaseOrSurDiagnostics, apdu))
return 0;
}
return 0;
}
Z_NamePlusRecordList *npr;
+ int oclass = 0;
+#if 0
+ yaz_log(LOG_LOG, "%sCache lookup %d+%d syntax=%s",
+ m_session_str, start, toget, yaz_z3950oid_to_str(
+ pr->preferredRecordSyntax, &oclass));
+#endif
if (m_client->m_cache.lookup (odr_encode(), &npr, start, toget,
pr->preferredRecordSyntax,
pr->recordComposition))
m_pdu_stat.add_bytes(1);
#if HAVE_GETTIMEOFDAY
- gettimeofday(&m_time_tv, 0);
+ gettimeofday((struct timeval *) m_time_tv, 0);
#endif
int bw_total = m_bw_stat.get_total();
rc = &rc_temp;
}
+ if (sr->preferredRecordSyntax)
+ {
+ struct oident *ent;
+ ent = oid_getentbyoid(sr->preferredRecordSyntax);
+ m_frontend_type = ent->value;
+ }
+ else
+ m_frontend_type = VAL_NONE;
+
char *stylesheet_name = 0;
if (cfg)
err = cfg->check_syntax(odr_encode(),
m_default_target,
sr->preferredRecordSyntax, rc,
- &addinfo, &stylesheet_name, &m_schema);
+ &addinfo, &stylesheet_name, &m_schema,
+ &m_backend_type, &m_backend_charset);
if (stylesheet_name)
{
m_parent->low_socket_close();
#if HAVE_XSLT
if (m_stylesheet_xsp)
- xsltFreeStylesheet(m_stylesheet_xsp);
+ xsltFreeStylesheet((xsltStylesheetPtr) m_stylesheet_xsp);
m_stylesheet_xsp = xsltParseStylesheetFile((const xmlChar*)
stylesheet_name);
#endif
}
if (err == -1)
{
- sr->preferredRecordSyntax =
- yaz_oidval_to_z3950oid(odr_encode(), CLASS_RECSYN, VAL_USMARC);
+ sr->smallSetElementSetNames = 0;
+ sr->mediumSetElementSetNames = 0;
+ if (m_backend_type)
+ {
+
+ sr->preferredRecordSyntax =
+ yaz_str_to_z3950oid(odr_encode(), CLASS_RECSYN,
+ m_backend_type);
+ }
+ else
+ sr->preferredRecordSyntax =
+ yaz_oidval_to_z3950oid(odr_encode(), CLASS_RECSYN,
+ VAL_USMARC);
m_marcxml_flag = 1;
}
else if (err)
return 0;
}
+ else if (m_backend_type)
+ {
+ sr->preferredRecordSyntax =
+ yaz_str_to_z3950oid(odr_encode(), CLASS_RECSYN, m_backend_type);
+ }
}
else if (apdu->which == Z_APDU_presentRequest)
{
char *addinfo = 0;
Yaz_ProxyConfig *cfg = check_reconfigure();
+ if (pr->preferredRecordSyntax)
+ {
+ struct oident *ent;
+ ent = oid_getentbyoid(pr->preferredRecordSyntax);
+ m_frontend_type = ent->value;
+ }
+ else
+ m_frontend_type = VAL_NONE;
+
char *stylesheet_name = 0;
if (cfg)
err = cfg->check_syntax(odr_encode(), m_default_target,
pr->preferredRecordSyntax,
pr->recordComposition,
- &addinfo, &stylesheet_name, &m_schema);
+ &addinfo, &stylesheet_name, &m_schema,
+ &m_backend_type, &m_backend_charset);
if (stylesheet_name)
{
m_parent->low_socket_close();
#if HAVE_XSLT
if (m_stylesheet_xsp)
- xsltFreeStylesheet(m_stylesheet_xsp);
-
+ xsltFreeStylesheet((xsltStylesheetPtr) m_stylesheet_xsp);
m_stylesheet_xsp = xsltParseStylesheetFile((const xmlChar*)
stylesheet_name);
#endif
}
if (err == -1)
{
- pr->preferredRecordSyntax =
- yaz_oidval_to_z3950oid(odr_decode(), CLASS_RECSYN, VAL_USMARC);
+ pr->recordComposition = 0;
+ if (m_backend_type)
+ {
+
+ pr->preferredRecordSyntax =
+ yaz_str_to_z3950oid(odr_encode(), CLASS_RECSYN,
+ m_backend_type);
+ }
+ else
+ pr->preferredRecordSyntax =
+ yaz_oidval_to_z3950oid(odr_encode(), CLASS_RECSYN,
+ VAL_USMARC);
m_marcxml_flag = 1;
}
else if (err)
return 0;
}
+ else if (m_backend_type)
+ {
+ pr->preferredRecordSyntax =
+ yaz_str_to_z3950oid(odr_encode(), CLASS_RECSYN, m_backend_type);
+ }
}
return apdu;
}