/*
- * $Id: SimpleServer.xs,v 1.62 2007-05-23 07:55:07 adam Exp $
+ * $Id: SimpleServer.xs,v 1.65 2007-08-10 00:00:14 mike Exp $
* ----------------------------------------------------------------------
*
* Copyright (c) 2000-2004, Index Data.
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;
#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);
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)
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: