Avoid mixed stmt/var declare
[simpleserver-moved-to-github.git] / SimpleServer.xs
index 623949c..862ef21 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: SimpleServer.xs,v 1.29 2004-06-05 22:18:09 adam Exp $ 
+ * $Id: SimpleServer.xs,v 1.36 2006-01-30 21:29:41 adam Exp $ 
  * ----------------------------------------------------------------------
  * 
  * Copyright (c) 2000-2004, Index Data.
@@ -103,18 +103,20 @@ CV * simpleserver_sv2cv(SV *handler) {
 }
 
 /* debugging routine to check for destruction of Perl interpreters */
-#if 1
-int tst_clones(void)
+#ifdef USE_ITHREADS
+void tst_clones(void)
 {
     int i; 
     PerlInterpreter *parent = PERL_GET_CONTEXT;
-    for (i = 0; i<500; i++)
+    for (i = 0; i<5000; i++)
     {
         PerlInterpreter *perl_interp;
 
+       PERL_SET_CONTEXT(parent);
        PL_perl_destruct_level = 2;
-        perl_interp = perl_clone(parent, 0);
+        perl_interp = perl_clone(parent, CLONEf_CLONE_HOST);
        PL_perl_destruct_level = 2;
+       PERL_SET_CONTEXT(perl_interp);
         perl_destruct(perl_interp);
         perl_free(perl_interp);
     }
@@ -136,7 +138,7 @@ int simpleserver_clone(void) {
          if (!current) {
              PerlInterpreter *perl_interp;
              PERL_SET_CONTEXT( root_perl_context );
-             perl_interp = perl_clone(root_perl_context, 0);
+             perl_interp = perl_clone(root_perl_context, CLONEf_CLONE_HOST);
              PERL_SET_CONTEXT( perl_interp );
          }
      }
@@ -356,7 +358,7 @@ void fatal(char *fmt, ...)
 {
     va_list ap;
 
-    fprintf(stderr, "FATAL (yazwrap): ");
+    fprintf(stderr, "FATAL (SimpleServer): ");
     va_start(ap, fmt);
     vfprintf(stderr, fmt, ap);
     va_end(ap);
@@ -439,8 +441,22 @@ static SV *rpn2perl(Z_RPNStructure *s)
     case Z_RPNStructure_simple: {
        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;
+           printf("Encoding resultSetId '%s'\n", rsid);
+           sv = newObject("Net::Z3950::RPN::RSID", (SV*) (hv = newHV()));
+           printf("Made sv=0x%lx, hv=0x%lx\n",
+                  (unsigned long) sv ,(unsigned long) hv);
+           sv2 = newSVpv(rsid, strlen(rsid));
+           setMember(hv, "id", sv2);
+           printf("Set hv{id} to 0x%lx\n", (unsigned long) sv2);
+           return sv;
+       }
        if (o->which != Z_Operand_APT)
-           fatal("can't handle RPN simples other than APT");
+           fatal("can't handle RPN simples other than APT and RSID");
        at = o->u.attributesPlusTerm;
        if (at->term->which != Z_Term_general)
            fatal("can't handle RPN terms other than general");
@@ -564,7 +580,6 @@ int bend_sort(void *handle, bend_sort_rr *rr)
        temp = hv_fetch(href, "STATUS", 6, 1);
        status = newSVsv(*temp);
 
-
        PUTBACK;
        FREETMPS;
        LEAVE;
@@ -595,11 +610,9 @@ int bend_search(void *handle, bend_search_rr *rr)
        STRLEN len;
        int i;
        char **basenames;
-       int n;
        WRBUF query;
        char *ptr;
        SV *point;
-       SV *ODR_point;
        Zfront_handle *zhandle = (Zfront_handle *)handle;
        CV* handler_cv = 0;
 
@@ -1045,7 +1058,6 @@ int bend_scan(void *handle, bend_scan_rr *rr)
        char *ODR_errstr;
        STRLEN len;
        int term_len;
-       SV *term_tmp;
        SV *entries_ref;
        Zfront_handle *zhandle = (Zfront_handle *)handle;
        CV* handler_cv = 0;
@@ -1171,7 +1183,6 @@ bend_initresult *bend_init(bend_initrequest *q)
        SV *handle;
        HV *href;
        SV **temp;
-       SV *status;
 
        ENTER;
        SAVETMPS;
@@ -1280,7 +1291,6 @@ void bend_close(void *handle)
 {
        HV *href;
        Zfront_handle *zhandle = (Zfront_handle *)handle;
-       SV **temp;
        CV* handler_cv = 0;
        int stop_flag = 0;
        dSP;
@@ -1305,7 +1315,8 @@ void bend_close(void *handle)
 
                sv_free((SV*) href);
        }
-       sv_free(zhandle->handle);
+       else
+               sv_free(zhandle->handle);
        PUTBACK;
        FREETMPS;
        LEAVE;
@@ -1321,6 +1332,9 @@ void bend_close(void *handle)
 
 MODULE = Net::Z3950::SimpleServer      PACKAGE = Net::Z3950::SimpleServer
 
+PROTOTYPES: DISABLE
+
+
 void
 set_init_handler(arg)
                SV *arg
@@ -1428,3 +1442,11 @@ ScanPartial()
                RETVAL
 
  
+void
+yazlog(arg)
+               SV *arg
+       CODE:
+               STRLEN len;
+               char *ptr;
+               ptr = SvPV(arg, len);
+               yaz_log(YLOG_LOG, "%.*s", len, ptr);