-/* $Id: zserver.c,v 1.138 2005-08-09 09:35:25 adam Exp $
- Copyright (C) 1995-2005
+/* $Id: zserver.c,v 1.149 2006-08-14 10:40:15 adam Exp $
+ Copyright (C) 1995-2006
Index Data ApS
This file is part of the Zebra server.
for more details.
You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
*/
#include <assert.h>
yaz_log (YLOG_DEBUG, "bend_init");
sob = statserv_getcontrol ();
- if (!(zh = zebra_open (sob->handle)))
+ if (!(zh = zebra_open (sob->handle, 0)))
{
yaz_log (YLOG_WARN, "Failed to read config `%s'", sob->configname);
r->errcode = YAZ_BIB1_PERMANENT_SYSTEM_ERROR;
sizeof(*sr->elements));
for (i = 0; i<no_terms; i++)
{
+ Z_SearchInfoReport_s *se;
Z_Term *term;
zint count;
int approx;
char outbuf[1024];
size_t len = sizeof(outbuf);
+ const char *term_ref_id = 0;
zebra_result_set_term_info(zh, r->setname, i,
&count, &approx, outbuf, &len,
- 0 /* term_ref_id */ );
-
- sr->elements[i] = odr_malloc (r->stream, sizeof(**sr->elements));
- sr->elements[i]->subqueryId = 0;
- sr->elements[i]->fullQuery = odr_malloc (r->stream,
- sizeof(bool_t));
- *sr->elements[i]->fullQuery = 0;
- sr->elements[i]->subqueryExpression =
+ &term_ref_id);
+ se = sr->elements[i] = odr_malloc (r->stream, sizeof(**sr->elements));
+ se->subqueryId = term_ref_id ?
+ odr_strdup(r->stream, term_ref_id) : 0;
+
+ se->fullQuery = odr_intdup(r->stream, 0);
+ se->subqueryExpression =
odr_malloc (r->stream, sizeof(Z_QueryExpression));
- sr->elements[i]->subqueryExpression->which =
+ se->subqueryExpression->which =
Z_QueryExpression_term;
- sr->elements[i]->subqueryExpression->u.term =
+ se->subqueryExpression->u.term =
odr_malloc (r->stream, sizeof(Z_QueryExpressionTerm));
term = odr_malloc (r->stream, sizeof(Z_Term));
- sr->elements[i]->subqueryExpression->u.term->queryTerm = term;
+ se->subqueryExpression->u.term->queryTerm = term;
switch (type)
{
case Z_Term_characterString:
- yaz_log (YLOG_DEBUG, "term as characterString");
term->which = Z_Term_characterString;
term->u.characterString = odr_strdup (r->stream, outbuf);
break;
case Z_Term_general:
- yaz_log (YLOG_DEBUG, "term as general");
term->which = Z_Term_general;
term->u.general = odr_malloc (r->stream, sizeof(*term->u.general));
term->u.general->size = term->u.general->len = len;
term->which = Z_Term_general;
term->u.null = odr_nullval();
}
- sr->elements[i]->subqueryExpression->u.term->termComment = 0;
- sr->elements[i]->subqueryInterpretation = 0;
- sr->elements[i]->subqueryRecommendation = 0;
- if (count > 2000000000)
- count = 2000000000;
- sr->elements[i]->subqueryCount = odr_intdup (r->stream, (int) count);
- sr->elements[i]->subqueryWeight = 0;
- sr->elements[i]->resultsByDB = 0;
+ se->subqueryExpression->u.term->termComment = 0;
+ se->subqueryInterpretation = 0;
+ se->subqueryRecommendation = 0;
+ if (count > 2147483646)
+ count = 2147483647;
+ se->subqueryCount = odr_intdup(r->stream, CAST_ZINT_TO_INT(count));
+ se->subqueryWeight = 0;
+ se->resultsByDB = 0;
}
}
-int bend_search (void *handle, bend_search_rr *r)
+int bend_search(void *handle, bend_search_rr *r)
{
ZebraHandle zh = (ZebraHandle) handle;
zint zhits = 0;
zebra_result(zh, &r->errcode, &r->errstring);
else
{
- if (zhits > 2147483646)
- r->hits = 2147483647;
- else
- r->hits = (int) zhits;
+ if (zhits > 2147483646)
+ zhits = 2147483647;
+ r->hits = CAST_ZINT_TO_INT(zhits);
search_terms (zh, r);
}
break;
for (i = 0; i < r->num_entries; i++)
{
r->entries[i].term = entries[i].term;
- r->entries[i].occurrences = entries[i].occurrences;
+ r->entries[i].occurrences =
+ CAST_ZINT_TO_INT(entries[i].occurrences);
}
}
else
{
ZebraHandle zh = (ZebraHandle) handle;
- zebra_sort (zh, rr->stream,
- rr->num_input_setnames, (const char **) rr->input_setnames,
- rr->output_setname, rr->sort_sequence, &rr->sort_status);
- zebra_result (zh, &rr->errcode, &rr->errstring);
+ if (zebra_sort (zh, rr->stream,
+ rr->num_input_setnames, (const char **) rr->input_setnames,
+ rr->output_setname, rr->sort_sequence, &rr->sort_status)
+ != ZEBRA_OK)
+ zebra_result (zh, &rr->errcode, &rr->errstring);
return 0;
}
return 0;
}
-static int es_admin_request (ZebraHandle zh, Z_AdminEsRequest *r)
+static void es_admin_request (bend_esrequest_rr *rr, ZebraHandle zh, Z_AdminEsRequest *r)
{
+ ZEBRA_RES res = ZEBRA_OK;
if (r->toKeep->databaseName)
{
yaz_log(YLOG_LOG, "adm request database %s", r->toKeep->databaseName);
{
case Z_ESAdminOriginPartToKeep_reIndex:
yaz_log(YLOG_LOG, "adm-reindex");
+ rr->errcode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED;
+ rr->errstring = "adm-reindex not implemented yet";
break;
case Z_ESAdminOriginPartToKeep_truncate:
+ rr->errcode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED;
+ rr->errstring = "adm-reindex not implemented yet";
yaz_log(YLOG_LOG, "adm-truncate");
break;
case Z_ESAdminOriginPartToKeep_drop:
yaz_log(YLOG_LOG, "adm-drop");
- zebra_drop_database (zh, r->toKeep->databaseName);
+ res = zebra_drop_database (zh, r->toKeep->databaseName);
break;
case Z_ESAdminOriginPartToKeep_create:
yaz_log(YLOG_LOG, "adm-create %s", r->toKeep->databaseName);
- zebra_create_database (zh, r->toKeep->databaseName);
+ res = zebra_create_database (zh, r->toKeep->databaseName);
break;
case Z_ESAdminOriginPartToKeep_import:
yaz_log(YLOG_LOG, "adm-import");
- zebra_admin_import_begin (zh, r->toKeep->databaseName,
- r->toKeep->u.import->recordType);
+ res = zebra_admin_import_begin (zh, r->toKeep->databaseName,
+ r->toKeep->u.import->recordType);
break;
case Z_ESAdminOriginPartToKeep_refresh:
yaz_log(YLOG_LOG, "adm-refresh");
case Z_ESAdminOriginPartToKeep_commit:
yaz_log(YLOG_LOG, "adm-commit");
if (r->toKeep->databaseName)
- zebra_select_database(zh, r->toKeep->databaseName);
+ {
+ if (zebra_select_database(zh, r->toKeep->databaseName) !=
+ ZEBRA_OK)
+ yaz_log(YLOG_WARN, "zebra_select_database failed in "
+ "adm-commit");
+ }
zebra_commit(zh);
break;
case Z_ESAdminOriginPartToKeep_shutdown:
yaz_log(YLOG_LOG, "shutdown");
- zebra_admin_shutdown(zh);
+ res = zebra_admin_shutdown(zh);
break;
case Z_ESAdminOriginPartToKeep_start:
yaz_log(YLOG_LOG, "start");
break;
default:
yaz_log(YLOG_LOG, "unknown admin");
+ rr->errcode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED;
+ rr->errstring = "adm-reindex not implemented yet";
}
- return 0;
+ if (res != ZEBRA_OK)
+ zebra_result(zh, &rr->errcode, &rr->errstring);
}
-static int es_admin (ZebraHandle zh, Z_Admin *r)
+static void es_admin (bend_esrequest_rr *rr, ZebraHandle zh, Z_Admin *r)
{
switch (r->which)
{
case Z_Admin_esRequest:
- es_admin_request (zh, r->u.esRequest);
- break;
- case Z_Admin_taskPackage:
- yaz_log (YLOG_LOG, "adm taskpackage (unhandled)");
- break;
+ es_admin_request (rr, zh, r->u.esRequest);
+ return;
default:
break;
}
- return 0;
+ yaz_log (YLOG_WARN, "adm taskpackage (unhandled)");
+ rr->errcode = YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED;
+ rr->errstring = "adm-task package (unhandled)";
}
int bend_segment (void *handle, bend_segment_rr *rr)
}
else if (rr->esr->taskSpecificParameters->which == Z_External_ESAdmin)
{
- es_admin (zh, rr->esr->taskSpecificParameters->u.adminService);
-
- zebra_result (zh, &rr->errcode, &rr->errstring);
+ es_admin(rr, zh, rr->esr->taskSpecificParameters->u.adminService);
}
else if (rr->esr->taskSpecificParameters->which == Z_External_update)
{
Z_External *rec = notToKeep->elements[i]->record;
struct oident *oident = 0;
Odr_oct *opaque_recid = 0;
- SYSNO sysno = 0;
+ SYSNO *sysno = 0;
+ SYSNO sysno_tmp;
if (notToKeep->elements[i]->u.opaque)
{
opaque_recid = notToKeep->elements[i]->u.opaque;
break; /* OK, recid already set */
case Z_IUSuppliedRecords_elem_number:
- sysno = *notToKeep->elements[i]->u.number;
+ sysno_tmp = *notToKeep->elements[i]->u.number;
+ sysno = &sysno_tmp;
break;
}
}
{
int r = zebra_admin_exchange_record (
zh,
- rec->u.octet_aligned->buf,
+ (const char *) rec->u.octet_aligned->buf,
rec->u.octet_aligned->len,
- opaque_recid->buf, opaque_recid->len,
+ (const char *) opaque_recid->buf,
+ opaque_recid->len,
action);
if (r)
{
- rr->errcode =
- YAZ_BIB1_ES_IMMEDIATE_EXECUTION_FAILED;
- rr->errstring = "record exchange failed";
+ zebra_result(zh, &rr->errcode,
+ &rr->errstring);
break;
}
}
r = zebra_insert_record(
zh,
0, /* recordType */
- &sysno,
+ sysno,
0, /* match */
0, /* fname */
- rec->u.octet_aligned->buf,
+ (const char *) rec->u.octet_aligned->buf,
rec->u.octet_aligned->len,
0);
if (r == ZEBRA_FAIL)
r = zebra_update_record(
zh,
0, /* recordType */
- &sysno,
+ sysno,
0, /* match */
0, /* fname */
- rec->u.octet_aligned->buf,
+ (const char *) rec->u.octet_aligned->buf,
rec->u.octet_aligned->len,
1);
if (r == ZEBRA_FAIL)
r = zebra_delete_record(
zh,
0, /* recordType */
- &sysno,
+ sysno,
0, /* match */
0, /* fname */
- rec->u.octet_aligned->buf,
+ (const char *) rec->u.octet_aligned->buf,
rec->u.octet_aligned->len,
0);
if (r == ZEBRA_FAIL)
}
}
}
- zebra_end_trans (zh);
+ if (zebra_end_trans (zh) != ZEBRA_OK)
+ {
+ yaz_log(YLOG_WARN, "zebra_end_trans failed for"
+ " extended service operation");
+ }
}
}
}
return statserv_main (argc, argv, bend_init, bend_close);
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+