X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzebraapi.c;h=ec242905ed2cd0a610c491e5cac762cac30620b2;hb=ba572d8e1de44023f355c09c4250328aba0e9a47;hp=b54afe18796e759325daca789b8076abc2c8f6ba;hpb=5a78c428319c846f4b6d0426a0a590f769e2c631;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index b54afe1..ec24290 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -3,7 +3,25 @@ * All rights reserved. * * $Log: zebraapi.c,v $ - * Revision 1.38 2000-11-08 13:46:58 adam + * Revision 1.43 2000-12-05 12:22:53 adam + * Termlist source implemented (so that we can index values of XML/SGML + * attributes). + * + * Revision 1.42 2000/12/05 10:01:44 adam + * Fixed bug regarding user-defined attribute sets. + * + * Revision 1.41 2000/12/01 17:59:08 adam + * Fixed bug regarding online updates on WIN32. + * When zebra.cfg is not available the server will not abort. + * + * Revision 1.40 2000/11/29 15:21:31 adam + * Fixed problem with passwd db. + * + * Revision 1.39 2000/11/29 14:24:01 adam + * Script configure uses yaz pthreads options. Added locking for + * zebra_register_{lock,unlock}. + * + * 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. * @@ -189,6 +207,8 @@ static int zebra_register_lock (ZebraHandle zh, int rw) times (&zh->tms1); #endif + zebra_mutex_cond_lock (&zh->service->session_lock); + state = zebra_server_lock_get_state(zh->service, &lastChange); zebra_server_lock (zh->service, state); @@ -205,8 +225,12 @@ static int zebra_register_lock (ZebraHandle zh, int rw) logf (LOG_LOG, "Register in read/write mode"); else if (zh->service->registerState == state) { + logf (LOG_DEBUG, "registerChange = %ld lastChange = %ld", + (long) zh->service->registerChange, (long)lastChange); if (zh->service->registerChange >= lastChange) + { return 0; + } logf (LOG_LOG, "Register completely updated since last access"); } else if (zh->service->registerState == -1) @@ -230,6 +254,7 @@ static void zebra_register_unlock (ZebraHandle zh) { if (zh->service->registerState != -1) zebra_server_unlock (zh->service, zh->service->registerState); + zebra_mutex_cond_unlock (&zh->service->session_lock); #if HAVE_SYS_TIMES_H times (&zh->tms2); logf (LOG_LOG, "user/system: %ld/%ld", @@ -248,6 +273,7 @@ ZebraHandle zebra_open (ZebraService zs) return 0; zh = (ZebraHandle) xmalloc (sizeof(*zh)); + yaz_log (LOG_LOG, "zebra_open zs=%p returns %p", zs, zh); zh->service = zs; zh->sets = 0; @@ -286,18 +312,33 @@ ZebraService zebra_start (const char *configName) if (!(zh->res = res_open (zh->configName))) { logf (LOG_WARN, "Failed to read resources `%s'", zh->configName); - return zh; +// return zh; } zebra_chdir (zh); zebra_server_lock_init (zh); zebra_mutex_cond_init (&zh->session_lock); + if (!res_get (zh->res, "passwd")) + zh->passwd_db = NULL; + else + { + zh->passwd_db = passwd_db_open (); + if (!zh->passwd_db) + logf (LOG_WARN|LOG_ERRNO, "passwd_db_open failed"); + else + passwd_db_file (zh->passwd_db, res_get (zh->res, "passwd")); + } + return zh; } static int zebra_register_activate (ZebraService zh, int rw) { if (zh->active > 1) + { + yaz_log (LOG_LOG, "zebra_register_activate (ignored since active=%d)", + zh->active); return 0; + } yaz_log (LOG_LOG, "zebra_register_activate shadow=%s", zh->registerState ? "yes" : "no"); @@ -333,17 +374,6 @@ static int zebra_register_activate (ZebraService zh, int rw) zebraRankInstall (zh, rank1_class); - if (!res_get (zh->res, "passwd")) - zh->passwd_db = NULL; - else - { - zh->passwd_db = passwd_db_open (); - if (!zh->passwd_db) - logf (LOG_WARN|LOG_ERRNO, "passwd_db_open failed"); - else - passwd_db_file (zh->passwd_db, res_get (zh->res, "passwd")); - } - if (!(zh->records = rec_open (zh->bfs, rw, 0))) { logf (LOG_WARN, "rec_open"); @@ -434,62 +464,72 @@ void zebra_admin_start (ZebraHandle zh) zebra_mutex_cond_unlock (&zs->session_lock); } -static int zebra_register_deactivate (ZebraService zh) +static int zebra_register_deactivate (ZebraService zs) { - zh->stop_flag = 0; - if (zh->active <= 1) + zs->stop_flag = 0; + if (zs->active <= 1) + { + yaz_log(LOG_LOG, "zebra_register_deactivate (ignored since active=%d)", + zs->active); return 0; + } yaz_log(LOG_LOG, "zebra_register_deactivate"); - zebra_chdir (zh); - if (zh->records) + zebra_chdir (zs); + if (zs->records) { - zebraExplain_close (zh->zei, 0); - dict_close (zh->dict); - sortIdx_close (zh->sortIdx); - if (zh->isams) - isams_close (zh->isams); + zebraExplain_close (zs->zei, 0); + dict_close (zs->dict); + sortIdx_close (zs->sortIdx); + if (zs->isams) + isams_close (zs->isams); #if ZMBOL - if (zh->isam) - is_close (zh->isam); - if (zh->isamc) - isc_close (zh->isamc); - if (zh->isamd) - isamd_close (zh->isamd); + if (zs->isam) + is_close (zs->isam); + if (zs->isamc) + isc_close (zs->isamc); + if (zs->isamd) + isamd_close (zs->isamd); #endif - rec_close (&zh->records); + rec_close (&zs->records); } - recTypes_destroy (zh->recTypes); - zebra_maps_close (zh->zebra_maps); - zebraRankDestroy (zh); - bfs_destroy (zh->bfs); - data1_destroy (zh->dh); - - if (zh->passwd_db) - passwd_db_close (zh->passwd_db); - zh->active = 1; + recTypes_destroy (zs->recTypes); + zebra_maps_close (zs->zebra_maps); + zebraRankDestroy (zs); + bfs_destroy (zs->bfs); + data1_destroy (zs->dh); + + if (zs->passwd_db) + passwd_db_close (zs->passwd_db); + zs->active = 1; return 0; } -void zebra_stop(ZebraService zh) +void zebra_stop(ZebraService zs) { - if (!zh) + if (!zs) return ; yaz_log (LOG_LOG, "zebra_stop"); - assert (!zh->sessions); + zebra_mutex_cond_lock (&zs->session_lock); + while (zs->sessions) + zebra_close (zs->sessions); + + zebra_mutex_cond_unlock (&zs->session_lock); - zebra_mutex_cond_destroy (&zh->session_lock); + zebra_mutex_cond_destroy (&zs->session_lock); - zebra_register_deactivate(zh); - res_close (zh->res); - xfree (zh->configName); - xfree (zh); + zebra_register_deactivate(zs); + res_close (zs->res); + xfree (zs->configName); + xfree (zs); } void zebra_close (ZebraHandle zh) { ZebraService zs = zh->service; struct zebra_session **sp; + + yaz_log (LOG_LOG, "zebra_close zh=%p", zh); if (!zh) return ; resultSetDestroy (zh, -1, 0, 0); @@ -849,6 +889,7 @@ static void extract_add_index_string (RecWord *p, const char *string, int diff = 0; int *pseqno = &p->seqnos[p->reg_type]; ZebraHandle zh = p->extractCtrl->handle; + ZebraExplainInfo zei = zh->service->zei; struct recKeys *keys = &zh->keys; if (keys->buf_used+1024 > keys->buf_max) @@ -884,6 +925,21 @@ static void extract_add_index_string (RecWord *p, const char *string, *dst++ = lead; +#if SU_SCHEME + if ((lead & 3) < 3) + { + int ch = zebraExplain_lookupSU (zei, attrSet, attrUse); + if (ch < 0) + { + ch = zebraExplain_addSU (zei, attrSet, attrUse); + yaz_log (LOG_LOG, "addSU set=%d use=%d SU=%d", + attrSet, attrUse, ch); + } + assert (ch > 0); + memcpy (dst, &ch, sizeof(ch)); + dst += sizeof(ch); + } +#else if (!(lead & 1)) { memcpy (dst, &attrSet, sizeof(attrSet)); @@ -894,6 +950,7 @@ static void extract_add_index_string (RecWord *p, const char *string, memcpy (dst, &attrUse, sizeof(attrUse)); dst += sizeof(attrUse); } +#endif *dst++ = p->reg_type; memcpy (dst, string, length); dst += length; @@ -1229,10 +1286,14 @@ static void extract_flushWriteKeys (ZebraHandle zh) static void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno, int cmd, struct recKeys *reckeys) { +#if SU_SCHEME +#else unsigned char attrSet = (unsigned char) -1; unsigned short attrUse = (unsigned short) -1; +#endif int seqno = 0; int off = 0; + int ch = 0; ZebraExplainInfo zei = zh->service->zei; if (!zh->key_buf) @@ -1249,10 +1310,17 @@ static void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno, { const char *src = reckeys->buf + off; struct it_key key; - int lead, ch; + int lead; lead = *src++; +#if SU_SCHEME + if ((lead & 3) < 3) + { + memcpy (&ch, src, sizeof(ch)); + src += sizeof(ch); + } +#else if (!(lead & 1)) { memcpy (&attrSet, src, sizeof(attrSet)); @@ -1263,15 +1331,18 @@ static void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno, memcpy (&attrUse, src, sizeof(attrUse)); src += sizeof(attrUse); } +#endif if (zh->key_buf_used + 1024 > (zh->ptr_top-zh->ptr_i)*sizeof(char*)) extract_flushWriteKeys (zh); ++(zh->ptr_i); (zh->key_buf)[zh->ptr_top - zh->ptr_i] = (char*)zh->key_buf + zh->key_buf_used; - +#if SU_SCHEME +#else ch = zebraExplain_lookupSU (zei, attrSet, attrUse); if (ch < 0) ch = zebraExplain_addSU (zei, attrSet, attrUse); +#endif assert (ch > 0); zh->key_buf_used += key_SU_code (ch,((char*)zh->key_buf) + zh->key_buf_used);