Avoid mixed stmt/var declare
[simpleserver-moved-to-github.git] / SimpleServer.xs
index 579ff91..4c047e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: SimpleServer.xs,v 1.35 2005-11-09 09:35:47 adam Exp $ 
+ * $Id: SimpleServer.xs,v 1.40 2006-04-10 20:49:24 adam Exp $ 
  * ----------------------------------------------------------------------
  * 
  * Copyright (c) 2000-2004, Index Data.
@@ -442,6 +442,7 @@ static SV *rpn2perl(Z_RPNStructure *s)
        Z_Operand *o = s->u.simple;
        Z_AttributesPlusTerm *at;
        if (o->which == Z_Operand_resultSetId) {
+           SV *sv2;
            /* This code causes a SIGBUS on my machine, and I have no
               idea why.  It seems as clear as day to me */
            char *rsid = (char*) o->u.resultSetId;
@@ -449,7 +450,7 @@ static SV *rpn2perl(Z_RPNStructure *s)
            sv = newObject("Net::Z3950::RPN::RSID", (SV*) (hv = newHV()));
            printf("Made sv=0x%lx, hv=0x%lx\n",
                   (unsigned long) sv ,(unsigned long) hv);
-           SV *sv2 = newSVpv(rsid, strlen(rsid));
+           sv2 = newSVpv(rsid, strlen(rsid));
            setMember(hv, "id", sv2);
            printf("Set hv{id} to 0x%lx\n", (unsigned long) sv2);
            return sv;
@@ -614,6 +615,7 @@ int bend_search(void *handle, bend_search_rr *rr)
        SV *point;
        Zfront_handle *zhandle = (Zfront_handle *)handle;
        CV* handler_cv = 0;
+       SV *rpnSV;
 
        dSP;
        ENTER;
@@ -640,15 +642,23 @@ int bend_search(void *handle, bend_search_rr *rr)
        hv_store(href, "DATABASES", 9, newRV( (SV*) aref), 0);
        hv_store(href, "HANDLE", 6, zhandle->handle, 0);
        hv_store(href, "PID", 3, newSViv(getpid()), 0);
-       hv_store(href, "RPN", 3, zquery2perl(rr->query), 0);
+       if ((rpnSV = zquery2perl(rr->query)) != 0) {
+           hv_store(href, "RPN", 3, rpnSV, 0);
+       }
        query = zquery2pquery(rr->query);
        if (query)
        {
                hv_store(href, "QUERY", 5, newSVpv((char *)query->buf, query->pos), 0);
        }
+       else if (rr->query->which == Z_Query_type_104 &&
+                rr->query->u.type_104->which == Z_External_CQL) {
+           hv_store(href, "CQL", 3,
+                    newSVpv(rr->query->u.type_104->u.cql, 0), 0);
+       }
        else
        {       
                rr->errcode = 108;
+               return 0;
        }
        PUSHMARK(sp);
        
@@ -682,7 +692,8 @@ int bend_search(void *handle, bend_search_rr *rr)
        zhandle->handle = point;
        sv_free( (SV*) aref);
        sv_free( (SV*) href);
-       wrbuf_free(query, 1);
+       if (query)
+           wrbuf_free(query, 1);
        PUTBACK;
        FREETMPS;
        LEAVE;
@@ -789,7 +800,13 @@ int bend_fetch(void *handle, bend_fetch_rr *rr)
        href = newHV();
        hv_store(href, "SETNAME", 7, newSVpv(rr->setname, 0), 0);
        temp = hv_store(href, "OFFSET", 6, newSViv(rr->number), 0);
-       oid_dotted = oid2dotted(rr->request_format_raw);
+       if (rr->request_format_raw != 0) {
+           oid_dotted = oid2dotted(rr->request_format_raw);
+       } else {
+           /* Probably an SRU request: assume XML is required */
+           oid_dotted = wrbuf_alloc();
+           wrbuf_puts(oid_dotted, "1.2.840.10003.5.109.10");
+       }
        hv_store(href, "REQ_FORM", 8, newSVpv((char *)oid_dotted->buf, oid_dotted->pos), 0);
        hv_store(href, "REP_FORM", 8, newSVpv((char *)oid_dotted->buf, oid_dotted->pos), 0);
        hv_store(href, "BASENAME", 8, newSVpv("", 0), 0);
@@ -817,7 +834,11 @@ int bend_fetch(void *handle, bend_fetch_rr *rr)
                }
                else
                {
-                       rr->errcode = 26;
+                       /* This is where we end up in the case of
+                        * SRU.  Since record composition ("element
+                        * sets") are meaningless in SRU anyway, we
+                        * just skip this.
+                        */
                }
        }
 
@@ -1171,8 +1192,6 @@ bend_initresult *bend_init(bend_initrequest *q)
        bend_initresult *r = (bend_initresult *)
                odr_malloc (q->stream, sizeof(*r));
        char *ptr;
-       char *user = NULL;
-       char *passwd = NULL;
        CV* handler_cv = 0;
        dSP;
        STRLEN len;
@@ -1218,22 +1237,26 @@ bend_initresult *bend_init(bend_initrequest *q)
        hv_store(href, "HANDLE", 6, newSVsv(&sv_undef), 0);
        hv_store(href, "PID", 3, newSViv(getpid()), 0);
        if (q->auth) {
+           char *user = NULL;
+           char *passwd = NULL;
            if (q->auth->which == Z_IdAuthentication_open) {
-               char *openpass = xstrdup (q->auth->u.open);
-               char *cp = strchr (openpass, '/');
+                char *cp;
+               user = nmem_strdup (odr_getmem (q->stream), q->auth->u.open);
+               cp = strchr (user, '/');
                if (cp) {
+                    /* password after / given */
                    *cp = '\0';
-                   user = nmem_strdup (odr_getmem (q->stream), openpass);
-                   passwd = nmem_strdup (odr_getmem (q->stream), cp + 1);
+                   passwd = cp+1;
                }
-               xfree(openpass);
            } else if (q->auth->which == Z_IdAuthentication_idPass) {
                user = q->auth->u.idPass->userId;
                passwd = q->auth->u.idPass->password;
            }
            /* ### some code paths have user/password unassigned here */
-           hv_store(href, "USER", 4, newSVpv(user, 0), 0);
-           hv_store(href, "PASS", 4, newSVpv(passwd, 0), 0);
+            if (user)
+               hv_store(href, "USER", 4, newSVpv(user, 0), 0);
+            if (passwd)
+               hv_store(href, "PASS", 4, newSVpv(passwd, 0), 0);
        }
 
        PUSHMARK(sp);