Beginnings of zebra_register_check
[idzebra-moved-to-github.git] / index / zebraapi.c
index a343014..420861f 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the Zebra server.
-   Copyright (C) 1994-2009 Index Data
+   Copyright (C) 1994-2010 Index Data
 
 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
@@ -61,20 +61,24 @@ static ZEBRA_RES zebra_check_handle(ZebraHandle zh)
 
 #define ZEBRA_CHECK_HANDLE(zh) if (zebra_check_handle(zh) != ZEBRA_OK) return ZEBRA_FAIL
 
-static void zebra_chdir(ZebraService zs)
+static int zebra_chdir(ZebraService zs)
 {
     const char *dir ;
+    int r;
     ASSERTZS;
     yaz_log(log_level, "zebra_chdir");
     dir = res_get(zs->global_res, "chdir");
     if (!dir)
-       return;
+       return 0;
     yaz_log(YLOG_DEBUG, "chdir %s", dir);
 #ifdef WIN32
-    _chdir(dir);
+    r = _chdir(dir);
 #else
-    chdir(dir);
+    r = chdir(dir);
 #endif
+    if (r)
+        yaz_log(YLOG_FATAL|YLOG_ERRNO, "chdir %s", dir);
+    return r;
 }
 
 static ZEBRA_RES zebra_flush_reg(ZebraHandle zh)
@@ -239,7 +243,11 @@ ZebraService zebra_start_res(const char *configName, Res def_res, Res over_res)
         zh->global_res = res;
         zh->sessions = 0;
         
-        zebra_chdir(zh);
+        if (zebra_chdir(zh))
+        {
+            xfree(zh);
+            return 0;
+        }
         
         zebra_mutex_cond_init(&zh->session_lock);
        passwd_plain = res_get(zh->global_res, "passwd");
@@ -326,9 +334,8 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
 {
     struct zebra_register *reg;
     int record_compression = REC_COMPRESS_NONE;
-    const char *recordCompression = 0;
+    const char *compression_str = 0;
     const char *profilePath;
-    char cwd[1024];
     int sort_type = ZEBRA_SORT_TYPE_FLAT;
     ZEBRA_RES ret = ZEBRA_OK;
 
@@ -374,7 +381,6 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
        }
     }
 
-    getcwd(cwd, sizeof(cwd)-1);
     profilePath = res_get_def(res, "profilePath", 0);
 
     data1_set_tabpath(reg->dh, profilePath);
@@ -414,11 +420,25 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     zebraRankInstall(reg, rank_similarity_class);
     zebraRankInstall(reg, rank_static_class);
 
-    recordCompression = res_get_def(res, "recordCompression", "none");
-    if (!strcmp(recordCompression, "none"))
+    compression_str = res_get_def(res, "recordCompression", "none");
+    if (!strcmp(compression_str, "none"))
        record_compression = REC_COMPRESS_NONE;
-    if (!strcmp(recordCompression, "bzip2"))
+    else if (!strcmp(compression_str, "bzip2"))
        record_compression = REC_COMPRESS_BZIP2;
+    else if (!strcmp(compression_str, "zlib"))
+       record_compression = REC_COMPRESS_ZLIB;
+    else
+    {
+        yaz_log(YLOG_FATAL, "invalid recordCompression: %s", compression_str);
+        ret = ZEBRA_FAIL;
+    }
+
+    if (!rec_check_compression_method(record_compression))
+    {
+        yaz_log(YLOG_FATAL, "unsupported recordCompression: %s",
+                compression_str);
+        ret = ZEBRA_FAIL;
+    }
 
     {
        const char *index_fname = res_get_def(res, "index", "default.idx");
@@ -1628,7 +1648,11 @@ static void zebra_get_state(ZebraHandle zh, char *val, int *seqno)
 
     if (f)
     {
-        fscanf(f, "%c %d", val, seqno);
+        if (fscanf(f, "%c %d", val, seqno) != 2)
+        {
+            yaz_log(YLOG_ERRNO|YLOG_WARN, "fscan fail %s",
+                    state_fname);
+        }
         fclose(f);
     }
     xfree(fname);
@@ -2170,6 +2194,33 @@ ZEBRA_RES zebra_compact(ZebraHandle zh)
     return ZEBRA_OK;
 }
 
+ZEBRA_RES zebra_register_check(ZebraHandle zh)
+{
+    ZEBRA_RES res = ZEBRA_FAIL;
+    if (zebra_begin_read(zh) == ZEBRA_OK)
+    {
+        zint no_records = 0;
+        if (zh->reg)
+        {
+            Record rec = rec_get_root(zh->reg->records);
+            
+            while (rec)
+            {
+                Record r1;
+                
+                r1 = rec_get_next(zh->reg->records, rec);
+                rec_free(&rec);
+                rec = r1;
+                no_records++;
+            }
+            res = ZEBRA_OK;
+        }
+        zebra_end_read(zh);
+        yaz_log(YLOG_LOG, ZINT_FORMAT " records scanned", no_records);
+    }
+    return res;
+}
+
 void zebra_result(ZebraHandle zh, int *code, char **addinfo)
 {
     yaz_log(log_level, "zebra_result");