Fixed bug #1137: Update simpleserver for YAZ 3
[simpleserver-moved-to-github.git] / SimpleServer.xs
index f3899e7..3a1e235 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: SimpleServer.xs,v 1.58 2007-04-17 07:56:29 adam Exp $ 
+ * $Id: SimpleServer.xs,v 1.61 2007-05-23 07:41:08 adam Exp $ 
  * ----------------------------------------------------------------------
  * 
  * Copyright (c) 2000-2004, Index Data.
@@ -37,6 +37,7 @@
 #include <yaz/wrbuf.h>
 #include <yaz/querytowrbuf.h>
 #include <stdio.h>
+#include <yaz/mutex.h>
 #ifdef WIN32
 #else
 #include <unistd.h>
@@ -51,7 +52,7 @@
 #define sv_undef PL_sv_undef
 #endif
 
-NMEM_MUTEX simpleserver_mutex;
+YAZ_MUTEX simpleserver_mutex;
 
 typedef struct {
        SV *handle;
@@ -129,7 +130,7 @@ void tst_clones(void)
 
 int simpleserver_clone(void) {
 #ifdef USE_ITHREADS
-     nmem_mutex_enter(simpleserver_mutex);
+     yaz_mutex_enter(simpleserver_mutex);
      if (1)
      {
          PerlInterpreter *current = PERL_GET_CONTEXT;
@@ -145,14 +146,14 @@ int simpleserver_clone(void) {
              PERL_SET_CONTEXT( perl_interp );
          }
      }
-     nmem_mutex_leave(simpleserver_mutex);
+     yaz_mutex_leave(simpleserver_mutex);
 #endif
      return 0;
 }
 
 
 void simpleserver_free(void) {
-    nmem_mutex_enter(simpleserver_mutex);
+    yaz_mutex_enter(simpleserver_mutex);
     if (1)
     {
         PerlInterpreter *current_interp = PERL_GET_CONTEXT;
@@ -167,7 +168,7 @@ void simpleserver_free(void) {
             perl_free(current_interp);
        }
     }
-    nmem_mutex_leave(simpleserver_mutex);
+    yaz_mutex_leave(simpleserver_mutex);
 }
 
 
@@ -226,21 +227,18 @@ Z_GenericRecord *read_grs1(char *str, ODR o)
                        exit(0);
                }
                r->elements[r->num_elements] = t = (Z_TaggedElement *) odr_malloc(o, sizeof(Z_TaggedElement));
-               t->tagType = (int *)odr_malloc(o, sizeof(int));
-               *t->tagType = type;
+               t->tagType = odr_intdup(o, type);
                t->tagValue = (Z_StringOrNumeric *)
                        odr_malloc(o, sizeof(Z_StringOrNumeric));
                if ((ivalue = atoi(value)))
                {
                        t->tagValue->which = Z_StringOrNumeric_numeric;
-                       t->tagValue->u.numeric = (int *)odr_malloc(o, sizeof(int));
-                       *t->tagValue->u.numeric = ivalue;
+                       t->tagValue->u.numeric = odr_intdup(o, ivalue);
                }
                else
                {
                        t->tagValue->which = Z_StringOrNumeric_string;
-                       t->tagValue->u.string = (char *)odr_malloc(o, strlen(value)+1);
-                       strcpy(t->tagValue->u.string, value);
+                       t->tagValue->u.string = odr_strdup(o, value);
                }
                t->tagOccurrence = 0;
                t->metaData = 0;
@@ -262,7 +260,6 @@ Z_GenericRecord *read_grs1(char *str, ODR o)
 
 
 
-
 static void oid2str(Odr_oid *o, WRBUF buf)
 {
     for (; *o >= 0; o++) {
@@ -274,6 +271,13 @@ static void oid2str(Odr_oid *o, WRBUF buf)
     }
 }
 
+WRBUF oid2dotted(Odr_oid *oid)
+{
+    WRBUF buf = wrbuf_alloc();
+    oid2str(oid, buf);
+    return buf;
+}
+               
 
 WRBUF zquery2pquery(Z_Query *q)
 {
@@ -767,30 +771,6 @@ int bend_search(void *handle, bend_search_rr *rr)
 }
 
 
-/* ### this is worryingly similar to oid2str() */
-WRBUF oid2dotted(int *oid)
-{
-
-       WRBUF buf = wrbuf_alloc();
-       int dot = 0;
-
-       for (; *oid != -1 ; oid++)
-       {
-               char ibuf[16];
-               if (dot)
-               {
-                       wrbuf_putc(buf, '.');
-               }
-               else
-               {
-                       dot = 1;
-               }
-               sprintf(ibuf, "%d", *oid);
-               wrbuf_puts(buf, ibuf);
-       }
-       return buf;
-}
-               
 int bend_fetch(void *handle, bend_fetch_rr *rr)
 {
        HV *href;
@@ -808,7 +788,7 @@ int bend_fetch(void *handle, bend_fetch_rr *rr)
        char *ODR_record;
        char *ODR_basename;
        char *ODR_errstr;
-       int *ODR_oid_buf;
+       Odr_oid *ODR_oid_buf;
        WRBUF oid_dotted;
        Zfront_handle *zhandle = (Zfront_handle *)handle;
        CV* handler_cv = 0;
@@ -944,7 +924,7 @@ int bend_fetch(void *handle, bend_fetch_rr *rr)
 
        ptr = SvPV(rep_form, length);
 
-       ODR_oid_buf = (int *)odr_malloc(rr->stream, (MAX_OID + 1) * sizeof(int));
+       ODR_oid_buf = (Odr_oid *)odr_malloc(rr->stream, (MAX_OID + 1) * sizeof(Odr_oid));
        if (oid_dotstring_to_oid(ptr, ODR_oid_buf))
        {
                printf("Net::Z3950::SimpleServer: WARNING: OID structure too long, max length is %d\n", MAX_OID);
@@ -1574,7 +1554,7 @@ start_server(...)
                }
                *argv_buf = NULL;
                root_perl_context = PERL_GET_CONTEXT;
-               nmem_mutex_create(&simpleserver_mutex);
+               yaz_mutex_create(&simpleserver_mutex);
 #if 0
                /* only for debugging perl_clone .. */
                tst_clones();