Fixed bug #445: zebra.cfg does not check for valid directives.
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 5 Dec 2006 14:06:29 +0000 (14:06 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 5 Dec 2006 14:06:29 +0000 (14:06 +0000)
include/idzebra/res.h
index/Makefile.am
index/check_res.c [new file with mode: 0644]
index/index.h
index/zebraapi.c
test/sort/sort1.c
util/res.c

index 6164c5e..09e35e1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: res.h,v 1.10 2006-08-14 10:40:14 adam Exp $
+/* $Id: res.h,v 1.11 2006-12-05 14:06:29 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -91,6 +91,9 @@ char **res_get_array(Res r, const char* name);
 YAZ_EXPORT
 void res_dump (Res r, int level);
 
+YAZ_EXPORT
+int res_check(Res r_i, Res r_v);
+
 YAZ_END_CDECL
 
 #endif
index 4aacf7b..1192828 100644 (file)
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.60 2006-12-05 09:26:37 adam Exp $
+## $Id: Makefile.am,v 1.61 2006-12-05 14:06:29 adam Exp $
 
 aux_libs = \
  ../rset/libidzebra-rset.la \
@@ -88,7 +88,8 @@ libidzebra_2_0_la_SOURCES = \
   recindex.c  recindex.h recindxp.h reckeys.c reckeys.h recstat.c retrieve.c \
   rpnscan.c rpnsearch.c sortidx.c symtab.c stream.c \
   update_path.c update_file.c trunc.c untrans.c isam_methods.c \
-  zaptterm.c zebraapi.c zinfo.c zinfo.h zsets.c key_block.c key_block.h
+  zaptterm.c zebraapi.c zinfo.c zinfo.h zsets.c key_block.c key_block.h \
+  check_res.c
 
 bin_PROGRAMS = zebraidx zebrasrv
 
diff --git a/index/check_res.c b/index/check_res.c
new file mode 100644 (file)
index 0000000..baab2cc
--- /dev/null
@@ -0,0 +1,85 @@
+/* $Id: check_res.c,v 1.1 2006-12-05 14:06:29 adam Exp $
+   Copyright (C) 1995-2006
+   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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "index.h"
+
+int zebra_check_res(Res res)
+{
+    int errors = 0;
+    Res v = res_open(0, 0);
+    
+    res_add(v, "attset", "");
+    res_add(v, "chdir", "");
+    res_add(v, "dbaccess", "");
+    res_add(v, "encoding", "");
+    res_add(v, "estimatehits", "");
+    res_add(v, "group", "");
+    res_add(v, "index", "");
+    res_add(v, "isam", "");
+    res_add(v, "isamcDebug", "");
+    res_add(v, "isamsDebug", "");
+    res_add(v, "keyTmpDir", "");
+    res_add(v, "lockDir", "");
+    res_add(v, "modulePath", "");
+    res_add(v, "perm", "s");
+    res_add(v, "passwd", "");
+    res_add(v, "passwd.c", "");
+    res_add(v, "profilePath", "");
+    res_add(v, "rank", "");
+    res_add(v, "recordCompression", "");
+    res_add(v, "register", "");
+    res_add(v, "root", "");
+    res_add(v, "shadow", "");
+    res_add(v, "segment", "");
+    res_add(v, "setTmpDir", "");
+    res_add(v, "staticrank", "");
+    res_add(v, "threads", "");
+    res_add(v, "database", "p");
+    res_add(v, "explainDatabase", "p");
+    res_add(v, "fileVerboseLimit", "p");
+    res_add(v, "followLinks", "p");
+    res_add(v, "recordId", "p");
+    res_add(v, "recordType", "ps");
+    res_add(v, "storeKeys", "p");
+    res_add(v, "storeData", "p");
+    res_add(v, "openRW", "p");
+
+    
+    errors = res_check(res, v);
+    res_close(v);
+    return errors;
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+
index dcb408d..5e6cd48 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: index.h,v 1.185 2006-11-30 10:33:19 adam Exp $
+/* $Id: index.h,v 1.186 2006-12-05 14:06:29 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -409,6 +409,8 @@ ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                            char *termz);
 
 
+int zebra_check_res(Res res);
+
 #define FIRST_IN_FIELD_STR "\001^"
 #define FIRST_IN_FIELD_CHAR 1
 #define FIRST_IN_FIELD_LEN 2
index 3f80807..7b14661 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.236 2006-12-05 09:26:37 adam Exp $
+/* $Id: zebraapi.c,v 1.237 2006-12-05 14:06:29 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -209,7 +209,18 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res)
                res_close(res);
                return 0;
            }
+            if (zebra_check_res(res))
+            {
+                yaz_log(YLOG_FATAL, "Configuration error(s) for %s",
+                        configName);
+                return 0;
+            }
        }
+        else
+        {
+            zebra_check_res(res);
+        }
+
        zh = xmalloc(sizeof(*zh));
         zh->global_res = res;
         zh->sessions = 0;
index ea7603b..5134ac7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: sort1.c,v 1.11 2006-09-20 10:51:25 adam Exp $
+/* $Id: sort1.c,v 1.12 2006-12-05 14:06:30 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -30,7 +30,7 @@ static void tst(int argc, char **argv)
     char path[256];
     int i;
 
-    YAZ_CHECK(zebra_select_database(zh, "Default") == ZEBRA_OK);
+    YAZ_CHECK_EQ(zebra_select_database(zh, "Default"), ZEBRA_OK);
 
     zebra_init(zh);
 
index 7b30454..e105e59 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: res.c,v 1.52 2006-12-05 09:24:31 adam Exp $
+/* $Id: res.c,v 1.53 2006-12-05 14:06:30 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -554,6 +554,61 @@ void res_dump (Res r, int level)
        res_dump (r->over_res, level + 1);
     }
 }
+
+int res_check(Res r_i, Res r_v)
+{
+    struct res_entry *e_i;
+    int errors = 0;
+    
+    for (e_i = r_i->first; e_i; e_i = e_i->next)
+    {
+        struct res_entry *e_v;
+        for (e_v = r_v->first; e_v; e_v = e_v->next)
+        {
+            int prefix_allowed = 0;
+            int suffix_allowed = 0;
+            const char *name = e_i->name;
+            size_t name_len = strlen(e_i->name);
+            char namez[32];
+
+            if (strchr(e_v->value, 'p'))
+                prefix_allowed = 1;
+            if (strchr(e_v->value, 's'))
+                suffix_allowed = 1;
+
+            if (prefix_allowed)
+            {
+                const char *cp = strchr(name, '.');
+                if (cp)
+                {
+                    name = cp;
+                    name_len = strlen(name);
+                }
+            }
+            if (suffix_allowed)
+            {
+                const char *cp = strchr(name, '.');
+                if (cp)
+                    name_len = cp - name;
+            }
+            if (name_len < sizeof(namez)-1)
+            {
+                memcpy(namez, name, name_len);
+                namez[name_len] = '\0';
+                if (!yaz_matchstr(namez, e_v->name))
+                    break;
+            }
+        }
+        if (!e_v)
+        {
+            yaz_log(YLOG_WARN, "The following setting is unrecognized: %s",
+                    e_i->name);
+            errors++;
+        }
+    }
+    return errors;
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4