/*
- * Copyright (C) 1995-1997, Index Data I/S
+ * Copyright (C) 1995-1998, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: zserver.c,v $
- * Revision 1.50 1997-09-29 09:08:36 adam
+ * Revision 1.55 1998-02-10 12:03:06 adam
+ * Implemented Sort.
+ *
+ * Revision 1.54 1998/01/29 13:39:13 adam
+ * Compress ISAM is default.
+ *
+ * Revision 1.53 1998/01/12 15:04:09 adam
+ * The test option (-s) only uses read-lock (and not write lock).
+ *
+ * Revision 1.52 1997/11/18 10:05:08 adam
+ * Changed character map facility so that admin can specify character
+ * mapping files for each register type, w, p, etc.
+ *
+ * Revision 1.51 1997/10/27 14:33:06 adam
+ * Moved towards generic character mapping depending on "structure"
+ * field in abstract syntax file. Fixed a few memory leaks. Fixed
+ * bug with negative integers when doing searches with relational
+ * operators.
+ *
+ * Revision 1.50 1997/09/29 09:08:36 adam
* Revised locking system to be thread safe for the server.
*
* Revision 1.49 1997/09/25 14:57:23 adam
{
zebTargetInfo_close (zi->zti, 0);
dict_close (zi->dict);
+ sortIdx_close (zi->sortIdx);
if (zi->isam)
is_close (zi->isam);
if (zi->isamc)
zi->records = rec_open (zi->bfs, 0);
if (!(zi->dict = dict_open (zi->bfs, FNAME_DICT, 40, 0)))
return -1;
+ if (!(zi->sortIdx = sortIdx_open (zi->bfs, 0)))
+ return -1;
zi->isam = NULL;
zi->isamc = NULL;
- if (res_get_match (zi->res, "isam", "c", NULL))
+ if (!res_get_match (zi->res, "isam", "i", NULL))
{
if (!(zi->isamc = isc_open (zi->bfs, FNAME_ISAMC,
0, key_isamc_m(zi->res))))
return -1;
}
zi->zti = zebTargetInfo_open (zi->records, 0);
- init_charmap (zi->res);
+
return 0;
}
zebra_server_unlock (zi, zi->registerState);
}
+static int bend_sort (void *handle, bend_sort_rr *rr);
+
bend_initresult *bend_init (bend_initrequest *q)
{
bend_initresult *r = odr_malloc (q->stream, sizeof(*r));
r->errcode = 0;
r->errstring = 0;
r->handle = zi;
+ q->bend_sort = bend_sort;
logf (LOG_DEBUG, "bend_init");
logf (LOG_LOG, "Reading resources from %s", sob->configname);
if (!(zi->res = res_open (sob->configname)))
{
- logf (LOG_FATAL, "Cannot open resource `%s'", sob->configname);
- exit (1);
+ logf (LOG_FATAL, "Failed to read resources `%s'", sob->configname);
+ r->errcode = 1;
+ return r;
}
zebra_server_lock_init (zi);
zi->dh = data1_create ();
zi->registerChange = 0;
zi->records = NULL;
- zi->odr = odr_createmem (ODR_ENCODE);
zi->registered_sets = NULL;
+ zi->zebra_maps = zebra_maps_open (res_get(zi->res, "profilePath"),
+ zi->res);
return r;
}
r->hits = 0;
register_lock (zi);
- odr_reset (zi->odr);
zi->errCode = 0;
zi->errString = NULL;
switch (q->query->which)
{
case Z_Query_type_1: case Z_Query_type_101:
- r->errcode = rpn_search (zi, q->query->u.type_1,
+ r->errcode = rpn_search (zi, q->stream, q->query->u.type_1,
q->num_bases, q->basenames, q->setname,
&r->hits);
r->errstring = zi->errString;
if (!(rt = recType_byName (file_type, subType)))
{
- logf (LOG_FATAL|LOG_ERRNO, "Retrieve: Cannot handle type %s",
- file_type);
- exit (1);
+ logf (LOG_WARN, "Retrieve: Cannot handle type %s", file_type);
+ return 14;
}
logf (LOG_DEBUG, "retrieve localno=%d score=%d", sysno, score);
retrieveCtrl.fh = &fc;
r->last_in_set = 0;
r->basename = "base";
- odr_reset (zi->odr);
zi->errCode = 0;
positions[0] = q->number;
int status;
register_lock (zi);
- odr_reset (zi->odr);
zi->errCode = 0;
zi->errString = 0;
r->term_position = q->term_position;
r->num_entries = q->num_entries;
- r->errcode = rpn_scan (zi, q->term,
+ r->errcode = rpn_scan (zi, q->stream, q->term,
q->attributeset,
q->num_bases, q->basenames,
&r->term_position,
void bend_close (void *handle)
{
ZServerInfo *zi = handle;
+
if (zi->records)
{
resultSetDestroy (zi);
+ zebTargetInfo_close (zi->zti, 0);
dict_close (zi->dict);
+ sortIdx_close (zi->sortIdx);
if (zi->isam)
is_close (zi->isam);
if (zi->isamc)
rec_close (&zi->records);
register_unlock (zi);
}
+ zebra_maps_close (zi->zebra_maps);
bfs_destroy (zi->bfs);
data1_destroy (zi->dh);
zebra_server_lock_destroy (zi);
- return;
+
+ res_close (zi->res);
+ xfree (zi);
+}
+
+#ifndef WINDOWS
+static void pre_init (struct statserv_options_block *sob)
+{
+ char *pidfile = "zebrasrv.pid";
+ int fd = creat (pidfile, 0666);
+
+ if (fd == -1)
+ logf (LOG_WARN|LOG_ERRNO, "creat %s", pidfile);
+ else
+ {
+ char pidstr[30];
+
+ sprintf (pidstr, "%ld", (long) getpid ());
+ write (fd, pidstr, strlen(pidstr));
+ close (fd);
+ }
+}
+#endif
+
+int bend_sort (void *handle, bend_sort_rr *rr)
+{
+ ZServerInfo *zi = handle;
+
+#if 1
+ register_lock (zi);
+
+ resultSetSort (zi, rr);
+
+ register_unlock (zi);
+#endif
+ return 0;
}
int main (int argc, char **argv)
sob = statserv_getcontrol ();
strcpy (sob->configname, FNAME_CONFIG);
+#ifndef WINDOWS
+ sob->pre_init = pre_init;
+#endif
statserv_setcontrol (sob);
return statserv_main (argc, argv);