New simple file index tool.
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 31 Aug 1995 14:50:24 +0000 (14:50 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 31 Aug 1995 14:50:24 +0000 (14:50 +0000)
index/Makefile [new file with mode: 0644]
index/index.h [new file with mode: 0644]
index/main.c [new file with mode: 0644]

diff --git a/index/Makefile b/index/Makefile
new file mode 100644 (file)
index 0000000..80a0ff1
--- /dev/null
@@ -0,0 +1,41 @@
+# Copyright (C) 1994, Index Data I/S 
+# All rights reserved.
+# Sebastian Hammer, Adam Dickmeiss
+# $Id: Makefile,v 1.1 1995-08-31 14:50:24 adam Exp $
+
+SHELL=/bin/sh
+INCLUDE=-I../include
+TPROG1=index
+DEFS=$(INCLUDE)
+O = main.o
+CPP=cc -E
+
+all: $(TPROG1)
+
+$(TPROG1): $(O) ../lib/dict.a ../lib/bfile.a ../lib/util.a
+       $(CC) $(CFLAGS) -o $(TPROG1) $(O) ../lib/dict.a ../lib/bfile.a ../lib/util.a
+
+.c.o:
+       $(CC) -c $(DEFS) $(CFLAGS) $<
+
+clean:
+       rm -f *.[oa] $(TPROG1) $(TPROG2) core mon.out gmon.out errlist
+
+$(O): index.h
+
+depend: depend2
+
+depend1:
+       mv Makefile Makefile.tmp
+       sed '/^#Depend/q' <Makefile.tmp >Makefile
+       $(CPP) $(INCLUDE) -M *.c >>Makefile
+       -rm Makefile.tmp
+
+depend2:
+       $(CPP) $(INCLUDE) -M *.c >.depend       
+
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
+
+#Depend --- DOT NOT DELETE THIS LINE
diff --git a/index/index.h b/index/index.h
new file mode 100644 (file)
index 0000000..d3cc099
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 1994, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: index.h,v $
+ * Revision 1.1  1995-08-31 14:50:24  adam
+ * New simple file index tool.
+ *
+ */
+
+#include <util.h>
+#include <dict.h>
+#include <isam.h>
+
+struct it_key {
+    int sysno;
+    int seqno;
+    int field;
+};
diff --git a/index/main.c b/index/main.c
new file mode 100644 (file)
index 0000000..87f7c16
--- /dev/null
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 1994, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: main.c,v $
+ * Revision 1.1  1995-08-31 14:50:24  adam
+ * New simple file index tool.
+ *
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#include <util.h>
+#include "index.h"
+
+char *prog;
+
+static int key_fd = -1;
+#define KEY_BUF_SIZE 100000
+static char *key_buf;
+int key_offset;
+SYSNO sysno_next;
+Dict file_idx;
+static char *base_path = NULL;
+
+void key_open (const char *fname)
+{
+    void *file_key;
+    if (key_fd != -1)
+        return;
+    if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
+    {
+        log (LOG_FATAL|LOG_ERRNO, "Creat %s", fname);
+        exit (1);
+    }
+    if (!(key_buf = malloc (KEY_BUF_SIZE)))
+    {
+        log (LOG_FATAL|LOG_ERRNO, "malloc");
+        exit (1);
+    }
+    key_offset = 0;
+    if (!(file_idx = dict_open ("fileidx", 10, 1)))
+    {
+        log (LOG_FATAL, "dict_open fail of %s", "fileidx");
+        exit (1);
+    }
+    file_key = dict_lookup (file_idx, ".");
+    if (file_key)
+        memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
+    else
+        sysno_next = 1;
+}
+
+void key_close (void)
+{
+    if (key_fd == -1)
+        return;
+    close (key_fd);
+    dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
+    dict_close (file_idx);
+    key_fd = -1;
+}
+
+void key_flush (void)
+{
+    size_t i = 0;
+    int w;
+    
+    while (i < key_offset)
+    {
+        w = write (key_fd, key_buf + i, key_offset - i);
+        if (w == -1)
+        {
+            log (LOG_FATAL|LOG_ERRNO, "Write key fail");
+            exit (1);
+        }
+        i += w;
+    }
+    key_offset = 0;
+}
+
+void key_write (int cmd, struct it_key *k, const char *str)
+{
+    char x = cmd;
+    size_t slen = strlen(str);
+
+    if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2)
+        key_flush ();
+    memcpy (key_buf + key_offset, &x, 1);
+    key_offset++;
+    memcpy (key_buf + key_offset, k, sizeof(*k));
+    key_offset += sizeof(*k);
+    memcpy (key_buf + key_offset, str, slen+1);
+    key_offset += slen+1;
+}
+
+void text_extract (SYSNO sysno, int cmd, const char *fname)
+{
+    FILE *inf;
+    struct it_key k;
+    int seqno = 1;
+    int c;
+    char w[256];
+
+    log (LOG_DEBUG, "Text extract of %d", sysno);
+    k.sysno = sysno;
+    inf = fopen (fname, "r");
+    if (!inf)
+    {
+        log (LOG_WARN|LOG_ERRNO, "open %s", fname);
+        return;
+    }
+    while ((c=getc (inf)) != EOF)
+    {
+        int i = 0;
+        while (i < 254 && c != EOF && isalnum(c))
+        {
+            w[i++] = c;
+            c = getc (inf);
+        }
+        if (i)
+        {
+            w[i] = 0;
+            
+            k.seqno = seqno++;
+            k.field = 0;
+            key_write (cmd, &k, w);
+        }
+        if (c == EOF)
+            break;
+    }
+    fclose (inf);
+}
+
+void file_extract (int cmd, struct stat *fs, const char *fname)
+{
+    int i;
+    char ext[128];
+    SYSNO sysno;
+    char ext_res[128];
+    const char *file_type;
+    void *file_info;
+
+    log (LOG_DEBUG, "%c %s", cmd, fname);
+    for (i = strlen(fname); --i >= 0; )
+        if (fname[i] == '/')
+        {
+            strcpy (ext, "");
+            break;
+        }
+        else if (fname[i] == '.')
+        {
+            strcpy (ext, fname+i+1);
+            break;
+        }
+    sprintf (ext_res, "fileExtension.%s", ext);
+    if (!(file_type = res_get (common_resource, ext_res)))
+        return;
+    
+    file_info = dict_lookup (file_idx, fname);
+    if (!file_info)
+    {
+        sysno = sysno_next++;
+        dict_insert (file_idx, fname, sizeof(sysno), &sysno);
+    }
+    else
+        memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
+    if (!strcmp (file_type, "text"))
+        text_extract (sysno, cmd, fname);
+}
+
+static void repository_extract_r (int cmd, char *rep)
+{
+    DIR *dir;
+    size_t rep_len;
+    struct dirent *dent;
+    struct stat fs;
+
+    rep_len = strlen(rep);
+    dir = opendir(rep);
+    if (!dir)
+    {
+        if (errno == ENOENT)
+        {
+            log (LOG_WARN|LOG_ERRNO, "opendir %s", rep);
+            return;
+        }
+        log (LOG_FATAL|LOG_ERRNO, "opendir %s", rep);
+        exit (1);
+    }
+    if (rep[rep_len-1] != '/')
+        rep[rep_len] = '/';
+    else
+        --rep_len;
+    while ((dent = readdir (dir)))
+    {
+        strcpy (rep +rep_len+1, dent->d_name);
+        stat (rep, &fs);
+        switch (fs.st_mode & S_IFMT)
+        {
+        case S_IFREG:
+            file_extract (cmd, &fs, rep);
+            break;
+        case S_IFDIR:
+            if (strcmp (dent->d_name, ".") && strcmp(dent->d_name, ".."))
+                repository_extract_r (cmd, rep);
+            break;
+        }
+    }
+    closedir (dir);
+}
+
+void repository_update_r (int cmd, const char *rep, const char *with_rep)
+{
+
+}
+
+void repository_traverse (int cmd, const char *rep)
+{
+    char rep_tmp1[2048];
+    char rep_tmp2[2048];
+
+    strcpy (rep_tmp1, rep);
+    if (base_path)
+    {
+        strcpy (rep_tmp2, base_path);
+        repository_update_r (cmd, rep_tmp1, rep_tmp2);
+    }
+    else
+        repository_extract_r (cmd, rep_tmp1);
+}
+
+
+int main (int argc, char **argv)
+{
+    int ret;
+    int cmd = 0;
+    char *arg;
+    char *base_name;
+
+    prog = *argv;
+    while ((ret = options ("b:v:", argv, argc, &arg)) != -2)
+    {
+        if (ret == 0)
+        {
+            if (!base_name)
+            {
+                base_name = arg;
+
+                common_resource = res_open (base_name);
+                if (!common_resource)
+                {
+                    log (LOG_FATAL, "Cannot open resource `%s'", base_name);
+                    exit (1);
+                }
+            }
+            else if(cmd == 0) /* command */
+            {
+                if (!strcmp (arg, "add"))
+                {
+                    cmd = 'a';
+                }
+                else if (!strcmp (arg, "del"))
+                {
+                    cmd = 'd';
+                }
+                else
+                {
+                    log (LOG_FATAL, "Unknown command: %s", arg);
+                    exit (1);
+                }
+            }
+            else
+            {
+                key_open ("keys.tmp");
+                repository_traverse (cmd, arg);
+                cmd = 0;
+            }
+        }
+        else if (ret == 'v')
+        {
+            log_init (log_mask_str(arg), prog, NULL);
+        }
+        else if (ret == 'b')
+        {
+            base_path = arg;
+        }
+        else
+        {
+            log (LOG_FATAL, "Unknown option '-%s'", arg);
+            exit (1);
+        }
+    }
+    key_flush ();
+    key_close ();
+    exit (0);
+}