Syntax validation. Log implementation stuff
authorAdam Dickmeiss <adam@indexdata.dk>
Wed, 8 Oct 2003 08:15:01 +0000 (08:15 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Wed, 8 Oct 2003 08:15:01 +0000 (08:15 +0000)
include/yaz++/proxy.h
src/config.xml
src/yaz-proxy-config.cpp
src/yaz-proxy.cpp

index ca44ea0..8535546 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: proxy.h,v 1.10 2003-10-06 08:08:49 adam Exp $
+ * $Id: proxy.h,v 1.11 2003-10-08 08:15:01 adam Exp $
  */
 
 #include <yaz++/z-assoc.h>
@@ -29,6 +29,8 @@ public:
                         int *max_clients);
     void operator=(const Yaz_ProxyConfig &conf);
     int check_query(ODR odr, const char *name, Z_Query *query, char **addinfo);
+    int check_syntax(ODR odr, const char *name,
+                    Odr_oid *syntax, char **addinfo);
 private:
 #if HAVE_XML2
     xmlDocPtr m_docPtr;
@@ -164,6 +166,7 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc {
                                              const char *addinfo);
 
     Z_APDU *handle_query_validation(Z_APDU *apdu);
+    Z_APDU *handle_syntax_validation(Z_APDU *apdu);
  public:
     Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable);
     ~Yaz_Proxy();
index 19d0b06..cf9f8c3 100644 (file)
@@ -3,7 +3,7 @@
 <proxy>
   <target default="1" name="voyager">
     <!-- default target -->
-    <url>z3950.loc.gov:7094/voyager</url>
+    <url>z3950.loc.gov:7090/voyager</url>
     <keepalive>1</keepalive>
     <limit><!-- limits .. -->
       <bandwidth>200000</bandwidth>
       <retrieve>20</retrieve>
     </limit>
     <query type="1" value="10" error="114"/>
-    <target-timeout>120</target-timeout>
-    <client-timeout>20</client-timeout>
+    <target-timeout>180</target-timeout>
+    <client-timeout>60</client-timeout>
+    <syntax type="usmarc"/>
+    <syntax type="*" error="238"/>
   </target>
   <target name="localhost">
     <url>localhost:9999</url>
       <retrieve>10</retrieve>
     </limit>
     <query type="1" value="10,1023-9000" error="114"/>
+    <syntax type="usmarc"/>
+    <syntax type="grs1"/>
+    <syntax type="xml"/>
+    <syntax type="*" error="238"/>
   </target>
   <target name="*">
     <!-- everything else -->
index d1ba17c..1abd49f 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy-config.cpp,v 1.4 2003-10-06 08:08:49 adam Exp $
+ * $Id: yaz-proxy-config.cpp,v 1.5 2003-10-08 08:15:01 adam Exp $
  */
 
 #include <ctype.h>
@@ -326,6 +326,70 @@ int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query,
     return 0;
 }
 
+int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name,
+                                 Odr_oid *syntax, char **addinfo)
+{
+#if HAVE_XML2
+    xmlNodePtr ptr;
+    
+    ptr = find_target_node(name);
+    if (!ptr)
+       return 0;
+    for(ptr = ptr->children; ptr; ptr = ptr->next)
+    {
+       if (ptr->type == XML_ELEMENT_NODE &&
+           !strcmp((const char *) ptr->name, "syntax"))
+       {
+           int match = 0;  // if we match record syntax
+           const char *match_type = 0;
+           const char *match_error = 0;
+           struct _xmlAttr *attr;
+           for (attr = ptr->properties; attr; attr = attr->next)
+           {
+               if (!strcmp((const char *) attr->name, "type") &&
+                   attr->children && attr->children->type == XML_TEXT_NODE)
+                   match_type = (const char *) attr->children->content;
+               if (!strcmp((const char *) attr->name, "error") &&
+                   attr->children && attr->children->type == XML_TEXT_NODE)
+                   match_error = (const char *) attr->children->content;
+           }
+           if (match_type)
+           {
+               if (!strcmp(match_type, "*"))
+                   match = 1;
+               else if (!strcmp(match_type, "none"))
+               {
+                   if (syntax == 0)
+                       match = 1;
+               }
+               else if (syntax)
+               {
+                   int match_oid[OID_SIZE];
+                   oid_name_to_oid(CLASS_RECSYN, match_type, match_oid);
+                   if (oid_oidcmp(match_oid, syntax) == 0)
+                       match = 1;
+               }
+           }
+           if (match)
+           {
+               if (match_error)
+               {
+                   if (syntax)
+                   {
+                       char dotoid_str[100];
+                       oid_to_dotstring(syntax, dotoid_str);
+                       *addinfo = odr_strdup(odr, dotoid_str);
+                   }
+                   return atoi(match_error);
+               }
+               return 0;
+           }
+       }
+    }
+#endif
+    return 0;
+}
+
 #if HAVE_XML2
 xmlNodePtr Yaz_ProxyConfig::find_target_node(const char *name)
 {
index 0f4678a..49992a3 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy.cpp,v 1.50 2003-10-04 06:44:16 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.51 2003-10-08 08:15:01 adam Exp $
  */
 
 #include <assert.h>
@@ -658,7 +658,7 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu)
            }
        }
     }
-    else
+    else  // query doesn't match
     {
        delete m_client->m_last_query;
        m_client->m_last_query = this_query;
@@ -769,13 +769,11 @@ Z_APDU *Yaz_Proxy::handle_query_validation(Z_APDU *apdu)
        if (err)
        {
            Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
-           int *nulint = odr_intdup (odr_encode(), 0);
 
            new_apdu->u.searchResponse->referenceId = sr->referenceId;
            new_apdu->u.searchResponse->records =
                create_nonSurrogateDiagnostics(odr_encode(), err, addinfo);
-           new_apdu->u.searchResponse->searchStatus = nulint;
-           new_apdu->u.searchResponse->resultCount = nulint;
+           *new_apdu->u.searchResponse->searchStatus = 0;
 
            send_to_client(new_apdu);
 
@@ -785,6 +783,59 @@ Z_APDU *Yaz_Proxy::handle_query_validation(Z_APDU *apdu)
     return apdu;
 }
 
+Z_APDU *Yaz_Proxy::handle_syntax_validation(Z_APDU *apdu)
+{
+    if (apdu->which == Z_APDU_searchRequest)
+    {
+       Z_SearchRequest *sr = apdu->u.searchRequest;
+       if (*sr->smallSetUpperBound > 0 || *sr->largeSetLowerBound > 1)
+       {
+           int err;
+           char *addinfo = 0;
+           err = m_config.check_syntax(odr_encode(), m_default_target,
+                                       sr->preferredRecordSyntax,
+                                       &addinfo);
+           if (err)
+           {
+               Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
+               
+               new_apdu->u.searchResponse->referenceId = sr->referenceId;
+               new_apdu->u.searchResponse->records =
+                   create_nonSurrogateDiagnostics(odr_encode(), err, addinfo);
+               *new_apdu->u.searchResponse->searchStatus = 0;
+               
+               send_to_client(new_apdu);
+               
+               return 0;
+           }
+       }
+    }
+    else if (apdu->which == Z_APDU_presentRequest)
+    {
+       Z_PresentRequest *pr = apdu->u.presentRequest;
+       int err;
+       char *addinfo = 0;
+       err = m_config.check_syntax(odr_encode(), m_default_target,
+                                   pr->preferredRecordSyntax,
+                                   &addinfo);
+       if (err)
+       {
+           Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentResponse);
+           
+           new_apdu->u.presentResponse->referenceId = pr->referenceId;
+           new_apdu->u.presentResponse->records =
+               create_nonSurrogateDiagnostics(odr_encode(), err, addinfo);
+           *new_apdu->u.presentResponse->presentStatus =
+               Z_PresentStatus_failure;
+           
+           send_to_client(new_apdu);
+           
+           return 0;
+       }
+    }
+    return apdu;
+}
+
 void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu)
 {
     // Determine our client.
@@ -798,6 +849,15 @@ void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu)
 
     if (apdu->which == Z_APDU_initRequest)
     {
+       if (apdu->u.initRequest->implementationId)
+           yaz_log(LOG_LOG, "%s implementationId: %s",
+                   m_session_str, apdu->u.initRequest->implementationId);
+       if (apdu->u.initRequest->implementationName)
+           yaz_log(LOG_LOG, "%s implementationName: %s",
+                   m_session_str, apdu->u.initRequest->implementationName);
+       if (apdu->u.initRequest->implementationVersion)
+           yaz_log(LOG_LOG, "%s implementationVersion: %s",
+                   m_session_str, apdu->u.initRequest->implementationVersion);
        if (m_client->m_init_flag)
        {
            Z_APDU *apdu = m_client->m_initResponse;
@@ -813,6 +873,9 @@ void Yaz_Proxy::recv_Z_PDU_0(Z_APDU *apdu)
     handle_max_record_retrieve(apdu);
 
     if (apdu)
+       apdu = handle_syntax_validation(apdu);
+
+    if (apdu)
        apdu = handle_query_validation(apdu);
 
     if (apdu)