seqno/statevalue in register rather than session
[idzebra-moved-to-github.git] / index / zebraapi.c
index 817b803..6e2e3a8 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2002, Index Data
  * All rights reserved.
  *
- * $Id: zebraapi.c,v 1.47 2002-03-15 20:11:36 adam Exp $
+ * $Id: zebraapi.c,v 1.50 2002-03-27 07:53:13 adam Exp $
  */
 
 #include <assert.h>
@@ -65,11 +65,11 @@ ZebraHandle zebra_open (ZebraService zs)
     zh->errString = 0;
 
     zh->trans_no = 0;
-    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;
@@ -102,6 +102,9 @@ ZebraService zebra_start (const char *configName)
     zh->registerState = -1;
     zh->registerChange = 0;
 
+    zh->seqno = 0;
+    zh->last_val = 0;
+
     if (!(zh->res = res_open (zh->configName)))
     {
        logf (LOG_WARN, "Failed to read resources `%s'", zh->configName);
@@ -459,6 +462,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,
@@ -692,17 +697,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;
@@ -712,6 +722,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)
@@ -729,17 +740,17 @@ static int zebra_begin_read (ZebraHandle zh)
         return 0;
     }
 
-    zebra_get_state (&val, &seqno);
+    zebra_get_state (zh, &val, &seqno);
     if (val == 'd')
         val = 'o';
-    if (seqno != zh->seqno)
+    if (seqno != zh->service->seqno)
     {
-        yaz_log (LOG_LOG, "reopen seqno cur/old %d/%d", seqno, zh->seqno);
+        yaz_log (LOG_LOG, "reopen seqno cur/old %d/%d", seqno, zh->service->seqno);
         dirty = 1;
     }
-    else if (zh->last_val != val)
+    else if (zh->service->last_val != val)
     {
-        yaz_log (LOG_LOG, "reopen last cur/old %d/%d", val, zh->last_val);
+        yaz_log (LOG_LOG, "reopen last cur/old %d/%d", val, zh->service->last_val);
         dirty = 1;
     }
     if (!dirty)
@@ -750,8 +761,8 @@ static int zebra_begin_read (ZebraHandle zh)
     else
         zebra_lock_r (zh->lock_normal);
     
-    zh->last_val = val;
-    zh->seqno = seqno;
+    zh->service->last_val = val;
+    zh->service->seqno = seqno;
 
     zebra_register_deactivate (zh);
 
@@ -804,7 +815,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");
@@ -835,10 +846,10 @@ 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->seqno = seqno;
+    zh->service->seqno = seqno;
 }
 
 void zebra_end_trans (ZebraHandle zh)
@@ -858,7 +869,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"));
@@ -867,7 +878,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);
@@ -919,13 +930,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);
@@ -935,7 +946,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
     {
@@ -958,7 +969,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)