Source 'tag' in abs-file
[idzebra-moved-to-github.git] / index / zebraapi.c
index bb0c06f..b57ed8a 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2002, Index Data
  * All rights reserved.
  *
- * $Id: zebraapi.c,v 1.45 2002-02-20 17:30:01 adam Exp $
+ * $Id: zebraapi.c,v 1.49 2002-03-21 10:25:42 adam Exp $
  */
 
 #include <assert.h>
@@ -34,9 +34,6 @@ static void zebra_chdir (ZebraService zh)
 
 static void zebra_flush_reg (ZebraHandle zh)
 {
-    if (zh->service->matchDict)
-        dict_close (zh->service->matchDict);
-    zh->service->matchDict = 0;
     zebraExplain_flush (zh->service->zei, 1, zh);
     
     extract_flushWriteKeys (zh);
@@ -71,8 +68,10 @@ ZebraHandle zebra_open (ZebraService zs)
     zh->seqno = 0;
     zh->last_val = 0;
 
-    zh->lock_normal = zebra_lock_create ("norm.LCK", 0);
-    zh->lock_shadow = zebra_lock_create ("shadow.LCK", 0);
+    zh->lock_normal = zebra_lock_create (res_get(zs->res, "lockDir"),
+                                         "norm.LCK", 0);
+    zh->lock_shadow = zebra_lock_create (res_get(zs->res, "lockDir"),
+                                         "shadow.LCK", 0);
 
     zh->key_buf = 0;
     zh->admin_databaseName = 0;
@@ -152,7 +151,6 @@ static int zebra_register_activate (ZebraHandle zh, int rw, int useshadow)
     zs->recTypes = recTypes_init (zs->dh);
     recTypes_default_handlers (zs->recTypes);
 
-    zs->records = NULL;
     zs->zebra_maps = zebra_maps_open (zs->res);
     zs->rank_classes = NULL;
 
@@ -160,12 +158,14 @@ static int zebra_register_activate (ZebraHandle zh, int rw, int useshadow)
     zs->dict = 0;
     zs->sortIdx = 0;
     zs->isams = 0;
+    zs->matchDict = 0;
 #if ZMBOL
     zs->isam = 0;
     zs->isamc = 0;
     zs->isamd = 0;
 #endif
     zs->zei = 0;
+    zs->matchDict = 0;
     
     zebraRankInstall (zs, rank1_class);
 
@@ -181,7 +181,11 @@ static int zebra_register_activate (ZebraHandle zh, int rw, int useshadow)
        logf (LOG_WARN, "rec_open");
        return -1;
     }
-    if (!(zs->dict = dict_open (zs->bfs, FNAME_DICT, 80, rw, 0)))
+    if (rw)
+    {
+        zs->matchDict = dict_open (zs->bfs, GMATCH_DICT, 20, 1, 0);
+    }
+    if (!(zs->dict = dict_open (zs->bfs, FNAME_DICT, 40, rw, 0)))
     {
        logf (LOG_WARN, "dict_open");
        return -1;
@@ -282,6 +286,8 @@ static int zebra_register_deactivate (ZebraHandle zh)
     {
         zebraExplain_close (zs->zei, 0);
         dict_close (zs->dict);
+        if (zs->matchDict)
+            dict_close (zs->matchDict);
        sortIdx_close (zs->sortIdx);
        if (zs->isams)
            isams_close (zs->isams);
@@ -455,6 +461,8 @@ void zebra_search_rpn (ZebraHandle zh, ODR stream, ODR decode,
     logf(LOG_APP,"SEARCH:%d:",zh->hits);
 }
 
+
+
 void zebra_records_retrieve (ZebraHandle zh, ODR stream,
                             const char *setname, Z_RecordComposition *comp,
                             oid_value input_format, int num_recs,
@@ -688,17 +696,22 @@ int zebra_string_norm (ZebraHandle zh, unsigned reg_id,
 }
 
 
-void zebra_set_state (int val, int seqno)
+void zebra_set_state (ZebraHandle zh, int val, int seqno)
 {
+    char *fname = zebra_mk_fname (res_get(zh->service->res, "lockDir"),
+                                  "state.LCK");
     long p = getpid();
-    FILE *f = fopen ("state.LCK", "w");
+    FILE *f = fopen (fname, "w");
     fprintf (f, "%c %d %ld\n", val, seqno, p);
     fclose (f);
+    xfree (fname);
 }
 
-void zebra_get_state (char *val, int *seqno)
+void zebra_get_state (ZebraHandle zh, char *val, int *seqno)
 {
-    FILE *f = fopen ("state.LCK", "r");
+    char *fname = zebra_mk_fname (res_get(zh->service->res, "lockDir"),
+                                  "state.LCK");
+    FILE *f = fopen (fname, "r");
 
     *val = 'o';
     *seqno = 0;
@@ -708,6 +721,7 @@ void zebra_get_state (char *val, int *seqno)
         fscanf (f, "%c %d", val, seqno);
         fclose (f);
     }
+    xfree (fname);
 }
 
 static int zebra_begin_read (ZebraHandle zh)
@@ -716,14 +730,16 @@ static int zebra_begin_read (ZebraHandle zh)
     char val;
     int seqno;
 
-    zebra_flush_reg (zh);
 
     (zh->trans_no)++;
 
     if (zh->trans_no != 1)
+    {
+        zebra_flush_reg (zh);
         return 0;
+    }
 
-    zebra_get_state (&val, &seqno);
+    zebra_get_state (zh, &val, &seqno);
     if (val == 'd')
         val = 'o';
     if (seqno != zh->seqno)
@@ -798,7 +814,7 @@ void zebra_begin_trans (ZebraHandle zh)
             zebra_lock_w (zh->lock_shadow);
         }
         
-        zebra_get_state (&val, &seqno);
+        zebra_get_state (zh, &val, &seqno);
         if (val == 'c')
         {
             yaz_log (LOG_LOG, "previous transaction didn't finish commit");
@@ -829,11 +845,9 @@ void zebra_begin_trans (ZebraHandle zh)
         abort();
         return;
     }
-    zebra_set_state ('d', seqno);
+    zebra_set_state (zh, 'd', seqno);
 
     zebra_register_activate (zh, 1, rval ? 1 : 0);
-    zh->service->matchDict = dict_open (zh->service->bfs, GMATCH_DICT,
-                                        50, 1, 0);
     zh->seqno = seqno;
 }
 
@@ -854,7 +868,7 @@ void zebra_end_trans (ZebraHandle zh)
 
     zebra_register_deactivate (zh);
 
-    zebra_get_state (&val, &seqno);
+    zebra_get_state (zh, &val, &seqno);
     if (val != 'd')
     {
         BFiles bfs = bfs_create (res_get (zh->service->res, "shadow"));
@@ -863,7 +877,7 @@ void zebra_end_trans (ZebraHandle zh)
     }
     if (!rval)
         seqno++;
-    zebra_set_state ('o', seqno);
+    zebra_set_state (zh, 'o', seqno);
 
     zebra_unlock (zh->lock_shadow);
     zebra_unlock (zh->lock_normal);
@@ -915,13 +929,13 @@ void zebra_commit (ZebraHandle zh)
 
     bfs = bfs_create (res_get (zh->service->res, "register"));
 
-    zebra_get_state (&val, &seqno);
+    zebra_get_state (zh, &val, &seqno);
 
     if (rval && *rval)
         bf_cache (bfs, rval);
     if (bf_commitExists (bfs))
     {
-        zebra_set_state ('c', seqno);
+        zebra_set_state (zh, 'c', seqno);
 
         logf (LOG_LOG, "commit start");
         bf_commitExec (bfs);
@@ -931,7 +945,7 @@ void zebra_commit (ZebraHandle zh)
         logf (LOG_LOG, "commit clean");
         bf_commitClean (bfs, rval);
         seqno++;
-        zebra_set_state ('o', seqno);
+        zebra_set_state (zh, 'o', seqno);
     }
     else
     {
@@ -954,7 +968,7 @@ void zebra_init (ZebraHandle zh)
     
     bf_reset (bfs);
     bfs_destroy (bfs);
-    zebra_set_state ('o', 0);
+    zebra_set_state (zh, 'o', 0);
 }
 
 void zebra_compact (ZebraHandle zh)