/*
- * $Id: SimpleServer.xs,v 1.61 2007-05-23 07:41:08 adam Exp $
+ * $Id: SimpleServer.xs,v 1.67 2007-08-10 16:44:00 mike Exp $
* ----------------------------------------------------------------------
*
* Copyright (c) 2000-2004, Index Data.
#include <yaz/querytowrbuf.h>
#include <stdio.h>
#include <yaz/mutex.h>
+#include <yaz/oid_db.h>
#ifdef WIN32
#else
#include <unistd.h>
YAZ_MUTEX simpleserver_mutex;
typedef struct {
- SV *handle;
-
+ SV *ghandle; /* Global handle specified at creation */
+ SV *handle; /* Per-connection handle set at Init */
+#if 0
+/* ### These callback-reference elements are never used! */
SV *init_ref;
SV *close_ref;
SV *sort_ref;
SV *delete_ref;
SV *scan_ref;
SV *explain_ref;
+#endif /*0*/
NMEM nmem;
int stop_flag; /* is used to stop server prematurely .. */
} Zfront_handle;
#define ENABLE_STOP_SERVER 0
+SV *_global_ghandle = NULL; /* To be copied into zhandle then ignored */
SV *init_ref = NULL;
SV *close_ref = NULL;
SV *sort_ref = NULL;
SV *scan_ref = NULL;
SV *explain_ref = NULL;
PerlInterpreter *root_perl_context;
-int MAX_OID = 15;
#define GRS_BUF_SIZE 8192
+
+/*
+ * Inspects the SV indicated by svp, and returns a null pointer if
+ * it's an undefined value, or a string allocation from `stream'
+ * otherwise. Using this when filling in addinfo avoids those
+ * irritating "Use of uninitialized value in subroutine entry"
+ * warnings from Perl.
+ */
+char *string_or_undef(SV **svp, ODR stream) {
+ STRLEN len;
+ char *ptr, *buf;
+
+ if (!SvOK(*svp))
+ return 0;
+
+ ptr = SvPV(*svp, len);
+ buf = (char*) odr_malloc(stream, len+1);
+ strcpy(buf, ptr);
+ return buf;
+}
+
+
CV * simpleserver_sv2cv(SV *handler) {
STRLEN len;
char *buf;
hv_store(href, "INPUT", 5, newRV( (SV*) aref), 0);
hv_store(href, "OUTPUT", 6, newSVpv(rr->output_setname, 0), 0);
hv_store(href, "SEQUENCE", 8, newRV( (SV*) sort_seq), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "STATUS", 6, newSViv(0), 0);
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
HV *href;
AV *aref;
SV **temp;
- char *ODR_errstr;
- STRLEN len;
int i;
char **basenames;
WRBUF query;
- char *ptr;
SV *point;
Zfront_handle *zhandle = (Zfront_handle *)handle;
CV* handler_cv = 0;
hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0);
hv_store(href, "HITS", 4, newSViv(0), 0);
hv_store(href, "DATABASES", 9, newRV( (SV*) aref), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "PID", 3, newSViv(getpid()), 0);
if ((rpnSV = zquery2perl(rr->query)) != 0) {
rr->errcode = SvIV(*temp);
temp = hv_fetch(href, "ERR_STR", 7, 1);
- ptr = SvPV(*temp, len);
- ODR_errstr = (char *)odr_malloc(rr->stream, len + 1);
- strcpy(ODR_errstr, ptr);
- rr->errstring = ODR_errstr;
+ rr->errstring = string_or_undef(temp, rr->stream);
temp = hv_fetch(href, "HANDLE", 6, 1);
point = newSVsv(*temp);
char *ODR_record;
char *ODR_basename;
char *ODR_errstr;
- Odr_oid *ODR_oid_buf;
WRBUF oid_dotted;
Zfront_handle *zhandle = (Zfront_handle *)handle;
CV* handler_cv = 0;
hv_store(href, "SETNAME", 7, newSVpv(rr->setname, 0), 0);
if (rr->schema)
hv_store(href, "SCHEMA", 6, newSVpv(rr->schema, 0), 0);
+ else
+ hv_store(href, "SCHEMA", 6, newSVpv("", 0), 0);
+
temp = hv_store(href, "OFFSET", 6, newSViv(rr->number), 0);
if (rr->request_format != 0) {
oid_dotted = oid2dotted(rr->request_format);
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0);
hv_store(href, "SUR_FLAG", 8, newSViv(0), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "PID", 3, newSViv(getpid()), 0);
if (rr->comp)
ptr = SvPV(rep_form, length);
- ODR_oid_buf = (Odr_oid *)odr_malloc(rr->stream, (MAX_OID + 1) * sizeof(Odr_oid));
- if (oid_dotstring_to_oid(ptr, ODR_oid_buf))
+ rr->output_format = yaz_string_to_oid_odr(yaz_oid_std(),
+ CLASS_RECSYN, ptr, rr->stream);
+ if (!rr->output_format)
{
- printf("Net::Z3950::SimpleServer: WARNING: OID structure too long, max length is %d\n", MAX_OID);
+ printf("Net::Z3950::SimpleServer: WARNING: Bad OID %s\n", ptr);
+ rr->output_format =
+ odr_oiddup(rr->stream, yaz_oid_recsyn_sutrs);
}
- rr->output_format = ODR_oid_buf;
-
ptr = SvPV(record, length);
/* Treat GRS-1 records separately */
- if (!oid_oidcmp(ODR_oid_buf, yaz_oid_recsyn_grs_1))
+ if (!oid_oidcmp(rr->output_format, yaz_oid_recsyn_grs_1))
{
rr->record = (char *) read_grs1(ptr, rr->stream);
rr->len = -1;
SAVETMPS;
href = newHV();
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0);
hv_store(href, "POS", 3, newSViv(rr->term_position), 0);
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "STATUS", 6, newSViv(BEND_SCAN_SUCCESS), 0);
hv_store(href, "ENTRIES", 7, newRV((SV *) list), 0);
href = newHV();
hv_store(href, "EXPLAIN", 7, newSVpv("", 0), 0);
hv_store(href, "DATABASE", 8, newSVpv(q->database, 0), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
PUSHMARK(sp);
ENTER;
SAVETMPS;
+ zhandle->ghandle = _global_ghandle;
zhandle->nmem = nmem;
zhandle->stop_flag = 0;
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
hv_store(href, "ERR_STR", 7, newSViv(0), 0);
hv_store(href, "PEER_NAME", 9, newSVpv(q->peer_name, 0), 0);
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, newSVsv(&sv_undef), 0);
hv_store(href, "PID", 3, newSViv(getpid()), 0);
if (q->auth) {
if (close_ref)
{
href = newHV();
+ hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
PUSHMARK(sp);
void
+set_ghandle(arg)
+ SV *arg
+ CODE:
+ _global_ghandle = newSVsv(arg);
+
+
+void
set_init_handler(arg)
SV *arg
CODE:
char *ptr;
ptr = SvPV(arg, len);
yaz_log(YLOG_LOG, "%.*s", len, ptr);
+
+int
+yaz_diag_srw_to_bib1(srw_code)
+ int srw_code
+
+int
+yaz_diag_bib1_to_srw(bib1_code)
+ int bib1_code
+