Deal with Z39.50 messages sizes properly.
-For SRW/SRU, set schema for each returned record.
-
Character set conversion for SRW queries.
Throw proper CQL conversion error.
+Honor XPath.
+
+Deal with scan, sort (throw diagnostic).
+
<?xml version="1.0"?>
-<!-- $Id: config.xml,v 1.5 2004-01-05 09:31:09 adam Exp $ -->
+<!-- $Id: config.xml,v 1.6 2004-01-07 11:10:54 adam Exp $ -->
<proxy>
<target name="bagel">
<url>indexdata.dk</url>
<attribute type="1" value="*" error="114"/>
<syntax type="usmarc"/>
<syntax type="grs1"/>
- <syntax type="xml" marcxml="1" stylesheet="MARC21slim2DC.xsl">
- dc
- http://www.loc.gov/zing/srw/dcschema/v1.0/
+ <syntax type="xml" marcxml="1" stylesheet="MARC21slim2DC.xsl"
+ identifier="http://www.loc.gov/zing/srw/dcschema/v1.0/"
+ >
+ <name>dc</name>
</syntax>
- <syntax type="xml" marcxml="1">
- marcxml
- http://www.loc.gov/marcxml/
+ <syntax type="xml" marcxml="1"
+ identifier="http://www.loc.gov/marcxml/"
+ >
+ <name>marcxml</name>
</syntax>
- <syntax type="xml" marcxml="1" stylesheet="MARC21slim2MODS.xsl">
- mods
- http://www.loc.gov/mods/v3
+ <syntax type="xml" marcxml="1" stylesheet="MARC21slim2MODS.xsl"
+ identifier="http://www.loc.gov/mods/v3"
+ >
+ <name>mods</name>
</syntax>
<syntax type="none"/>
<syntax type="*" error="238"/>
<?xml version="1.0"?>
-<!-- $Id: voyager.xml,v 1.4 2004-01-05 11:30:17 adam Exp $ -->
+<!-- $Id: voyager.xml,v 1.5 2004-01-07 11:10:55 adam Exp $ -->
<proxy>
<!-- define default target and name it voyager -->
<target default="1" name="voyager">
<syntax type="opac"/>
<syntax type="usmarc"/>
<syntax type="none"/>
-
- <syntax type="xml" marcxml="1" stylesheet="MARC21slim2DC.xsl">
- dc
- http://www.loc.gov/zing/srw/dcschema/v1.0/
+
+ <syntax type="xml" marcxml="1"
+ identifier="http://www.loc.gov/marcxml/"
+ >
+ <title>MARCXML</title>
+ <name>marcxml</name>
</syntax>
- <syntax type="xml" marcxml="1">
- marcxml
- http://www.loc.gov/marcxml/
+ <syntax type="xml" marcxml="1" stylesheet="MARC21slim2DC.xsl"
+ identifier="http://www.loc.gov/zing/srw/dcschema/v1.0/"
+ >
+ <title>Dublin Core</title>
+ <name>dc</name>
</syntax>
- <syntax type="xml" marcxml="1" stylesheet="MARC21slim2MODS.xsl">
- mods
- http://www.loc.gov/mods/v3
+ <syntax type="xml" marcxml="1" stylesheet="MARC21slim2MODS.xsl"
+ identifier="http://www.loc.gov/mods/v3"
+ >
+ <title>MODS</title>
+ <name>mods</name>
</syntax>
<syntax type="*" error="238"/>
* Copyright (c) 1998-2004, Index Data.
* See the file LICENSE for details.
*
- * $Id: proxy.h,v 1.27 2004-01-06 21:17:42 adam Exp $
+ * $Id: proxy.h,v 1.28 2004-01-07 11:10:55 adam Exp $
*/
#include <sys/time.h>
int check_query(ODR odr, const char *name, Z_Query *query, char **addinfo);
int check_syntax(ODR odr, const char *name,
Odr_oid *syntax, Z_RecordComposition *comp,
- char **addinfo, char **stylesheet);
+ char **addinfo, char **stylesheet, char **schema);
char *get_explain(ODR odr, const char *name, const char *db,
int *len);
private:
void operator=(const Yaz_ProxyConfig &conf);
int mycmp(const char *hay, const char *item, size_t len);
#if HAVE_XSLT
- int check_esn(xmlNodePtr ptr, Z_RecordComposition *comp);
+ int check_schema(xmlNodePtr ptr, Z_RecordComposition *comp,
+ const char **found_schema, const char *schema_identifier);
xmlDocPtr m_docPtr;
xmlNodePtr m_proxyPtr;
void return_target_info(xmlNodePtr ptr, const char **url,
int m_invalid_session;
int m_marcxml_flag;
char *m_stylesheet;
+ char *m_schema;
void convert_to_marcxml(Z_NamePlusRecordList *p);
void convert_xsl(Z_NamePlusRecordList *p);
Z_APDU *m_initRequest_apdu;
/*
- * Copyright (c) 1998-2003, Index Data.
+ * Copyright (c) 1998-2004, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy-config.cpp,v 1.19 2004-01-06 21:17:42 adam Exp $
+ * $Id: yaz-proxy-config.cpp,v 1.20 2004-01-07 11:10:55 adam Exp $
*/
#include <ctype.h>
}
#if HAVE_XSLT
-int Yaz_ProxyConfig::check_esn(xmlNodePtr ptr, Z_RecordComposition *comp)
+int Yaz_ProxyConfig::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp,
+ const char **found_schema,
+ const char *schema_identifier)
{
char *esn = 0;
int default_match = 1;
+ *found_schema = schema_identifier; // may be NULL
if (comp && comp->which == Z_RecordComp_simple &&
comp->u.simple && comp->u.simple->which == Z_ElementSetNames_generic)
{
esn = comp->u.simple->u.generic;
}
+ // if no ESN/schema was given accept..
if (!esn)
return 1;
+ // check if schema identifier match
+ if (schema_identifier && !strcmp(esn, schema_identifier))
+ return 1;
+ *found_schema = esn;
+ // Check each name element
for (; ptr; ptr = ptr->next)
{
- if (ptr->type == XML_TEXT_NODE)
+ if (ptr->type == XML_ELEMENT_NODE
+ && !strcmp((const char *) ptr->name, "name"))
{
+ xmlNodePtr tptr = ptr->children;
default_match = 0;
- xmlChar *t = ptr->content;
- while (*t)
- {
- while (*t && isspace(*t))
- t++;
- xmlChar *s = t;
- int i = 0;
- while (esn[i] && esn[i] == *s)
+ for (; tptr; tptr = tptr->next)
+ if (tptr->type == XML_TEXT_NODE && tptr->content)
{
- i++;
- s++;
+ xmlChar *t = tptr->content;
+ while (*t && isspace(*t))
+ t++;
+ int i = 0;
+ while (esn[i] && esn[i] == t[i])
+ i++;
+ if (!esn[i] && (!t[i] || isspace(t[i])))
+ return 1;
}
- if (!esn[i] && (!*s || isspace(*s)))
- return 1;
- while (*s && !isspace(*s))
- s++;
- t = s;
- }
}
}
return default_match;
int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name,
Odr_oid *syntax, Z_RecordComposition *comp,
char **addinfo,
- char **stylesheet)
+ char **stylesheet, char **schema)
{
if (stylesheet)
{
xfree (*stylesheet);
*stylesheet = 0;
}
+ if (schema)
+ {
+ xfree (*schema);
+ *schema = 0;
+ }
#if HAVE_XSLT
int syntax_has_matched = 0;
xmlNodePtr ptr;
const char *match_error = 0;
const char *match_marcxml = 0;
const char *match_stylesheet = 0;
+ const char *match_identifier = 0;
struct _xmlAttr *attr;
for (attr = ptr->properties; attr; attr = attr->next)
{
if (!strcmp((const char *) attr->name, "stylesheet") &&
attr->children && attr->children->type == XML_TEXT_NODE)
match_stylesheet = (const char *) attr->children->content;
+ if (!strcmp((const char *) attr->name, "identifier") &&
+ attr->children && attr->children->type == XML_TEXT_NODE)
+ match_identifier = (const char *) attr->children->content;
}
if (match_type)
{
match = 1;
}
}
+ const char *match_schema = 0;
if (match)
{
syntax_has_matched = 1;
- match = check_esn(ptr->children, comp);
+ match = check_schema(ptr->children, comp, &match_schema,
+ match_identifier);
}
if (match)
{
xfree(*stylesheet);
*stylesheet = xstrdup(match_stylesheet);
}
+ if (schema && match_schema)
+ {
+ yaz_log(LOG_LOG, "Match_schema=%s", match_schema);
+ xfree(*schema);
+ *schema = xstrdup(match_schema);
+ }
+ else
+ yaz_log(LOG_LOG, "NO SCHEMA");
if (match_marcxml)
{
return -1;
* Copyright (c) 1998-2004, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy.cpp,v 1.77 2004-01-06 21:17:42 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.78 2004-01-07 11:10:55 adam Exp $
*/
#include <assert.h>
m_config = 0;
m_marcxml_flag = 0;
m_stylesheet = 0;
+ m_schema = 0;
m_initRequest_apdu = 0;
m_initRequest_mem = 0;
m_apdu_invalid_session = 0;
xfree (m_proxy_authentication);
xfree (m_optimize);
xfree (m_stylesheet);
+ xfree (m_schema);
if (m_s2z_odr_init)
odr_destroy(m_s2z_odr_init);
if (m_s2z_odr_search)
oident *ent = oid_getentbyoid(r->direct_reference);
if (r->which == Z_External_octet && ent->value == VAL_TEXT_XML)
{
- srw_res->records[i].recordSchema = "http://www.loc.gov/marcxml/";
+ srw_res->records[i].recordSchema = m_schema;
srw_res->records[i].recordPacking = m_s2z_packing;
srw_res->records[i].recordData_buf = (char*)
r->u.octet_aligned->buf;
err = cfg->check_syntax(odr_encode(),
m_default_target,
sr->preferredRecordSyntax, rc,
- &addinfo, &m_stylesheet);
+ &addinfo, &m_stylesheet, &m_schema);
if (err == -1)
{
sr->preferredRecordSyntax =
err = cfg->check_syntax(odr_encode(), m_default_target,
pr->preferredRecordSyntax,
pr->recordComposition,
- &addinfo, &m_stylesheet);
+ &addinfo, &m_stylesheet, &m_schema);
if (err == -1)
{
pr->preferredRecordSyntax =