Change return type for a zebra_add_record + zebra_repository functions to
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 30 May 2006 13:21:13 +0000 (13:21 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 30 May 2006 13:21:13 +0000 (13:21 +0000)
be ZEBRA_RES rather than int. Split code in index/trav.c into two.

include/idzebra/api.h
index/Makefile.am
index/extract.c
index/index.h
index/trav.c [deleted file]
index/update_file.c [new file with mode: 0644]
index/update_path.c [new file with mode: 0644]
index/zebraapi.c
win/makefile

index e6ce250..19f2c16 100644 (file)
@@ -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, 
index d523188..4262ae5 100644 (file)
@@ -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
 
index 0432e60..a5a6f6b 100644 (file)
@@ -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
index f795daf..aa33cc5 100644 (file)
@@ -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 (file)
index 17f961d..0000000
+++ /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 <stdio.h>
-#include <assert.h>
-#include <sys/types.h>
-#ifdef WIN32
-#include <io.h>
-#define S_ISREG(x) (x & _S_IFREG)
-#define S_ISDIR(x) (x & _S_IFDIR)
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <direntz.h>
-#include <fcntl.h>
-#include <time.h>
-
-#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 (file)
index 0000000..59e331c
--- /dev/null
@@ -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 <stdio.h>
+#include <assert.h>
+#include <sys/types.h>
+#ifdef WIN32
+#include <io.h>
+#define S_ISREG(x) (x & _S_IFREG)
+#define S_ISDIR(x) (x & _S_IFDIR)
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <direntz.h>
+#include <fcntl.h>
+#include <time.h>
+
+#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 (file)
index 0000000..b4eec12
--- /dev/null
@@ -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 <stdio.h>
+#include <assert.h>
+#include <sys/types.h>
+#ifdef WIN32
+#include <io.h>
+#define S_ISREG(x) (x & _S_IFREG)
+#define S_ISDIR(x) (x & _S_IFDIR)
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <direntz.h>
+#include <fcntl.h>
+#include <time.h>
+
+#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
+ */
+
index ff4902f..33980ce 100644 (file)
@@ -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;
index 749d9e6..b05dc8f 100644 (file)
@@ -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 \