Updated WIN32 code specific sections. Changed header.
[idzebra-moved-to-github.git] / index / trav.c
index c4d2f2d..fec9d6a 100644 (file)
@@ -1,10 +1,21 @@
 /*
- * Copyright (C) 1994-1997, Index Data I/S 
+ * Copyright (C) 1994-1999, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: trav.c,v $
- * Revision 1.32  1997-09-25 14:56:51  adam
+ * 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
 #include <assert.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#ifdef WINDOWS
+#ifdef WIN32
 #include <io.h>
 #define S_ISREG(x) (x & _S_IFREG)
 #define S_ISDIR(x) (x & _S_IFDIR)
@@ -146,7 +157,8 @@ static int repComp (const char *a, const char *b, size_t len)
 }
 
 static void repositoryExtractR (int deleteFlag, char *rep,
-                                struct recordGroup *rGroup)
+                                struct recordGroup *rGroup,
+                               int level)
 {
     struct dir_entry *e;
     int i;
@@ -160,16 +172,23 @@ static void repositoryExtractR (int deleteFlag, char *rep,
         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';
+       if (level == 0 && rGroup->databaseNamePath)
+           rGroup->databaseName = e[i].name;
+
         switch (e[i].kind)
         {
         case dirs_file:
             fileExtract (NULL, rep, rGroup, deleteFlag);
             break;
         case dirs_dir:
-            repositoryExtractR (deleteFlag, rep, rGroup);
+            repositoryExtractR (deleteFlag, rep, rGroup, level+1);
             break;
         }
     }
@@ -208,8 +227,9 @@ static void fileDeleteR (struct dirs_info *di, struct dirs_entry *dst,
 }
 
 static void fileUpdateR (struct dirs_info *di, struct dirs_entry *dst,
-                               const char *base, char *src, 
-                               struct recordGroup *rGroup)
+                        const char *base, char *src, 
+                        struct recordGroup *rGroup,
+                        int level)
 {
     struct dir_entry *e_src;
     int i_src = 0;
@@ -275,6 +295,9 @@ static void fileUpdateR (struct dirs_info *di, struct dirs_entry *dst,
         else
             break;
         logf (LOG_DEBUG, "trav sd=%d", sd);
+
+       if (level == 0 && rGroup->databaseNamePath)
+           rGroup->databaseName = e_src[i_src].name;
         if (sd == 0)
         {
             strcpy (src + src_len, e_src[i_src].name);
@@ -295,7 +318,7 @@ static void fileUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                 dst = dirs_read (di);
                 break;
             case dirs_dir:
-                fileUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup, level+1);
                 dst = dirs_last (di);
                 logf (LOG_DEBUG, "last is %s", dst ? dst->path : "null");
                 break;
@@ -317,7 +340,7 @@ static void fileUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                     dirs_add (di, src, sysno, e_src[i_src].mtime);            
                 break;
             case dirs_dir:
-                fileUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup, level+1);
                 if (dst)
                     dst = dirs_last (di);
                 break;
@@ -357,6 +380,9 @@ static void groupRes (struct recordGroup *rGroup)
 
     sprintf (resStr, "%srecordId", gPrefix);
     rGroup->recordId = res_get (common_resource, resStr);
+    sprintf (resStr, "%sdatabasePath", gPrefix);
+    rGroup->databaseNamePath =
+       atoi (res_get_def (common_resource, resStr, "0"));
 }
 
 void repositoryShow (struct recordGroup *rGroup)
@@ -367,10 +393,10 @@ void repositoryShow (struct recordGroup *rGroup)
     Dict dict;
     struct dirs_info *di;
     
-    if (!(dict = dict_open (rGroup->bfs, FMATCH_DICT, 50, 1)))
+    if (!(dict = dict_open (rGroup->bfs, FMATCH_DICT, 50, 0)))
     {
         logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
-        exit (1);
+       return;
     }
     
     assert (rGroup->path);    
@@ -383,7 +409,7 @@ void repositoryShow (struct recordGroup *rGroup)
         src[++src_len] = '\0';
     }
     
-    di = dirs_open (dict, src);
+    di = dirs_open (dict, src, rGroup->flagRw);
     
     while ( (dst = dirs_read (di)) )
         logf (LOG_LOG, "%s", dst->path);
@@ -432,14 +458,14 @@ static void fileUpdate (Dict dict, struct recordGroup *rGroup,
             src[src_len] = '/';
             src[++src_len] = '\0';
         }
-        di = dirs_open (dict, src);
+        di = dirs_open (dict, src, rGroup->flagRw);
         *dst = '\0';
-        fileUpdateR (di, dirs_read (di), src, dst, rGroup);
+        fileUpdateR (di, dirs_read (di), src, dst, rGroup, 0);
         dirs_free (&di);
     }
     else
     {
-        logf (LOG_WARN, "Cannot handle file %s", src);
+        logf (LOG_WARN, "Ignoring path %s", src);
     }
 }
 
@@ -457,9 +483,9 @@ static void repositoryExtract (int deleteFlag, struct recordGroup *rGroup,
     if (S_ISREG(sbuf.st_mode))
         fileExtract (NULL, src, rGroup, deleteFlag);
     else if (S_ISDIR(sbuf.st_mode))
-       repositoryExtractR (deleteFlag, src, rGroup);
+       repositoryExtractR (deleteFlag, src, rGroup, 0);
     else
-        logf (LOG_WARN, "Cannot handle file %s", src);
+        logf (LOG_WARN, "Ignoring path %s", src);
 }
 
 static void repositoryExtractG (int deleteFlag, struct recordGroup *rGroup)
@@ -482,10 +508,10 @@ void repositoryUpdate (struct recordGroup *rGroup)
     if (rGroup->recordId && !strcmp (rGroup->recordId, "file"))
     {
         Dict dict;
-        if (!(dict = dict_open (rGroup->bfs, FMATCH_DICT, 50, 1)))
+        if (!(dict = dict_open (rGroup->bfs, FMATCH_DICT, 50, rGroup->flagRw)))
         {
             logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
-            exit (1);
+           return ;
         }
         if (*rGroup->path == '\0' || !strcmp(rGroup->path, "-"))
         {