From 5a78c428319c846f4b6d0426a0a590f769e2c631 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 8 Nov 2000 13:46:58 +0000 Subject: [PATCH] Fixed scan: server could break if bad attribute/database was selected. Work on remote update. --- index/zebraapi.c | 52 +++++++++++++++++++++++++++------------------------- index/zrpn.c | 9 ++++++++- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/index/zebraapi.c b/index/zebraapi.c index 90fe482..b54afe1 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -3,7 +3,11 @@ * All rights reserved. * * $Log: zebraapi.c,v $ - * Revision 1.37 2000-10-17 12:37:09 adam + * Revision 1.38 2000-11-08 13:46:58 adam + * Fixed scan: server could break if bad attribute/database was selected. + * Work on remote update. + * + * Revision 1.37 2000/10/17 12:37:09 adam * Fixed notification of live-updates. Fixed minor problem with mf_init * where it didn't handle shadow area file names correctly. * @@ -169,7 +173,7 @@ static void zebra_register_unlock (ZebraHandle zh); static int zebra_register_activate (ZebraService zh, int rw); static int zebra_register_deactivate (ZebraService zh); -static int zebra_register_lock (ZebraHandle zh) +static int zebra_register_lock (ZebraHandle zh, int rw) { time_t lastChange; int state; @@ -197,17 +201,19 @@ static int zebra_register_lock (ZebraHandle zh) default: state = 0; } - if (zh->service->registerState == state) + if (rw) + logf (LOG_LOG, "Register in read/write mode"); + else if (zh->service->registerState == state) { - if (zh->service->registerChange >= lastChange) - return 0; - logf (LOG_LOG, "Register completely updated since last access"); + if (zh->service->registerChange >= lastChange) + return 0; + logf (LOG_LOG, "Register completely updated since last access"); } else if (zh->service->registerState == -1) - logf (LOG_LOG, "Reading register using state %d pid=%ld", state, - (long) getpid()); + logf (LOG_LOG, "Reading register using state %d pid=%ld", state, + (long) getpid()); else - logf (LOG_LOG, "Register has changed state from %d to %d", + logf (LOG_LOG, "Register has changed state from %d to %d", zh->service->registerState, state); zh->service->registerChange = lastChange; @@ -215,7 +221,7 @@ static int zebra_register_lock (ZebraHandle zh) zh->service->registerState = state; - zebra_register_activate (zh->service, 0); + zebra_register_activate (zh->service, rw); return 0; } @@ -410,11 +416,6 @@ static int zebra_register_activate (ZebraService zh, int rw) void zebra_admin_shutdown (ZebraHandle zh) { - zebra_register_lock (zh); - zebraExplain_flush (zh->service->zei, 1, zh); - extract_index (zh); - - zebra_register_unlock (zh); zebra_mutex_cond_lock (&zh->service->session_lock); zh->service->stop_flag = 1; if (!zh->service->sessions) @@ -590,7 +591,7 @@ void zebra_search_rpn (ZebraHandle zh, ODR stream, ODR decode, const char *setname) { zh->hits = 0; - if (zebra_register_lock (zh)) + if (zebra_register_lock (zh, 0)) return; map_basenames (zh, stream, &num_bases, &basenames); resultSetAddRPN (zh, stream, decode, query, num_bases, basenames, setname); @@ -608,7 +609,7 @@ void zebra_records_retrieve (ZebraHandle zh, ODR stream, ZebraPosSet poset; int i, *pos_array; - if (zebra_register_lock (zh)) + if (zebra_register_lock (zh, 0)) return; pos_array = (int *) xmalloc (num_recs * sizeof(*pos_array)); for (i = 0; imem, num_input_setnames, input_setnames, output_setname, sort_sequence, sort_status); @@ -686,7 +687,7 @@ int zebra_deleleResultSet(ZebraHandle zh, int function, int *statuses) { int i, status; - if (zebra_register_lock (zh)) + if (zebra_register_lock (zh, 0)) return Z_DeleteStatus_systemProblemAtTarget; switch (function) { @@ -739,24 +740,24 @@ int zebra_auth (ZebraService zh, const char *user, const char *pass) void zebra_admin_import_begin (ZebraHandle zh, const char *database) { - if (zebra_register_lock (zh)) + if (zebra_register_lock (zh, 1)) return; xfree (zh->admin_databaseName); zh->admin_databaseName = xstrdup(database); - zebra_register_unlock(zh); } void zebra_admin_import_end (ZebraHandle zh) { zebraExplain_flush (zh->service->zei, 1, zh); extract_index (zh); + zebra_register_unlock (zh); } void zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) { int sysno; int i; - if (zebra_register_lock (zh)) + if (zh->service->active < 2) return; for (i = 0; inum_segmentRecords; i++) { @@ -788,13 +789,12 @@ void zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) } } } - zebra_register_unlock(zh); } void zebra_admin_create (ZebraHandle zh, const char *database) { ZebraService zs = zh->service; - if (zebra_register_lock(zh)) + if (zebra_register_lock(zh, 1)) { zh->errCode = 1019; return; @@ -805,6 +805,8 @@ void zebra_admin_create (ZebraHandle zh, const char *database) zh->errCode = 224; zh->errString = "Database already exist"; } + zebraExplain_flush (zh->service->zei, 1, zh); + extract_index (zh); zebra_register_unlock(zh); } diff --git a/index/zrpn.c b/index/zrpn.c index 812d78f..36d5c3d 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,11 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.104 2000-04-05 09:49:35 adam + * Revision 1.105 2000-11-08 13:46:59 adam + * Fixed scan: server could break if bad attribute/database was selected. + * Work on remote update. + * + * Revision 1.104 2000/04/05 09:49:35 adam * On Unix, zebra/z'mbol uses automake. * * Revision 1.103 2000/03/20 19:08:36 adam @@ -2494,6 +2498,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type, &rank_type, &complete_flag, &sort_flag)) { + *num_entries = 0; zh->errCode = 113; return ; } @@ -2521,6 +2526,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, { zh->errString = basenames[base_no]; zh->errCode = 109; /* Database unavailable */ + *num_entries = 0; return; } for (local_attr = attp.local_attributes; local_attr && ord_no < 32; @@ -2536,6 +2542,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (ord_no == 0) { + *num_entries = 0; zh->errCode = 113; return; } -- 1.7.10.4