X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=index%2Fzebraapi.c;h=711dbc5bba9ba3fb9ca235a8c1c2ef501c4ad40a;hb=11a23e22fd9b87344dd1e2b37ce6898b8225d5b3;hp=ae04ebefa921b37627b0fea6459686d7a43ca5b4;hpb=54da2f13bc20e4369757453575668339c8dfd9fd;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index ae04ebe..711dbc5 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.69 2002-08-29 08:47:08 adam Exp $ +/* $Id: zebraapi.c,v 1.82 2003-02-11 14:01:39 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -84,7 +84,7 @@ ZebraHandle zebra_open (ZebraService zs) zh->destroyed = 0; zh->errCode = 0; zh->errString = 0; - zh->res = 0; + zh->res = 0; zh->reg_name = xstrdup (""); zh->path_reg = 0; @@ -193,7 +193,8 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, } if (useshadow) bf_cache (reg->bfs, res_get (res, "shadow")); - data1_set_tabpath (reg->dh, res_get(res, "profilePath")); + data1_set_tabpath (reg->dh, res_get_def(res, "profilePath", + DEFAULT_PROFILE_PATH)); data1_set_tabroot (reg->dh, reg_path); reg->recTypes = recTypes_init (reg->dh); recTypes_default_handlers (reg->recTypes); @@ -217,6 +218,7 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name, reg->isamb = 0; reg->zei = 0; reg->matchDict = 0; + reg->key_file_no = 0; zebraRankInstall (reg, rank1_class); @@ -389,14 +391,11 @@ void zebra_stop(ZebraService zs) return ; yaz_log (LOG_LOG, "zebra_stop"); - 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 (&zs->session_lock); if (zs->passwd_db) @@ -449,8 +448,6 @@ void zebra_close (ZebraHandle zh) } sp = &(*sp)->next; } -// if (!zs->sessions && zs->stop_flag) -// zebra_register_deactivate(zs); zebra_mutex_cond_unlock (&zs->session_lock); xfree (zh->reg_name); xfree (zh); @@ -574,7 +571,7 @@ void map_basenames_func (void *vp, const char *name, const char *value) return ; no--; for (i = 0; inum_bases; i++) - if (p->basenames[i] && !strcmp (p->basenames[i], fromdb)) + if (p->basenames[i] && !STRCASECMP (p->basenames[i], fromdb)) { p->basenames[i] = 0; for (i = 0; i < no; i++) @@ -837,17 +834,23 @@ int zebra_deleleResultSet(ZebraHandle zh, int function, int zebra_errCode (ZebraHandle zh) { - return zh->errCode; + if (zh) + return zh->errCode; + return 0; /* is this the right thing to return ?*/ } const char *zebra_errString (ZebraHandle zh) { - return diagbib1_str (zh->errCode); + if (zh) + return diagbib1_str (zh->errCode); + return ""; } char *zebra_errAdd (ZebraHandle zh) { - return zh->errString; + if (zh) + return zh->errString; + return ""; } int zebra_auth (ZebraHandle zh, const char *user, const char *pass) @@ -863,8 +866,11 @@ int zebra_auth (ZebraHandle zh, const char *user, const char *pass) return 1; } -void zebra_admin_import_begin (ZebraHandle zh, const char *database) +void zebra_admin_import_begin (ZebraHandle zh, const char *database, + const char *record_type) { + if (zebra_select_database(zh, database)) + return; zebra_begin_trans (zh); xfree (zh->admin_databaseName); zh->admin_databaseName = xstrdup(database); @@ -911,10 +917,54 @@ void zebra_admin_import_segment (ZebraHandle zh, Z_Segment *segment) } } +int zebra_admin_exchange_record (ZebraHandle zh, + const char *database, + const char *rec_buf, + size_t rec_len, + const char *recid_buf, size_t recid_len, + int action) +{ + int sysno = 0; + char *rinfo = 0; + char recid_z[256]; + + if (!recid_buf || recid_len <= 0 || recid_len >= sizeof(recid_z)) + return -1; + memcpy (recid_z, recid_buf, recid_len); + recid_z[recid_len] = 0; + + rinfo = dict_lookup (zh->reg->matchDict, recid_z); + if (rinfo) + { + if (action == 1) /* fail if insert */ + return -1; + memcpy (&sysno, rinfo+1, sizeof(sysno)); + } + else + { + if (action == 2 || action == 3) /* fail if delete or update */ + return -1; + } + extract_rec_in_mem (zh, "grs.sgml", rec_buf, rec_len, database, + action == 3 ? 1 : 0 /* delete flag */, + 0, &sysno, 1, 1, 0); + if (action == 1) + { + dict_insert (zh->reg->matchDict, recid_z, sizeof(sysno), &sysno); + } + else if (action == 3) + { + dict_delete (zh->reg->matchDict, recid_z); + } + return 0; +} + void zebra_admin_create (ZebraHandle zh, const char *database) { ZebraService zs; + if (zebra_select_database (zh, database)) + return; zebra_begin_trans (zh); zs = zh->service; @@ -923,7 +973,7 @@ void zebra_admin_create (ZebraHandle zh, const char *database) /* explainDatabase */)) { zh->errCode = 224; - zh->errString = "Database already exist"; + zh->errString = "database already exist"; } zebra_end_trans (zh); } @@ -959,7 +1009,7 @@ void zebra_set_state (ZebraHandle zh, int val, int seqno) fname = zebra_mk_fname (res_get(zh->res, "lockDir"), state_fname); f = fopen (fname, "w"); - yaz_log (LOG_LOG, "%c %d %ld", val, seqno, p); + yaz_log (LOG_DEBUG, "%c %d %ld", val, seqno, p); fprintf (f, "%c %d %ld\n", val, seqno, p); fclose (f); xfree (fname); @@ -1180,7 +1230,6 @@ void zebra_end_trans (ZebraHandle zh) zebra_register_close (zh->service, zh->reg); zh->reg = 0; - yaz_log (LOG_LOG, "Records: %7d i/u/d %d/%d/%d", zh->records_processed, zh->records_inserted, zh->records_updated, zh->records_deleted); @@ -1211,10 +1260,8 @@ void zebra_end_trans (ZebraHandle zh) void zebra_repository_update (ZebraHandle zh) { - zebra_begin_trans (zh); logf (LOG_LOG, "updating %s", zh->rGroup.path); repositoryUpdate (zh); - zebra_end_trans (zh); } void zebra_repository_delete (ZebraHandle zh) @@ -1355,6 +1402,39 @@ void zebra_shadow_enable (ZebraHandle zh, int value) int zebra_record_encoding (ZebraHandle zh, const char *encoding) { xfree (zh->record_encoding); + + /* + * Fixme! + */ + + if (zh->iconv_to_utf8 != 0) + yaz_iconv_close(zh->iconv_to_utf8); + if (zh->iconv_from_utf8 != 0) + yaz_iconv_close(zh->iconv_from_utf8); + zh->record_encoding = xstrdup (encoding); + + logf(LOG_DEBUG, "Reset record encoding: %s", encoding); + + zh->iconv_to_utf8 = + yaz_iconv_open ("UTF-8", encoding); + if (zh->iconv_to_utf8 == 0) + yaz_log (LOG_WARN, "iconv: %s to UTF-8 unsupported", encoding); + zh->iconv_from_utf8 = + yaz_iconv_open (encoding, "UTF-8"); + if (zh->iconv_to_utf8 == 0) + yaz_log (LOG_WARN, "iconv: UTF-8 to %s unsupported", encoding); + return 0; } + +void zebra_set_resource(ZebraHandle zh, const char *name, const char *value) +{ + res_put(zh->res, name, value); +} + +const char *zebra_get_resource(ZebraHandle zh, + const char *name, const char *defaultvalue) +{ + return res_get_def( zh->res, name, (char *)defaultvalue); +}