/*
- * $Id: SimpleServer.xs,v 1.61 2007-05-23 07:41:08 adam Exp $
+ * $Id: SimpleServer.xs,v 1.64 2007-08-08 12:11:42 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
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_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) {
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: