Towards GPL
[idzebra-moved-to-github.git] / index / trav.c
index b855ead..1143d1e 100644 (file)
-/*
- * Copyright (C) 1994-1999, Index Data
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: trav.c,v $
- * Revision 1.37  2002-02-20 17:30:01  adam
- * Work on new API. Locking system re-implemented
- *
- * Revision 1.36  1999/05/15 14:36:38  adam
- * Updated dictionary. Implemented "compression" of dictionary.
- *
- * Revision 1.35  1999/02/02 14:51:09  adam
- * Updated WIN32 code specific sections. Changed header.
- *
- * Revision 1.34  1998/06/08 14:43:14  adam
- * Added suport for EXPLAIN Proxy servers - added settings databasePath
- * and explainDatabase to facilitate this. Increased maximum number
- * of databases and attributes in one register.
- *
- * Revision 1.33  1998/01/12 15:04:08  adam
- * The test option (-s) only uses read-lock (and not write lock).
- *
- * Revision 1.32  1997/09/25 14:56:51  adam
- * Windows NT interface code to the stat call.
- *
- * Revision 1.31  1997/09/17 12:19:17  adam
- * Zebra version corresponds to YAZ version 1.4.
- * Changed Zebra server so that it doesn't depend on global common_resource.
- *
- * Revision 1.30  1997/09/09 13:38:09  adam
- * Partial port to WIN95/NT.
- *
- * Revision 1.29  1997/02/12 20:39:47  adam
- * Implemented options -f <n> that limits the log to the first <n>
- * records.
- * Changed some log messages also.
- *
- * Revision 1.28  1996/11/01 08:58:44  adam
- * Interface to isamc system now includes update and delete.
- *
- * Revision 1.27  1996/10/29 14:06:56  adam
- * Include zebrautl.h instead of alexutil.h.
- *
- * Revision 1.26  1996/06/04 10:19:01  adam
- * Minor changes - removed include of ctype.h.
- *
- * Revision 1.25  1996/05/01  13:46:37  adam
- * First work on multiple records in one file.
- * New option, -offset, to the "unread" command in the filter module.
- *
- * Revision 1.24  1996/04/26  10:00:23  adam
- * Added option -V to zebraidx to display version information.
- * Removed stupid warnings from file update.
- *
- * Revision 1.23  1996/04/12  07:02:25  adam
- * File update of single files.
- *
- * Revision 1.22  1996/04/09 06:50:50  adam
- * Bug fix: bad reference in function fileUpdateR.
- *
- * Revision 1.21  1996/03/22 15:34:18  quinn
- * Fixed bad reference
- *
- * Revision 1.20  1996/03/21  14:50:10  adam
- * File update uses modify-time instead of change-time.
- *
- * Revision 1.19  1996/03/20  16:16:55  quinn
- * Added diagnostic output
- *
- * Revision 1.18  1996/03/19  12:43:27  adam
- * Bug fix: File update traversal didn't handle trailing slashes correctly.
- * Bug fix: Update of sub directory groups wasn't handled correctly.
- *
- * Revision 1.17  1996/02/12  18:45:17  adam
- * Changed naming of some functions.
- *
- * Revision 1.16  1996/02/05  12:30:02  adam
- * Logging reduced a bit.
- * The remaining running time is estimated during register merge.
- *
- * Revision 1.15  1995/12/07  17:38:48  adam
- * Work locking mechanisms for concurrent updates/commit.
- *
- * Revision 1.14  1995/12/06  12:41:26  adam
- * New command 'stat' for the index program.
- * Filenames can be read from stdin by specifying '-'.
- * Bug fix/enhancement of the transformation from terms to regular
- * expressons in the search engine.
- *
- * Revision 1.13  1995/11/28  09:09:46  adam
- * Zebra config renamed.
- * Use setting 'recordId' to identify record now.
- * Bug fix in recindex.c: rec_release_blocks was invokeded even
- * though the blocks were already released.
- * File traversal properly deletes records when needed.
- *
- * Revision 1.12  1995/11/24  11:31:37  adam
- * Commands add & del read filenames from stdin if source directory is
- * empty.
- * Match criteria supports 'constant' strings.
- *
- * Revision 1.11  1995/11/22  17:19:19  adam
- * Record management uses the bfile system.
- *
- * Revision 1.10  1995/11/21  15:01:16  adam
- * New general match criteria implemented.
- * New feature: document groups.
- *
- * Revision 1.9  1995/11/21  09:20:32  adam
- * Yet more work on record match.
- *
- * Revision 1.8  1995/11/20  16:59:46  adam
- * New update method: the 'old' keys are saved for each records.
- *
- * Revision 1.7  1995/11/20  11:56:28  adam
- * Work on new traversal.
- *
- * Revision 1.6  1995/11/17  15:54:42  adam
- * Started work on virtual directory structure.
- *
- * Revision 1.5  1995/10/17  18:02:09  adam
- * New feature: databases. Implemented as prefix to words in dictionary.
- *
- * Revision 1.4  1995/09/28  09:19:46  adam
- * xfree/xmalloc used everywhere.
- * Extract/retrieve method seems to work for text records.
- *
- * Revision 1.3  1995/09/06  16:11:18  adam
- * Option: only one word key per file.
- *
- * Revision 1.2  1995/09/04  12:33:43  adam
- * Various cleanup. YAZ util used instead.
- *
- * Revision 1.1  1995/09/01  14:06:36  adam
- * Split of work into more files.
- *
- */
+/* $Id: trav.c,v 1.40 2002-08-02 19:26:55 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+   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 <time.h>
 
 #include "index.h"
-#include "zserver.h"
 
 static int repComp (const char *a, const char *b, size_t len)
 {
@@ -171,7 +55,7 @@ static void repositoryExtractR (ZebraHandle zh, int deleteFlag, char *rep,
     int i;
     size_t rep_len = strlen (rep);
 
-    e = dir_open (rep);
+    e = dir_open (rep, zh->path_reg);
     if (!e)
         return;
     logf (LOG_LOG, "dir %s", rep);
@@ -246,7 +130,7 @@ static void fileUpdateR (ZebraHandle zh,
     size_t src_len = strlen (src);
 
     sprintf (tmppath, "%s%s", base, src);
-    e_src = dir_open (tmppath);
+    e_src = dir_open (tmppath, zh->path_reg);
     logf (LOG_LOG, "dir %s", tmppath);
 
 #if 0
@@ -377,7 +261,7 @@ static void fileUpdateR (ZebraHandle zh,
     dir_free (&e_src);
 }
 
-static void groupRes (ZebraService zs, struct recordGroup *rGroup)
+static void groupRes (ZebraHandle zh, struct recordGroup *rGroup)
 {
     char resStr[256];
     char gPrefix[256];
@@ -388,10 +272,10 @@ static void groupRes (ZebraService zs, struct recordGroup *rGroup)
         sprintf (gPrefix, "%s.", rGroup->groupName);
 
     sprintf (resStr, "%srecordId", gPrefix);
-    rGroup->recordId = res_get (zs->res, resStr);
+    rGroup->recordId = res_get (zh->res, resStr);
     sprintf (resStr, "%sdatabasePath", gPrefix);
     rGroup->databaseNamePath =
-       atoi (res_get_def (zs->res, resStr, "0"));
+       atoi (res_get_def (zh->res, resStr, "0"));
 }
 
 void repositoryShow (ZebraHandle zh)
@@ -404,7 +288,7 @@ void repositoryShow (ZebraHandle zh)
     Dict dict;
     struct dirs_info *di;
     
-    if (!(dict = dict_open (zh->service->bfs, FMATCH_DICT, 50, 0, 0)))
+    if (!(dict = dict_open (zh->reg->bfs, FMATCH_DICT, 50, 0, 0)))
     {
         logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
        return;
@@ -439,10 +323,20 @@ static void fileUpdate (ZebraHandle zh,
     int src_len;
 
     assert (path);
+
+    if (zh->path_reg && !yaz_is_abspath(path))
+    {
+        strcpy (src, zh->path_reg);
+        strcat (src, "/");
+    }
+    else
+        *src = '\0';
+    strcat (src, path);
+    stat (src, &sbuf);
+
     strcpy (src, path);
     src_len = strlen (src);
 
-    stat (src, &sbuf);
     if (S_ISREG(sbuf.st_mode))
     {
         struct dirs_entry *e_dst;
@@ -490,9 +384,19 @@ static void repositoryExtract (ZebraHandle zh,
     char src[1024];
 
     assert (path);
-    strcpy (src, path);
 
+    if (zh->path_reg && !yaz_is_abspath(path))
+    {
+        strcpy (src, zh->path_reg);
+        strcat (src, "/");
+    }
+    else
+        *src = '\0';
+    strcat (src, path);
     stat (src, &sbuf);
+
+    strcpy (src, path);
+
     if (S_ISREG(sbuf.st_mode))
         fileExtract (zh, NULL, src, rGroup, deleteFlag);
     else if (S_ISDIR(sbuf.st_mode))
@@ -508,7 +412,7 @@ static void repositoryExtractG (ZebraHandle zh,
     {
         char src[1024];
 
-        while (scanf ("%s", src) == 1)
+        while (scanf ("%1020s", src) == 1)
             repositoryExtract (zh, deleteFlag, rGroup, src);
     }
     else
@@ -518,12 +422,12 @@ static void repositoryExtractG (ZebraHandle zh,
 void repositoryUpdate (ZebraHandle zh)
 {
     struct recordGroup *rGroup = &zh->rGroup;
-    groupRes (zh->service, rGroup);
+    groupRes (zh, rGroup);
     assert (rGroup->path);
     if (rGroup->recordId && !strcmp (rGroup->recordId, "file"))
     {
         Dict dict;
-        if (!(dict = dict_open (zh->service->bfs, FMATCH_DICT, 50,
+        if (!(dict = dict_open (zh->reg->bfs, FMATCH_DICT, 50,
                                rGroup->flagRw, 0)))
         {
             logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);