From: Adam Dickmeiss Date: Tue, 30 May 2006 13:21:13 +0000 (+0000) Subject: Change return type for a zebra_add_record + zebra_repository functions to X-Git-Tag: before.bug.529~94 X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=fc83d98d346711f446d9f9a29cc2ff0eee398053;p=idzebra-moved-to-github.git Change return type for a zebra_add_record + zebra_repository functions to be ZEBRA_RES rather than int. Split code in index/trav.c into two. --- diff --git a/include/idzebra/api.h b/include/idzebra/api.h index e6ce250..19f2c16 100644 --- a/include/idzebra/api.h +++ b/include/idzebra/api.h @@ -1,4 +1,4 @@ -/* $Id: api.h,v 1.34 2006-05-10 08:13:19 adam Exp $ +/* $Id: api.h,v 1.35 2006-05-30 13:21:13 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -391,11 +391,17 @@ ZEBRA_RES zebra_init(ZebraHandle zh); YAZ_EXPORT ZEBRA_RES zebra_compact(ZebraHandle zh); -YAZ_EXPORT int zebra_repository_update(ZebraHandle zh, const char *path); -YAZ_EXPORT int zebra_repository_delete(ZebraHandle zh, const char *path); -YAZ_EXPORT int zebra_repository_show(ZebraHandle zh, const char *path); +YAZ_EXPORT +ZEBRA_RES zebra_repository_update(ZebraHandle zh, const char *path); + +YAZ_EXPORT +ZEBRA_RES zebra_repository_delete(ZebraHandle zh, const char *path); -YAZ_EXPORT int zebra_add_record(ZebraHandle zh, const char *buf, int buf_size); +YAZ_EXPORT +ZEBRA_RES zebra_repository_show(ZebraHandle zh, const char *path); + +YAZ_EXPORT +ZEBRA_RES zebra_add_record(ZebraHandle zh, const char *buf, int buf_size); YAZ_EXPORT ZEBRA_RES zebra_insert_record(ZebraHandle zh, diff --git a/index/Makefile.am b/index/Makefile.am index d523188..4262ae5 100644 --- a/index/Makefile.am +++ b/index/Makefile.am @@ -1,4 +1,4 @@ -## $Id: Makefile.am,v 1.39 2006-05-10 09:11:22 adam Exp $ +## $Id: Makefile.am,v 1.40 2006-05-30 13:21:14 adam Exp $ noinst_PROGRAMS = apitest kdump @@ -16,7 +16,7 @@ libidzebra_api_la_SOURCES = \ rank.h rank1.c ranksimilarity.c rankstatic.c \ recindex.c recindex.h recindxp.h reckeys.c reckeys.h recstat.c retrieve.c \ sortidx.c symtab.c \ - trav.c trunc.c \ + update_path.c update_file.c trunc.c \ zebraapi.c zinfo.c zinfo.h zserver.h zsets.c zrpn.c \ zvrank.c diff --git a/index/extract.c b/index/extract.c index 0432e60..a5a6f6b 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,4 +1,4 @@ -/* $Id: extract.c,v 1.216 2006-05-19 23:20:24 adam Exp $ +/* $Id: extract.c,v 1.217 2006-05-30 13:21:14 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -1892,9 +1892,6 @@ void encode_key_init (struct encode_info *i) i->decode_handle = iscz1_start(); } -#define OLDENCODE 1 - -#ifdef OLDENCODE /* this is the old encode_key_write * may be deleted once we are confident that the new works * HL 15-oct-2002 @@ -1949,107 +1946,6 @@ void encode_key_flush (struct encode_info *i, FILE *outf) iscz1_stop(i->decode_handle); } -#else - -/* new encode_key_write - * The idea is to buffer one more key, and compare them - * If we are going to delete and insert the same key, - * we may as well not bother. Should make a difference in - * updates with small modifications (appending to a mbox) - */ -void encode_key_write (char *k, struct encode_info *i, FILE *outf) -{ - struct it_key key; - char *bp; - - if (*k) /* first time for new key */ - { - bp = i->buf; - while ((*bp++ = *k++)) - ; - i->keylen= bp - i->buf -1; - assert(i->keylen+1+sizeof(struct it_key) < ENCODE_BUFLEN); - } - else - { - bp=i->buf + i->keylen; - *bp++=0; - k++; - } - - memcpy (&key, k+1, sizeof(struct it_key)); - if (0==i->prevsys) /* no previous filter, fill up */ - { - i->prevsys=key.sysno; - i->prevseq=key.seqno; - i->prevcmd=*k; - } - else if ( (i->prevsys==key.sysno) && - (i->prevseq==key.seqno) && - (i->prevcmd!=*k) ) - { /* same numbers, diff cmd, they cancel out */ - i->prevsys=0; - } - else - { /* different stuff, write previous, move buf */ - bp = encode_key_int ( (i->prevsys - i->sysno) * 2 + i->prevcmd, bp); - if (i->sysno != i->prevsys) - { - i->sysno = i->prevsys; - i->seqno = 0; - } - else if (!i->seqno && !i->prevseq && i->cmd == i->prevcmd) - { - return; /* ??? Filters some sort of duplicates away */ - /* ??? Can this ever happen -H 15oct02 */ - } - bp = encode_key_int (i->prevseq - i->seqno, bp); - i->seqno = i->prevseq; - i->cmd = i->prevcmd; - if (fwrite (i->buf, bp - i->buf, 1, outf) != 1) - { - yaz_log (YLOG_FATAL|YLOG_ERRNO, "fwrite"); - exit (1); - } - i->keylen=0; /* ok, it's written, forget it */ - i->prevsys=key.sysno; - i->prevseq=key.seqno; - i->prevcmd=*k; - } -} - -void encode_key_flush (struct encode_info *i, FILE *outf) -{ /* flush the last key from i */ - char *bp =i->buf + i->keylen; - if (0==i->prevsys) - { - return; /* nothing to flush */ - } - *bp++=0; - bp = encode_key_int ( (i->prevsys - i->sysno) * 2 + i->prevcmd, bp); - if (i->sysno != i->prevsys) - { - i->sysno = i->prevsys; - i->seqno = 0; - } - else if (!i->seqno && !i->prevseq && i->cmd == i->prevcmd) - { - return; /* ??? Filters some sort of duplicates away */ - /* ??? Can this ever happen -H 15oct02 */ - } - bp = encode_key_int (i->prevseq - i->seqno, bp); - i->seqno = i->prevseq; - i->cmd = i->prevcmd; - if (fwrite (i->buf, bp - i->buf, 1, outf) != 1) - { - yaz_log (YLOG_FATAL|YLOG_ERRNO, "fwrite"); - exit (1); - } - i->keylen=0; /* ok, it's written, forget it */ - i->prevsys=0; /* forget the values too */ - i->prevseq=0; -} -#endif /* * Local variables: * c-basic-offset: 4 diff --git a/index/index.h b/index/index.h index f795daf..aa33cc5 100644 --- a/index/index.h +++ b/index/index.h @@ -1,4 +1,4 @@ -/* $Id: index.h,v 1.164 2006-05-19 23:45:29 adam Exp $ +/* $Id: index.h,v 1.165 2006-05-30 13:21:14 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -471,6 +471,10 @@ ZEBRA_RES zebra_sort_get_ord(ZebraHandle zh, int *ord, int *numerical); +ZEBRA_RES zebra_update_file_match(ZebraHandle zh, const char *path); +ZEBRA_RES zebra_update_from_path(ZebraHandle zh, const char *path); +ZEBRA_RES zebra_delete_from_path(ZebraHandle zh, const char *path); + YAZ_END_CDECL #endif diff --git a/index/trav.c b/index/trav.c deleted file mode 100644 index 17f961d..0000000 --- a/index/trav.c +++ /dev/null @@ -1,457 +0,0 @@ -/* $Id: trav.c,v 1.51 2006-05-10 08:13:22 adam Exp $ - Copyright (C) 1995-2005 - Index Data ApS - -This file is part of the Zebra server. - -Zebra is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -Zebra is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -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. -*/ - -#include -#include -#include -#ifdef WIN32 -#include -#define S_ISREG(x) (x & _S_IFREG) -#define S_ISDIR(x) (x & _S_IFDIR) -#endif -#if HAVE_UNISTD_H -#include -#endif -#include -#include -#include - -#include "index.h" - -static int repComp (const char *a, const char *b, size_t len) -{ - if (!len) - return 0; - return memcmp (a, b, len); -} - -static void repositoryExtractR (ZebraHandle zh, int deleteFlag, char *rep, - int level) -{ - struct dir_entry *e; - int i; - size_t rep_len = strlen (rep); - - e = dir_open (rep, zh->path_reg, zh->m_follow_links); - if (!e) - return; - yaz_log (YLOG_LOG, "dir %s", rep); - if (rep[rep_len-1] != '/') - rep[rep_len] = '/'; - else - --rep_len; - - for (i=0; e[i].name; i++) - { - char *ecp; - strcpy (rep +rep_len+1, e[i].name); - if ((ecp = strrchr (e[i].name, '/'))) - *ecp = '\0'; - - switch (e[i].kind) - { - case dirs_file: - zebra_extract_file (zh, NULL, rep, deleteFlag); - break; - case dirs_dir: - repositoryExtractR (zh, deleteFlag, rep, level+1); - break; - } - } - dir_free (&e); - -} - -static void fileDeleteR (ZebraHandle zh, - struct dirs_info *di, struct dirs_entry *dst, - const char *base, char *src) -{ - char tmppath[1024]; - size_t src_len = strlen (src); - - while (dst && !repComp (dst->path, src, src_len+1)) - { - switch (dst->kind) - { - case dirs_file: - sprintf (tmppath, "%s%s", base, dst->path); - zebra_extract_file (zh, &dst->sysno, tmppath, 1); - - strcpy (tmppath, dst->path); - dst = dirs_read (di); - dirs_del (di, tmppath); - break; - case dirs_dir: - strcpy (tmppath, dst->path); - dst = dirs_read (di); - dirs_rmdir (di, tmppath); - break; - default: - dst = dirs_read (di); - } - } -} - -static void fileUpdateR (ZebraHandle zh, - struct dirs_info *di, struct dirs_entry *dst, - const char *base, char *src, - int level) -{ - struct dir_entry *e_src; - int i_src = 0; - static char tmppath[1024]; - size_t src_len = strlen (src); - - sprintf (tmppath, "%s%s", base, src); - e_src = dir_open (tmppath, zh->path_reg, zh->m_follow_links); - yaz_log (YLOG_LOG, "dir %s", tmppath); - -#if 0 - if (!dst || repComp (dst->path, src, src_len)) -#else - if (!dst || strcmp (dst->path, src)) -#endif - { - if (!e_src) - return; - - if (src_len && src[src_len-1] != '/') - { - src[src_len] = '/'; - src[++src_len] = '\0'; - } - dirs_mkdir (di, src, 0); - if (dst && repComp (dst->path, src, src_len)) - dst = NULL; - } - else if (!e_src) - { - strcpy (src, dst->path); - fileDeleteR (zh, di, dst, base, src); - return; - } - else - { - if (src_len && src[src_len-1] != '/') - { - src[src_len] = '/'; - src[++src_len] = '\0'; - } - dst = dirs_read (di); - } - dir_sort (e_src); - - while (1) - { - int sd; - - if (dst && !repComp (dst->path, src, src_len)) - { - if (e_src[i_src].name) - { - yaz_log (YLOG_DEBUG, "dst=%s src=%s", dst->path + src_len, - e_src[i_src].name); - sd = strcmp (dst->path + src_len, e_src[i_src].name); - } - else - sd = -1; - } - else if (e_src[i_src].name) - sd = 1; - else - break; - yaz_log (YLOG_DEBUG, "trav sd=%d", sd); - - if (sd == 0) - { - strcpy (src + src_len, e_src[i_src].name); - sprintf (tmppath, "%s%s", base, src); - - switch (e_src[i_src].kind) - { - case dirs_file: - if (e_src[i_src].mtime > dst->mtime) - { - if (zebra_extract_file (zh, &dst->sysno, tmppath, 0) == ZEBRA_OK) - { - dirs_add (di, src, dst->sysno, e_src[i_src].mtime); - } - yaz_log (YLOG_DEBUG, "old: %s", ctime (&dst->mtime)); - yaz_log (YLOG_DEBUG, "new: %s", ctime (&e_src[i_src].mtime)); - } - dst = dirs_read (di); - break; - case dirs_dir: - fileUpdateR (zh, di, dst, base, src, level+1); - dst = dirs_last (di); - yaz_log (YLOG_DEBUG, "last is %s", dst ? dst->path : "null"); - break; - default: - dst = dirs_read (di); - } - i_src++; - } - else if (sd > 0) - { - SYSNO sysno = 0; - strcpy (src + src_len, e_src[i_src].name); - sprintf (tmppath, "%s%s", base, src); - - switch (e_src[i_src].kind) - { - case dirs_file: - if (zebra_extract_file (zh, &sysno, tmppath, 0) == ZEBRA_OK) - dirs_add (di, src, sysno, e_src[i_src].mtime); - break; - case dirs_dir: - fileUpdateR (zh, di, dst, base, src, level+1); - if (dst) - dst = dirs_last (di); - break; - } - i_src++; - } - else /* sd < 0 */ - { - strcpy (src, dst->path); - sprintf (tmppath, "%s%s", base, dst->path); - - switch (dst->kind) - { - case dirs_file: - zebra_extract_file (zh, &dst->sysno, tmppath, 1); - dirs_del (di, dst->path); - dst = dirs_read (di); - break; - case dirs_dir: - fileDeleteR (zh, di, dst, base, src); - dst = dirs_last (di); - } - } - } - dir_free (&e_src); -} - -void repositoryShow (ZebraHandle zh, const char *path) -{ - char src[1024]; - int src_len; - struct dirs_entry *dst; - Dict dict; - struct dirs_info *di; - - if (!(dict = dict_open_res (zh->reg->bfs, FMATCH_DICT, 50, 0, 0, zh->res))) - { - yaz_log (YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT); - return; - } - - strncpy(src, path, sizeof(src)-1); - src[sizeof(src)-1]='\0'; - src_len = strlen (src); - - if (src_len && src[src_len-1] != '/') - { - src[src_len] = '/'; - src[++src_len] = '\0'; - } - - di = dirs_open (dict, src, zh->m_flag_rw); - - while ( (dst = dirs_read (di)) ) - yaz_log (YLOG_LOG, "%s", dst->path); - dirs_free (&di); - dict_close (dict); -} - -static void fileUpdate (ZebraHandle zh, Dict dict, const char *path) -{ - struct dirs_info *di; - struct stat sbuf; - char src[1024]; - char dst[1024]; - int src_len, ret; - - assert (path); - - if (zh->path_reg && !yaz_is_abspath(path)) - { - strcpy (src, zh->path_reg); - strcat (src, "/"); - } - else - *src = '\0'; - strcat (src, path); - ret = zebra_file_stat (src, &sbuf, zh->m_follow_links); - - strcpy (src, path); - src_len = strlen (src); - - if (ret == -1) - { - yaz_log (YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src); - } - else if (S_ISREG(sbuf.st_mode)) - { - struct dirs_entry *e_dst; - di = dirs_fopen (dict, src, zh->m_flag_rw); - - e_dst = dirs_read (di); - if (e_dst) - { - if (sbuf.st_mtime > e_dst->mtime) - if (zebra_extract_file (zh, &e_dst->sysno, src, 0) == ZEBRA_OK) - dirs_add (di, src, e_dst->sysno, sbuf.st_mtime); - } - else - { - SYSNO sysno = 0; - if (zebra_extract_file (zh, &sysno, src, 0) == ZEBRA_OK) - dirs_add (di, src, sysno, sbuf.st_mtime); - } - dirs_free (&di); - } - else if (S_ISDIR(sbuf.st_mode)) - { - if (src_len && src[src_len-1] != '/') - { - src[src_len] = '/'; - src[++src_len] = '\0'; - } - di = dirs_open (dict, src, zh->m_flag_rw); - *dst = '\0'; - fileUpdateR (zh, di, dirs_read (di), src, dst, 0); - dirs_free (&di); - } - else - { - yaz_log (YLOG_WARN, "Skipping path %s", src); - } -} - -static void repositoryExtract (ZebraHandle zh, - int deleteFlag, const char *path) -{ - struct stat sbuf; - char src[1024]; - int ret; - - assert (path); - - if (zh->path_reg && !yaz_is_abspath(path)) - { - strcpy (src, zh->path_reg); - strcat (src, "/"); - } - else - *src = '\0'; - strcat (src, path); - ret = zebra_file_stat (src, &sbuf, zh->m_follow_links); - - strcpy (src, path); - - if (ret == -1) - yaz_log (YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src); - else if (S_ISREG(sbuf.st_mode)) - zebra_extract_file (zh, NULL, src, deleteFlag); - else if (S_ISDIR(sbuf.st_mode)) - repositoryExtractR (zh, deleteFlag, src, 0); - else - yaz_log (YLOG_WARN, "Skipping path %s", src); -} - -static void repositoryExtractG (ZebraHandle zh, const char *path, - int deleteFlag) -{ - if (!strcmp(path, "") || !strcmp(path, "-")) - { - char src[1024]; - - while (scanf ("%1020s", src) == 1) - repositoryExtract (zh, deleteFlag, src); - } - else - repositoryExtract (zh, deleteFlag, path); -} - -#if 0 -static int dump_file_dict_func(char *name, const char *info, int pos, - void *client) -{ - yaz_log(YLOG_LOG, "%s", name); - return 0; -} -static void dump_file_dict(Dict dict) -{ - int before = 10; - int after = 1000; - char term[1000]; - - strcpy(term, "0"); - dict_scan (dict, term, &before, &after, 0, dump_file_dict_func); -} -#endif - -void repositoryUpdate (ZebraHandle zh, const char *path) -{ - assert (path); - if (zh->m_record_id && !strcmp (zh->m_record_id, "file")) - { - Dict dict; - if (!(dict = dict_open_res (zh->reg->bfs, FMATCH_DICT, 50, - zh->m_flag_rw, 0, zh->res))) - { - yaz_log (YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT); - return ; - } - if (!strcmp(path, "") || !strcmp(path, "-")) - { - char src[1024]; - while (scanf ("%s", src) == 1) - fileUpdate (zh, dict, src); - } - else - fileUpdate (zh, dict, path); -#if 0 - dump_file_dict(dict); -#endif - dict_close (dict); - - } - else - repositoryExtractG (zh, path, 0); -} - -void repositoryDelete (ZebraHandle zh, const char *path) -{ - assert (path); - repositoryExtractG (zh, path, 1); -} - -/* - * Local variables: - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * vim: shiftwidth=4 tabstop=8 expandtab - */ - diff --git a/index/update_file.c b/index/update_file.c new file mode 100644 index 0000000..59e331c --- /dev/null +++ b/index/update_file.c @@ -0,0 +1,332 @@ +/* $Id: update_file.c,v 1.1 2006-05-30 13:21:16 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +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. +*/ + +#include +#include +#include +#ifdef WIN32 +#include +#define S_ISREG(x) (x & _S_IFREG) +#define S_ISDIR(x) (x & _S_IFDIR) +#endif +#if HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "index.h" + +#if 0 +static int dump_file_dict_func(char *name, const char *info, int pos, + void *client) +{ + yaz_log(YLOG_LOG, "%s", name); + return 0; +} +static void dump_file_dict(Dict dict) +{ + int before = 10; + int after = 1000; + char term[1000]; + + strcpy(term, "0"); + dict_scan (dict, term, &before, &after, 0, dump_file_dict_func); +} +#endif + +static int repComp (const char *a, const char *b, size_t len) +{ + if (!len) + return 0; + return memcmp (a, b, len); +} + +static void fileDelete_r(ZebraHandle zh, + struct dirs_info *di, struct dirs_entry *dst, + const char *base, char *src) +{ + char tmppath[1024]; + size_t src_len = strlen (src); + + while (dst && !repComp (dst->path, src, src_len+1)) + { + switch (dst->kind) + { + case dirs_file: + sprintf (tmppath, "%s%s", base, dst->path); + zebra_extract_file (zh, &dst->sysno, tmppath, 1); + + strcpy (tmppath, dst->path); + dst = dirs_read (di); + dirs_del (di, tmppath); + break; + case dirs_dir: + strcpy (tmppath, dst->path); + dst = dirs_read (di); + dirs_rmdir (di, tmppath); + break; + default: + dst = dirs_read (di); + } + } +} + +static void file_update_r(ZebraHandle zh, + struct dirs_info *di, struct dirs_entry *dst, + const char *base, char *src, + int level) +{ + struct dir_entry *e_src; + int i_src = 0; + static char tmppath[1024]; + size_t src_len = strlen (src); + + sprintf (tmppath, "%s%s", base, src); + e_src = dir_open (tmppath, zh->path_reg, zh->m_follow_links); + yaz_log (YLOG_LOG, "dir %s", tmppath); + +#if 0 + if (!dst || repComp (dst->path, src, src_len)) +#else + if (!dst || strcmp (dst->path, src)) +#endif + { + if (!e_src) + return; + + if (src_len && src[src_len-1] != '/') + { + src[src_len] = '/'; + src[++src_len] = '\0'; + } + dirs_mkdir (di, src, 0); + if (dst && repComp (dst->path, src, src_len)) + dst = NULL; + } + else if (!e_src) + { + strcpy (src, dst->path); + fileDelete_r(zh, di, dst, base, src); + return; + } + else + { + if (src_len && src[src_len-1] != '/') + { + src[src_len] = '/'; + src[++src_len] = '\0'; + } + dst = dirs_read (di); + } + dir_sort (e_src); + + while (1) + { + int sd; + + if (dst && !repComp (dst->path, src, src_len)) + { + if (e_src[i_src].name) + { + yaz_log (YLOG_DEBUG, "dst=%s src=%s", dst->path + src_len, + e_src[i_src].name); + sd = strcmp (dst->path + src_len, e_src[i_src].name); + } + else + sd = -1; + } + else if (e_src[i_src].name) + sd = 1; + else + break; + yaz_log (YLOG_DEBUG, "trav sd=%d", sd); + + if (sd == 0) + { + strcpy (src + src_len, e_src[i_src].name); + sprintf (tmppath, "%s%s", base, src); + + switch (e_src[i_src].kind) + { + case dirs_file: + if (e_src[i_src].mtime > dst->mtime) + { + if (zebra_extract_file (zh, &dst->sysno, tmppath, 0) == ZEBRA_OK) + { + dirs_add (di, src, dst->sysno, e_src[i_src].mtime); + } + yaz_log (YLOG_DEBUG, "old: %s", ctime (&dst->mtime)); + yaz_log (YLOG_DEBUG, "new: %s", ctime (&e_src[i_src].mtime)); + } + dst = dirs_read (di); + break; + case dirs_dir: + file_update_r(zh, di, dst, base, src, level+1); + dst = dirs_last (di); + yaz_log (YLOG_DEBUG, "last is %s", dst ? dst->path : "null"); + break; + default: + dst = dirs_read (di); + } + i_src++; + } + else if (sd > 0) + { + SYSNO sysno = 0; + strcpy (src + src_len, e_src[i_src].name); + sprintf (tmppath, "%s%s", base, src); + + switch (e_src[i_src].kind) + { + case dirs_file: + if (zebra_extract_file (zh, &sysno, tmppath, 0) == ZEBRA_OK) + dirs_add (di, src, sysno, e_src[i_src].mtime); + break; + case dirs_dir: + file_update_r(zh, di, dst, base, src, level+1); + if (dst) + dst = dirs_last (di); + break; + } + i_src++; + } + else /* sd < 0 */ + { + strcpy (src, dst->path); + sprintf (tmppath, "%s%s", base, dst->path); + + switch (dst->kind) + { + case dirs_file: + zebra_extract_file (zh, &dst->sysno, tmppath, 1); + dirs_del (di, dst->path); + dst = dirs_read (di); + break; + case dirs_dir: + fileDelete_r(zh, di, dst, base, src); + dst = dirs_last (di); + } + } + } + dir_free (&e_src); +} + +static void file_update_top(ZebraHandle zh, Dict dict, const char *path) +{ + struct dirs_info *di; + struct stat sbuf; + char src[1024]; + char dst[1024]; + int src_len, ret; + + assert (path); + + if (zh->path_reg && !yaz_is_abspath(path)) + { + strcpy (src, zh->path_reg); + strcat (src, "/"); + } + else + *src = '\0'; + strcat (src, path); + ret = zebra_file_stat (src, &sbuf, zh->m_follow_links); + + strcpy (src, path); + src_len = strlen (src); + + if (ret == -1) + { + yaz_log (YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src); + } + else if (S_ISREG(sbuf.st_mode)) + { + struct dirs_entry *e_dst; + di = dirs_fopen (dict, src, zh->m_flag_rw); + + e_dst = dirs_read (di); + if (e_dst) + { + if (sbuf.st_mtime > e_dst->mtime) + if (zebra_extract_file (zh, &e_dst->sysno, src, 0) == ZEBRA_OK) + dirs_add (di, src, e_dst->sysno, sbuf.st_mtime); + } + else + { + SYSNO sysno = 0; + if (zebra_extract_file (zh, &sysno, src, 0) == ZEBRA_OK) + dirs_add (di, src, sysno, sbuf.st_mtime); + } + dirs_free (&di); + } + else if (S_ISDIR(sbuf.st_mode)) + { + if (src_len && src[src_len-1] != '/') + { + src[src_len] = '/'; + src[++src_len] = '\0'; + } + di = dirs_open (dict, src, zh->m_flag_rw); + *dst = '\0'; + file_update_r(zh, di, dirs_read (di), src, dst, 0); + dirs_free (&di); + } + else + { + yaz_log (YLOG_WARN, "Skipping path %s", src); + } +} + +ZEBRA_RES zebra_update_file_match(ZebraHandle zh, const char *path) +{ + Dict dict; + if (!(dict = dict_open_res (zh->reg->bfs, FMATCH_DICT, 50, + zh->m_flag_rw, 0, zh->res))) + { + yaz_log (YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT); + return ZEBRA_FAIL; + } + if (!strcmp(path, "") || !strcmp(path, "-")) + { + char src[1024]; + while (scanf ("%s", src) == 1) + file_update_top(zh, dict, src); + } + else + file_update_top(zh, dict, path); +#if 0 + dump_file_dict(dict); +#endif + dict_close (dict); + return ZEBRA_OK; +} + + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ + diff --git a/index/update_path.c b/index/update_path.c new file mode 100644 index 0000000..b4eec12 --- /dev/null +++ b/index/update_path.c @@ -0,0 +1,175 @@ +/* $Id: update_path.c,v 1.1 2006-05-30 13:21:16 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +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. +*/ + +#include +#include +#include +#ifdef WIN32 +#include +#define S_ISREG(x) (x & _S_IFREG) +#define S_ISDIR(x) (x & _S_IFDIR) +#endif +#if HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "index.h" + +static void repositoryExtractR(ZebraHandle zh, int deleteFlag, char *rep, + int level) +{ + struct dir_entry *e; + int i; + size_t rep_len = strlen (rep); + + e = dir_open (rep, zh->path_reg, zh->m_follow_links); + if (!e) + return; + yaz_log (YLOG_LOG, "dir %s", rep); + if (rep[rep_len-1] != '/') + rep[rep_len] = '/'; + else + --rep_len; + + for (i=0; e[i].name; i++) + { + char *ecp; + strcpy (rep +rep_len+1, e[i].name); + if ((ecp = strrchr (e[i].name, '/'))) + *ecp = '\0'; + + switch (e[i].kind) + { + case dirs_file: + zebra_extract_file (zh, NULL, rep, deleteFlag); + break; + case dirs_dir: + repositoryExtractR (zh, deleteFlag, rep, level+1); + break; + } + } + dir_free (&e); + +} + +void repositoryShow(ZebraHandle zh, const char *path) +{ + char src[1024]; + int src_len; + struct dirs_entry *dst; + Dict dict; + struct dirs_info *di; + + if (!(dict = dict_open_res (zh->reg->bfs, FMATCH_DICT, 50, 0, 0, zh->res))) + { + yaz_log (YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT); + return; + } + + strncpy(src, path, sizeof(src)-1); + src[sizeof(src)-1]='\0'; + src_len = strlen (src); + + if (src_len && src[src_len-1] != '/') + { + src[src_len] = '/'; + src[++src_len] = '\0'; + } + + di = dirs_open (dict, src, zh->m_flag_rw); + + while ( (dst = dirs_read (di)) ) + yaz_log (YLOG_LOG, "%s", dst->path); + dirs_free (&di); + dict_close (dict); +} + +static void repositoryExtract(ZebraHandle zh, + int deleteFlag, const char *path) +{ + struct stat sbuf; + char src[1024]; + int ret; + + assert (path); + + if (zh->path_reg && !yaz_is_abspath(path)) + { + strcpy (src, zh->path_reg); + strcat (src, "/"); + } + else + *src = '\0'; + strcat (src, path); + ret = zebra_file_stat (src, &sbuf, zh->m_follow_links); + + strcpy (src, path); + + if (ret == -1) + yaz_log (YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src); + else if (S_ISREG(sbuf.st_mode)) + zebra_extract_file (zh, NULL, src, deleteFlag); + else if (S_ISDIR(sbuf.st_mode)) + repositoryExtractR (zh, deleteFlag, src, 0); + else + yaz_log (YLOG_WARN, "Skipping path %s", src); +} + +static void repositoryExtractG(ZebraHandle zh, const char *path, + int deleteFlag) +{ + if (!strcmp(path, "") || !strcmp(path, "-")) + { + char src[1024]; + + while (scanf("%1020s", src) == 1) + repositoryExtract(zh, deleteFlag, src); + } + else + repositoryExtract(zh, deleteFlag, path); +} + +ZEBRA_RES zebra_update_from_path(ZebraHandle zh, const char *path) +{ + assert (path); + repositoryExtractG(zh, path, 0); + return ZEBRA_OK; +} + +ZEBRA_RES zebra_delete_from_path(ZebraHandle zh, const char *path) +{ + assert (path); + repositoryExtractG(zh, path, 1); + return ZEBRA_OK; +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ + diff --git a/index/zebraapi.c b/index/zebraapi.c index ff4902f..33980ce 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,5 +1,5 @@ -/* $Id: zebraapi.c,v 1.218 2006-05-18 12:03:05 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: zebraapi.c,v 1.219 2006-05-30 13:21:16 adam Exp $ + Copyright (C) 1995-2006 Index Data ApS This file is part of the Zebra server. @@ -576,7 +576,7 @@ ZEBRA_RES zebra_stop(ZebraService zs) return ZEBRA_OK; } -ZEBRA_RES zebra_close (ZebraHandle zh) +ZEBRA_RES zebra_close(ZebraHandle zh) { ZebraService zs; struct zebra_session **sp; @@ -1934,31 +1934,33 @@ ZEBRA_RES zebra_end_transaction (ZebraHandle zh, ZebraTransactionStatus *status) return ZEBRA_OK; } -int zebra_repository_update (ZebraHandle zh, const char *path) +ZEBRA_RES zebra_repository_update(ZebraHandle zh, const char *path) { ASSERTZH; assert(path); yaz_log (log_level, "updating %s", path); - repositoryUpdate (zh, path); - return 0; + + if (zh->m_record_id && !strcmp (zh->m_record_id, "file")) + return zebra_update_file_match(zh, path); + else + return zebra_update_from_path(zh, path); } -int zebra_repository_delete (ZebraHandle zh, const char *path) +ZEBRA_RES zebra_repository_delete(ZebraHandle zh, const char *path) { ASSERTZH; assert(path); yaz_log (log_level, "deleting %s", path); - repositoryDelete (zh, path); - return 0; + return zebra_delete_from_path(zh, path); } -int zebra_repository_show (ZebraHandle zh, const char *path) +ZEBRA_RES zebra_repository_show(ZebraHandle zh, const char *path) { ASSERTZH; assert(path); yaz_log(log_level, "zebra_repository_show"); repositoryShow (zh, path); - return 0; + return ZEBRA_OK; } static ZEBRA_RES zebra_commit_ex(ZebraHandle zh, int clean_only) @@ -2196,38 +2198,17 @@ void zebra_set_shadow_enable (ZebraHandle zh, int value) zh->shadow_enable = value; } -/* Used by Perl API.. Added the record buffer dup to zebra_records_retrieve - so that it's identicical to the original api_records_retrieve */ -void api_records_retrieve (ZebraHandle zh, ODR stream, - const char *setname, Z_RecordComposition *comp, - oid_value input_format, int num_recs, - ZebraRetrievalRecord *recs) -{ - zebra_records_retrieve(zh, stream, setname, comp, input_format, - num_recs, recs); -} - -/* --------------------------------------------------------------------------- - Record insert(=update), delete - - If sysno is provided, then it's used to identify the record. - If not, and match_criteria is provided, then sysno is guessed - If not, and a record is provided, then sysno is got from there -NOTE: Now returns 0 at success and updates sysno, which is an int* - 20-jun-2003 Heikki -*/ - -int zebra_add_record(ZebraHandle zh, - const char *buf, int buf_size) +ZEBRA_RES zebra_add_record(ZebraHandle zh, + const char *buf, int buf_size) { return zebra_update_record(zh, 0, 0 /* sysno */, 0, 0, buf, buf_size, 0); } -ZEBRA_RES zebra_insert_record (ZebraHandle zh, - const char *recordType, - SYSNO *sysno, const char *match, - const char *fname, - const char *buf, int buf_size, int force_update) +ZEBRA_RES zebra_insert_record(ZebraHandle zh, + const char *recordType, + SYSNO *sysno, const char *match, + const char *fname, + const char *buf, int buf_size, int force_update) { ZEBRA_RES res; ASSERTZH; diff --git a/win/makefile b/win/makefile index 749d9e6..b05dc8f 100644 --- a/win/makefile +++ b/win/makefile @@ -1,5 +1,5 @@ # Zebra makefile for MS NMAKE -# $Id: makefile,v 1.47 2006-05-19 17:33:18 adam Exp $ +# $Id: makefile,v 1.48 2006-05-30 13:21:21 adam Exp $ ########################################################### ############### Parameters @@ -419,7 +419,8 @@ ZEBRALIB_OBJS= \ $(OBJDIR)\sortidx.obj \ $(OBJDIR)\states.obj \ $(OBJDIR)\symtab.obj \ - $(OBJDIR)\trav.obj \ + $(OBJDIR)\update_path.obj \ + $(OBJDIR)\update_file.obj \ $(OBJDIR)\trunc.obj \ $(OBJDIR)\xmlread.obj \ $(OBJDIR)\xpath.obj \