In zebra_register_open, only call zebraExplain_open if all previous
[idzebra-moved-to-github.git] / index / zebraapi.c
index dc26b11..35d02d8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.202 2006-02-21 15:23:11 adam Exp $
+/* $Id: zebraapi.c,v 1.209 2006-03-31 08:51:26 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -84,7 +84,7 @@ static struct zebra_register *zebra_register_open(ZebraService zs,
                                                  int rw, int useshadow,
                                                  Res res,
                                                  const char *reg_path);
-static void zebra_register_close (ZebraService zs, struct zebra_register *reg);
+static void zebra_register_close(ZebraService zs, struct zebra_register *reg);
 
 ZebraHandle zebra_open(ZebraService zs, Res res)
 {
@@ -280,6 +280,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     const char *recordCompression = 0;
     const char *profilePath;
     char cwd[1024];
+    ZEBRA_RES ret = ZEBRA_OK;
 
     ASSERTZS;
     
@@ -296,9 +297,10 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     yaz_log (YLOG_DEBUG, "zebra_register_open rw=%d useshadow=%d p=%p n=%s rp=%s",
              rw, useshadow, reg, name, reg_path ? reg_path : "(none)");
     
-    reg->dh = data1_createx (DATA1_FLAG_XML);
+    reg->dh = data1_create();
     if (!reg->dh)
     {
+       xfree(reg->name);
        xfree(reg);
         return 0;
     }
@@ -306,6 +308,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     if (!reg->bfs)
     {
         data1_destroy(reg->dh);
+       xfree(reg->name);
        xfree(reg);
         return 0;
     }
@@ -315,6 +318,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
        {
            bfs_destroy(reg->bfs);
            data1_destroy(reg->dh);
+           xfree(reg->name);
            xfree(reg);
            return 0;
        }
@@ -328,7 +332,17 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     data1_set_tabroot (reg->dh, reg_path);
     reg->recTypes = recTypes_init (zs->record_classes, reg->dh);
 
-    reg->zebra_maps = zebra_maps_open (res, reg_path);
+    reg->zebra_maps =
+       zebra_maps_open(res, reg_path, profilePath);
+    if (!reg->zebra_maps)
+    {
+       recTypes_destroy(reg->recTypes);
+       bfs_destroy(reg->bfs);
+       data1_destroy(reg->dh);
+       xfree(reg->name);
+       xfree(reg);
+       return 0;
+    }
     reg->rank_classes = NULL;
 
     reg->key_buf = 0;
@@ -363,10 +377,20 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     if (!strcmp (recordCompression, "bzip2"))
        record_compression = REC_COMPRESS_BZIP2;
 
+    if (1)
+    {
+       const char *index_fname = res_get_def(res, "index", "default.idx");
+       if (index_fname && *index_fname)
+       {
+           if (zebra_maps_read_file(reg->zebra_maps, index_fname) != ZEBRA_OK)
+               ret = ZEBRA_FAIL;
+       }
+    }
+
     if (!(reg->records = rec_open (reg->bfs, rw, record_compression)))
     {
        yaz_log (YLOG_WARN, "rec_open failed");
-       return 0;
+       ret = ZEBRA_FAIL;
     }
     if (rw)
     {
@@ -375,12 +399,12 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
     if (!(reg->dict = dict_open_res (reg->bfs, FNAME_DICT, 40, rw, 0, res)))
     {
        yaz_log (YLOG_WARN, "dict_open failed");
-       return 0;
+       ret = ZEBRA_FAIL;
     }
     if (!(reg->sortIdx = sortIdx_open (reg->bfs, rw)))
     {
        yaz_log (YLOG_WARN, "sortIdx_open failed");
-       return 0;
+       ret = ZEBRA_FAIL;
     }
     if (res_get_match (res, "isam", "s", ISAM_DEFAULT))
     {
@@ -389,7 +413,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
                                      key_isams_m(res, &isams_m))))
        {
            yaz_log (YLOG_WARN, "isams_open failed");
-           return 0;
+           ret = ZEBRA_FAIL;
        }
     }
     if (res_get_match (res, "isam", "c", ISAM_DEFAULT))
@@ -399,7 +423,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
                                    rw, key_isamc_m(res, &isamc_m))))
        {
            yaz_log (YLOG_WARN, "isamc_open failed");
-           return 0;
+           ret = ZEBRA_FAIL;
        }
     }
     if (res_get_match (res, "isam", "b", ISAM_DEFAULT))
@@ -410,7 +434,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
                                        rw, key_isamc_m(res, &isamc_m), 0)))
        {
            yaz_log (YLOG_WARN, "isamb_open failed");
-           return 0;
+           ret = ZEBRA_FAIL;
        }
     }
     if (res_get_match (res, "isam", "bc", ISAM_DEFAULT))
@@ -421,7 +445,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
                                        rw, key_isamc_m(res, &isamc_m), 1)))
        {
            yaz_log (YLOG_WARN, "isamb_open failed");
-           return 0;
+           ret = ZEBRA_FAIL;
        }
     }
     if (res_get_match (res, "isam", "null", ISAM_DEFAULT))
@@ -432,19 +456,26 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name,
                                        rw, key_isamc_m(res, &isamc_m), -1)))
        {
            yaz_log (YLOG_WARN, "isamb_open failed");
-           return 0;
+           ret = ZEBRA_FAIL;
        }
     }
-    reg->zei = zebraExplain_open (reg->records, reg->dh,
-                                  res, rw, reg,
-                                  explain_extract);
-    if (!reg->zei)
+    if (ret == ZEBRA_OK)
     {
-       yaz_log (YLOG_WARN, "Cannot obtain EXPLAIN information");
+       reg->zei = zebraExplain_open(reg->records, reg->dh,
+                                    res, rw, reg,
+                                    explain_extract);
+       if (!reg->zei)
+       {
+           yaz_log (YLOG_WARN, "Cannot obtain EXPLAIN information");
+           ret = ZEBRA_FAIL;
+       }
+    }
+    
+    if (ret != ZEBRA_OK)
+    {
+       zebra_register_close(zs, reg);
        return 0;
     }
-
-    reg->active = 2;
     yaz_log (YLOG_DEBUG, "zebra_register_open ok p=%p", reg);
     return reg;
 }
@@ -471,28 +502,26 @@ ZEBRA_RES zebra_admin_start (ZebraHandle zh)
     return ZEBRA_OK;
 }
 
-static void zebra_register_close (ZebraService zs, struct zebra_register *reg)
+static void zebra_register_close(ZebraService zs, struct zebra_register *reg)
 {
     ASSERTZS;
     assert(reg);
     yaz_log(YLOG_DEBUG, "zebra_register_close p=%p", reg);
     reg->stop_flag = 0;
     zebra_chdir (zs);
-    if (reg->records)
-    {
-        zebraExplain_close (reg->zei);
-        dict_close (reg->dict);
-        if (reg->matchDict)
-            dict_close (reg->matchDict);
-       sortIdx_close (reg->sortIdx);
-       if (reg->isams)
-           isams_close (reg->isams);
-        if (reg->isamc)
-            isamc_close (reg->isamc);
-        if (reg->isamb)
-            isamb_close (reg->isamb);
-        rec_close (&reg->records);
-    }
+    
+    zebraExplain_close (reg->zei);
+    dict_close (reg->dict);
+    if (reg->matchDict)
+       dict_close (reg->matchDict);
+    sortIdx_close (reg->sortIdx);
+    if (reg->isams)
+       isams_close (reg->isams);
+    if (reg->isamc)
+       isamc_close (reg->isamc);
+    if (reg->isamb)
+       isamb_close (reg->isamb);
+    rec_close (&reg->records);
 
     recTypes_destroy (reg->recTypes);
     zebra_maps_close (reg->zebra_maps);
@@ -552,7 +581,7 @@ ZEBRA_RES zebra_close (ZebraHandle zh)
     resultSetDestroy (zh, -1, 0, 0);
 
     if (zh->reg)
-        zebra_register_close (zh->service, zh->reg);
+        zebra_register_close(zh->service, zh->reg);
     zebra_close_res (zh);
     res_close(zh->session_res);
 
@@ -654,7 +683,7 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg)
         if (zh->reg)
         {
             resultSetInvalidate (zh);
-            zebra_register_close (zh->service, zh->reg);
+            zebra_register_close(zh->service, zh->reg);
             zh->reg = 0;
         }
         zebra_close_res(zh);
@@ -694,11 +723,11 @@ static void zebra_select_register (ZebraHandle zh, const char *new_reg)
             res_set (zh->res, "lockDir", zh->path_reg);
         sprintf (fname, "norm.%s.LCK", zh->reg_name);
         zh->lock_normal =
-            zebra_lock_create (res_get(zh->res, "lockDir"), fname, 0);
+            zebra_lock_create (res_get(zh->res, "lockDir"), fname);
         
         sprintf (fname, "shadow.%s.LCK", zh->reg_name);
         zh->lock_shadow =
-            zebra_lock_create (res_get(zh->res, "lockDir"), fname, 0);
+            zebra_lock_create (res_get(zh->res, "lockDir"), fname);
 
        if (!zh->lock_normal || !zh->lock_shadow)
        {
@@ -1616,7 +1645,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw)
         if (zh->reg)
        {
             resultSetInvalidate (zh);
-            zebra_register_close (zh->service, zh->reg);
+            zebra_register_close(zh->service, zh->reg);
        }
         zh->trans_w_no = zh->trans_no;
 
@@ -1663,7 +1692,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw)
                     yaz_log (YLOG_WARN, "previous transaction didn't reach commit");
                     bf_commitClean (bfs, rval);
                     bfs_destroy (bfs);
-            }
+               }
                 else
                 {
                     yaz_log (YLOG_WARN, "your previous transaction didn't finish");
@@ -1758,7 +1787,7 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw)
         if (zh->reg)
        {
             resultSetInvalidate (zh);
-            zebra_register_close (zh->service, zh->reg);
+            zebra_register_close(zh->service, zh->reg);
        }
         zh->reg = zebra_register_open(zh->service, zh->reg_name,
                                       0, val == 'c' ? 1 : 0,
@@ -1834,7 +1863,7 @@ ZEBRA_RES zebra_end_transaction (ZebraHandle zh, ZebraTransactionStatus *status)
         
         resultSetInvalidate (zh);
 
-        zebra_register_close (zh->service, zh->reg);
+        zebra_register_close(zh->service, zh->reg);
         zh->reg = 0;
         
         yaz_log (YLOG_LOG, "Records: "ZINT_FORMAT" i/u/d "
@@ -2351,3 +2380,12 @@ void zebra_setError_zint(ZebraHandle zh, int code, zint i)
     zh->errString = nmem_strdup(zh->nmem_error, vstr);
 }
 
+void zebra_lock_prefix (Res res, char *path)
+{
+    const char *lock_dir = res_get_def (res, "lockDir", "");
+
+    strcpy (path, lock_dir);
+    if (*path && path[strlen(path)-1] != '/')
+        strcat (path, "/");
+}
+