-/*
- * 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>
+/* $Id: main.c,v 1.96 2002-09-03 11:44:54 adam Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+ Index Data Aps
-#include <util.h>
-#include "index.h"
+This file is part of the Zebra server.
-char *prog;
+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.
-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;
+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.
-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;
-}
+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.
+*/
-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;
-}
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#include <sys/time.h>
+#endif
+#include <time.h>
+#if HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
-void key_write (int cmd, struct it_key *k, const char *str)
-{
- char x = cmd;
- size_t slen = strlen(str);
+#include <yaz/data1.h>
+#include "zebraapi.h"
- 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;
-}
+char *prog;
-void text_extract (SYSNO sysno, int cmd, const char *fname)
+int main (int argc, char **argv)
{
- 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);
-}
+ int ret;
+ int cmd = 0;
+ char *arg;
+ char *configName = 0;
+ int nsections = 0;
+ int disableCommit = 0;
+ size_t mem_max = 0;
+#if HAVE_SYS_TIMES_H
+ struct tms tms1, tms2;
+ struct timeval start_time, end_time;
+ long usec;
+#endif
+#ifndef WIN32
+ char nbuf[100];
+#endif
+ struct recordGroup rGroupDef;
+ ZebraService zs = 0;
+ ZebraHandle zh = 0;
-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;
+ nmem_init ();
- 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);
-}
+#ifdef WIN32
+#else
+ sprintf(nbuf, "%.40s(%d)", *argv, getpid());
+ yaz_log_init_prefix (nbuf);
+#endif
+#if HAVE_SYS_TIMES_H
+ times(&tms1);
+ gettimeofday(&start_time, 0);
+#endif
-static void repository_extract_r (int cmd, char *rep)
-{
- DIR *dir;
- size_t rep_len;
- struct dirent *dent;
- struct stat fs;
+ rGroupDef.groupName = NULL;
+ rGroupDef.databaseName = NULL;
+ rGroupDef.path = NULL;
+ rGroupDef.recordId = NULL;
+ rGroupDef.recordType = NULL;
+ rGroupDef.flagStoreData = -1;
+ rGroupDef.flagStoreKeys = -1;
+ rGroupDef.flagRw = 1;
+ rGroupDef.databaseNamePath = 0;
+ rGroupDef.explainDatabase = 0;
+ rGroupDef.fileVerboseLimit = 100000;
+ rGroupDef.followLinks = -1;
- rep_len = strlen(rep);
- dir = opendir(rep);
- if (!dir)
+ prog = *argv;
+ if (argc < 2)
{
- if (errno == ENOENT)
- {
- log (LOG_WARN|LOG_ERRNO, "opendir %s", rep);
- return;
- }
- log (LOG_FATAL|LOG_ERRNO, "opendir %s", rep);
+ fprintf (stderr, "%s [options] command <dir> ...\n"
+ "Commands:\n"
+ " update <dir> Update index with files below <dir>.\n"
+ " If <dir> is empty filenames are read from stdin.\n"
+ " delete <dir> Delete index with files below <dir>.\n"
+ " commit Commit changes\n"
+ " clean Clean shadow files\n"
+ "Options:\n"
+ " -t <type> Index files as <type> (grs or text).\n"
+ " -c <config> Read configuration file <config>.\n"
+ " -g <group> Index files according to group settings.\n"
+ " -d <database> Records belong to Z39.50 database <database>.\n"
+ " -m <mbytes> Use <mbytes> before flushing keys to disk.\n"
+ " -n Don't use shadow system.\n"
+ " -s Show analysis on stdout, but do no work.\n"
+ " -v <level> Set logging to <level>.\n"
+ " -l <file> Write log to <file>.\n"
+ " -L Don't follow symbolic links.\n"
+ " -f <n> Display information for the first <n> records.\n"
+ " -V Show version.\n", *argv
+ );
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)
+ while ((ret = options ("sVt:c:g:d:m:v:nf:l:L"
+ , argv, argc, &arg)) != -2)
{
if (ret == 0)
{
- if (!base_name)
+ if(cmd == 0) /* command */
{
- base_name = arg;
-
- common_resource = res_open (base_name);
- if (!common_resource)
+ if (!zs)
{
- log (LOG_FATAL, "Cannot open resource `%s'", base_name);
- exit (1);
+ const char *config = configName ? configName : "zebra.cfg";
+ logf (LOG_LOG, "Zebra version %s %s",
+ ZEBRAVER, ZEBRADATE);
+ zs = zebra_start (config);
+ if (!zs)
+ {
+ yaz_log (LOG_FATAL, "Cannot read config %s", config);
+ exit (1);
+ }
+ zh = zebra_open (zs);
+ if (disableCommit)
+ zebra_shadow_enable (zh, 0);
}
- }
- else if(cmd == 0) /* command */
- {
- if (!strcmp (arg, "add"))
+ if (rGroupDef.databaseName)
{
- cmd = 'a';
+ if (zebra_select_database (zh, rGroupDef.databaseName))
+ exit (1);
}
- else if (!strcmp (arg, "del"))
+ else
{
+ if (zebra_select_database (zh, "Default"))
+ exit (1);
+ }
+
+ if (!strcmp (arg, "update"))
+ cmd = 'u';
+ else if (!strcmp (arg, "update1"))
+ cmd = 'U';
+ else if (!strcmp (arg, "update2"))
+ cmd = 'm';
+ else if (!strcmp (arg, "dump"))
+ cmd = 's';
+ else if (!strcmp (arg, "del") || !strcmp(arg, "delete"))
cmd = 'd';
+ else if (!strcmp (arg, "init"))
+ {
+ zebra_init (zh);
+ }
+ else if (!strcmp (arg, "commit"))
+ {
+ zebra_commit (zh);
+ }
+ else if (!strcmp (arg, "clean"))
+ {
+ assert (!"todo");
+ }
+ else if (!strcmp (arg, "stat") || !strcmp (arg, "status"))
+ {
+ zebra_register_statistics (zh,0);
+ }
+ else if (!strcmp (arg, "dump") || !strcmp (arg, "dumpdict"))
+ {
+ zebra_register_statistics (zh,1);
+ }
+ else if (!strcmp (arg, "compact"))
+ {
+ zebra_compact (zh);
}
else
{
- log (LOG_FATAL, "Unknown command: %s", arg);
+ logf (LOG_FATAL, "unknown command: %s", arg);
exit (1);
}
}
- else
+ else
{
- key_open ("keys.tmp");
- repository_traverse (cmd, arg);
+ rGroupDef.path = arg;
+ zebra_set_group (zh, &rGroupDef);
+ zebra_begin_trans (zh);
+
+ switch (cmd)
+ {
+ case 'u':
+ zebra_repository_update (zh);
+ break;
+ case 'd':
+ zebra_repository_delete (zh);
+ break;
+ case 's':
+ logf (LOG_LOG, "dumping %s", rGroupDef.path);
+ zebra_repository_show (zh);
+ nsections = 0;
+ break;
+ default:
+ nsections = 0;
+ }
cmd = 0;
+ zebra_end_trans (zh);
+ log_event_end (NULL, NULL);
}
}
- else if (ret == 'v')
+ else if (ret == 'V')
{
- log_init (log_mask_str(arg), prog, NULL);
- }
- else if (ret == 'b')
- {
- base_path = arg;
+ fprintf (stderr, "Zebra %s %s\n", ZEBRAVER, ZEBRADATE);
+ fprintf (stderr, " (C) 1994-2002, Index Data ApS\n");
+#ifdef WIN32
+#ifdef _DEBUG
+ fprintf (stderr, " WIN32 Debug\n");
+#else
+ fprintf (stderr, " WIN32 Release\n");
+#endif
+#endif
+#if HAVE_BZLIB_H
+ fprintf (stderr, "libbzip2\n"
+ " (C) 1996-1999 Julian R Seward. All rights reserved.\n");
+#endif
}
+ else if (ret == 'v')
+ yaz_log_init_level (yaz_log_mask_str(arg));
+ else if (ret == 'l')
+ yaz_log_init_file (arg);
+ else if (ret == 'm')
+ mem_max = 1024*1024*atoi(arg);
+ else if (ret == 'd')
+ rGroupDef.databaseName = arg;
+ else if (ret == 's')
+ rGroupDef.flagRw = 0;
+ else if (ret == 'g')
+ rGroupDef.groupName = arg;
+ else if (ret == 'f')
+ rGroupDef.fileVerboseLimit = atoi(arg);
+ else if (ret == 'c')
+ configName = arg;
+ else if (ret == 't')
+ rGroupDef.recordType = arg;
+ else if (ret == 'n')
+ disableCommit = 1;
+ else if (ret == 'L')
+ rGroupDef.followLinks = 0;
else
- {
- log (LOG_FATAL, "Unknown option '-%s'", arg);
- exit (1);
- }
+ logf (LOG_WARN, "unknown option '-%s'", arg);
}
- key_flush ();
- key_close ();
+ zebra_close (zh);
+ zebra_stop (zs);
+#if HAVE_SYS_TIMES_H
+ gettimeofday(&end_time, 0);
+ usec = (end_time.tv_sec - start_time.tv_sec) * 1000000L +
+ end_time.tv_usec - start_time.tv_usec;
+ times(&tms2);
+ yaz_log (LOG_LOG, "zebraidx times: %5.2f %5.2f %5.2f",
+ (double) usec / 1000000.0,
+ (double) (tms2.tms_utime - tms1.tms_utime)/100,
+ (double) (tms2.tms_stime - tms1.tms_stime)/100);
+#endif
exit (0);
+ return 0;
}
+