Fixed bad reference
[idzebra-moved-to-github.git] / index / trav.c
index d055ad5..b926841 100644 (file)
@@ -4,7 +4,36 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: trav.c,v $
- * Revision 1.13  1995-11-28 09:09:46  adam
+ * 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
@@ -60,6 +89,7 @@
 #include <sys/types.h>
 #include <fcntl.h>
 #include <ctype.h>
+#include <time.h>
 
 #include <alexutil.h>
 #include "index.h"
@@ -81,6 +111,7 @@ static void repositoryExtractR (int deleteFlag, char *rep,
     e = dir_open (rep);
     if (!e)
         return;
+    logf (LOG_LOG, "Dir: %s", rep);
     if (rep[rep_len-1] != '/')
         rep[rep_len] = '/';
     else
@@ -104,18 +135,18 @@ static void repositoryExtractR (int deleteFlag, char *rep,
 
 static void stdinExtractR (int deleteFlag, struct recordGroup *rGroup)
 {
-    char tmppath[256];
+    char tmppath[1024];
 
     logf (LOG_LOG, "stdinExtractR");
     while (scanf ("%s", tmppath) == 1)
         fileExtract (NULL, tmppath, rGroup, deleteFlag);
 }
 
-static void repositoryDeleteR (struct dirs_info *di, struct dirs_entry *dst,
+static void fileDeleteR (struct dirs_info *di, struct dirs_entry *dst,
                               const char *base, char *src,
                               struct recordGroup *rGroup)
 {
-    char tmppath[256];
+    char tmppath[1024];
     size_t src_len = strlen (src);
 
     while (dst && !repComp (dst->path, src, src_len+1))
@@ -141,19 +172,20 @@ static void repositoryDeleteR (struct dirs_info *di, struct dirs_entry *dst,
     }
 }
 
-static void repositoryUpdateR (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)
 {
     struct dir_entry *e_src;
     int i_src = 0;
-    static char tmppath[256];
+    static char tmppath[1024];
     size_t src_len = strlen (src);
 
     sprintf (tmppath, "%s%s", base, src);
     e_src = dir_open (tmppath);
+    logf (LOG_LOG, "Dir: %s", tmppath);
 
-#if 1
+#if 0
     if (!dst || repComp (dst->path, src, src_len))
 #else
     if (!dst || strcmp (dst->path, src))
@@ -161,27 +193,29 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
     {
         if (!e_src)
             return;
-        if (src_len && src[src_len-1] == '/')
-            --src_len;
-        else
+
+        if (src_len && src[src_len-1] != '/')
+        {
             src[src_len] = '/';
-        src[src_len+1] = '\0';
+            src[++src_len] = '\0';
+        }
         dirs_mkdir (di, src, 0);
-        dst = NULL;
+        if (repComp (dst->path, src, src_len))
+            dst = NULL;
     }
     else if (!e_src)
     {
         strcpy (src, dst->path);
-        repositoryDeleteR (di, dst, base, src, rGroup);
+        fileDeleteR (di, dst, base, src, rGroup);
         return;
     }
     else
     {
-        if (src_len && src[src_len-1] == '/')
-            --src_len;
-        else
+        if (src_len && src[src_len-1] != '/')
+        {
             src[src_len] = '/';
-        src[src_len+1] = '\0';
+            src[++src_len] = '\0';
+        }
         dst = dirs_read (di); 
     }
     dir_sort (e_src);
@@ -190,13 +224,13 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
     {
         int sd;
 
-        if (dst && !repComp (dst->path, src, src_len+1))
+        if (dst && !repComp (dst->path, src, src_len))
         {
             if (e_src[i_src].name)
             {
-                logf (LOG_DEBUG, "dst=%s src=%s", dst->path + src_len+1, 
+                logf (LOG_DEBUG, "dst=%s src=%s", dst->path + src_len,
                      e_src[i_src].name);
-                sd = strcmp (dst->path + src_len+1, e_src[i_src].name);
+                sd = strcmp (dst->path + src_len, e_src[i_src].name);
             }
             else
                 sd = -1;
@@ -208,24 +242,25 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
         logf (LOG_DEBUG, "trav sd=%d", sd);
         if (sd == 0)
         {
-            strcpy (src + src_len+1, e_src[i_src].name);
+            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].ctime > dst->ctime)
+                if (e_src[i_src].mtime > dst->mtime)
                 {
                     if (fileExtract (&dst->sysno, tmppath, rGroup, 0))
                     {
-                        logf (LOG_LOG, "dirs_add");
-                        dirs_add (di, src, dst->sysno, e_src[i_src].ctime);
+                        dirs_add (di, src, dst->sysno, e_src[i_src].mtime);
                     }
+                   logf (LOG_LOG, "old: %s", ctime (&dst->mtime));
+                    logf (LOG_LOG, "new: %s", ctime (&e_src[i_src].mtime));
                 }
                 dst = dirs_read (di);
                 break;
             case dirs_dir:
-                repositoryUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup);
                 dst = dirs_last (di);
                 logf (LOG_DEBUG, "last is %s", dst ? dst->path : "null");
                 break;
@@ -237,17 +272,17 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
         else if (sd > 0)
         {
             SYSNO sysno = 0;
-            strcpy (src + src_len+1, e_src[i_src].name);
+            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 (fileExtract (&sysno, tmppath, rGroup, 0))
-                    dirs_add (di, src, sysno, e_src[i_src].ctime);            
+                    dirs_add (di, src, sysno, e_src[i_src].mtime);            
                 break;
             case dirs_dir:
-                repositoryUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup);
                 if (dst)
                     dst = dirs_last (di);
                 break;
@@ -267,7 +302,7 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                 dst = dirs_read (di);
                 break;
             case dirs_dir:
-                repositoryDeleteR (di, dst, base, src, rGroup);
+                fileDeleteR (di, dst, base, src, rGroup);
                 dst = dirs_last (di);
             }
         }
@@ -289,9 +324,44 @@ static void groupRes (struct recordGroup *rGroup)
     rGroup->recordId = res_get (common_resource, resStr);
 }
 
+
+void repositoryShow (struct recordGroup *rGroup)
+{
+    char src[1024];
+    int src_len;
+    struct dirs_entry *dst;
+    Dict dict;
+    struct dirs_info *di;
+    
+    if (!(dict = dict_open (FMATCH_DICT, 50, 1)))
+    {
+        logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
+        exit (1);
+    }
+    
+    assert (rGroup->path);    
+    strcpy (src, rGroup->path);
+    src_len = strlen (src);
+    
+    if (src_len && src[src_len-1] != '/')
+    {
+        src[src_len] = '/';
+        src[++src_len] = '\0';
+    }
+    
+    di = dirs_open (dict, src);
+    
+    while ( (dst = dirs_read (di)) )
+        logf (LOG_LOG, "%s", dst->path);
+    dirs_free (&di);
+    dict_close (dict);
+}
+
 void repositoryUpdate (struct recordGroup *rGroup)
 {
-    char src[256];
+    char src[1024];
+    char dst[1024];
+    int src_len;
 
     groupRes (rGroup);
     if (rGroup->recordId && !strcmp (rGroup->recordId, "file"))
@@ -299,19 +369,33 @@ void repositoryUpdate (struct recordGroup *rGroup)
         Dict dict;
         struct dirs_info *di;
 
-        dict = dict_open ("repdict", 40, 1);
-
+        if (!(dict = dict_open (FMATCH_DICT, 50, 1)))
+        {
+            logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
+            exit (1);
+        }
         assert (rGroup->path);
-        di = dirs_open (dict, rGroup->path);
-        strcpy (src, "");
-        repositoryUpdateR (di, dirs_read (di), rGroup->path, src, rGroup);
+
+        strcpy (src, rGroup->path);
+        src_len = strlen (src);
+
+        if (src_len && src[src_len-1] != '/')
+        {
+            src[src_len] = '/';
+            src[++src_len] = '\0';
+        }
+
+        di = dirs_open (dict, src);
+
+        *dst = '\0';
+        fileUpdateR (di, dirs_read (di), src, dst, rGroup);
         dirs_free (&di);
         dict_close (dict);
     }
     else 
     {
         strcpy (src, rGroup->path);
-        if (*src == '\0')
+        if (*src == '\0' || !strcmp (src, "-"))
             stdinExtractR (0, rGroup);
         else
             repositoryExtractR (0, src, rGroup);
@@ -325,7 +409,7 @@ void repositoryDelete (struct recordGroup *rGroup)
     assert (rGroup->path);
     groupRes (rGroup);
     strcpy (src, rGroup->path);
-    if (*src == '\0')
+    if (*src == '\0' || !strcmp(src, "-"))
        stdinExtractR (1, rGroup);
     else
        repositoryExtractR (1, src, rGroup);