Towards 1.3.15
[idzebra-moved-to-github.git] / index / zebraapi.c
index 750c326..f90d3f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.108 2003-06-23 14:35:41 heikki Exp $
+/* $Id: zebraapi.c,v 1.115 2003-11-28 14:47:45 adam Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003
    Index Data Aps
 
@@ -20,8 +20,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 */
 
-
-
 #include <assert.h>
 #include <stdio.h>
 #ifdef WIN32
@@ -186,6 +184,13 @@ ZebraService zebra_start (const char *configName)
     return 0;
 }
 
+
+void zebra_pidfname(ZebraService zs, char *path)
+{
+    zebra_lock_prefix (zs->global_res, path);
+    strcat(path, "zebrasrv.pid");
+}
+
 static
 struct zebra_register *zebra_register_open (ZebraService zs, const char *name,
                                             int rw, int useshadow, Res res,
@@ -793,7 +798,7 @@ int zebra_records_retrieve (ZebraHandle zh, ODR stream,
                             ZebraRetrievalRecord *recs)
 {
     ZebraPosSet poset;
-    int i, *pos_array;
+    int i, *pos_array, ret = 0;
     ASSERTZH;
     yaz_log(LOG_API,"zebra_records_retrieve n=%d",num_recs);
     zh->errCode=0;
@@ -802,13 +807,13 @@ int zebra_records_retrieve (ZebraHandle zh, ODR stream,
     {
         zh->errCode = 30;
         zh->errString = odr_strdup (stream, setname);
-        return 1;
+        return -1;
     }
     
     zh->errCode = 0;
 
     if (zebra_begin_read (zh))
-       return 1;
+       return -1;
 
     pos_array = (int *) xmalloc (num_recs * sizeof(*pos_array));
     for (i = 0; i<num_recs; i++)
@@ -819,6 +824,7 @@ int zebra_records_retrieve (ZebraHandle zh, ODR stream,
         logf (LOG_DEBUG, "zebraPosSetCreate error");
         zh->errCode = 30;
         zh->errString = nmem_strdup (stream->mem, setname);
+       ret = -1;
     }
     else
     {
@@ -849,6 +855,7 @@ int zebra_records_retrieve (ZebraHandle zh, ODR stream,
                sprintf (num_str, "%d", pos_array[i]);  
                zh->errCode = 13;
                 zh->errString = odr_strdup (stream, num_str);
+               ret = -1;
                 break;
            }
        }
@@ -856,7 +863,7 @@ int zebra_records_retrieve (ZebraHandle zh, ODR stream,
     }
     zebra_end_read (zh);
     xfree (pos_array);
-    return 0;
+    return ret;
 }
 
 int zebra_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
@@ -1098,11 +1105,65 @@ int zebra_admin_exchange_record (ZebraHandle zh,
     return 0;
 }
 
+int delete_w_handle(const char *info, void *handle)
+{
+    ZebraHandle zh = (ZebraHandle) handle;
+    ISAMC_P pos;
+
+    if (*info == sizeof(pos))
+    {
+       memcpy (&pos, info+1, sizeof(pos));
+       isamb_unlink(zh->reg->isamb, pos);
+    }
+    return 0;
+}
+
+static int delete_SU_handle(void *handle, int ord)
+{
+    ZebraHandle zh = (ZebraHandle) handle;
+    char ord_buf[20];
+    int ord_len;
+
+    ord_len = key_SU_encode (ord, ord_buf);
+    ord_buf[ord_len] = '\0';
+
+    assert (zh->reg->isamb);
+    dict_delete_subtree(zh->reg->dict, ord_buf,
+                       zh, delete_w_handle);
+    return 0;
+}
+
+int zebra_drop_database  (ZebraHandle zh, const char *database)
+{
+    int ret = 0;
+    ASSERTZH;
+    yaz_log(LOG_API,"zebra_drop_database");
+    zh->errCode = 0;
+
+    if (zebra_select_database (zh, database))
+        return -1;
+    if (zebra_begin_trans (zh, 1))
+        return -1;
+    if (zh->reg->isamb)
+    {
+       zebraExplain_curDatabase (zh->reg->zei, database);
+       
+       zebraExplain_trav_ord(zh->reg->zei, zh, delete_SU_handle);
+       zebraExplain_removeDatabase(zh->reg->zei, zh);
+    }
+    else
+    {
+       yaz_log(LOG_WARN, "drop database only supported for isam:b");
+       ret = -1;
+    }
+    zebra_end_trans (zh);
+    return ret;
+}
+
 int zebra_create_database (ZebraHandle zh, const char *database)
 {
-    ZebraService zs;
     ASSERTZH;
-    yaz_log(LOG_API,"zebra_admin_create");
+    yaz_log(LOG_API,"zebra_create_database");
     zh->errCode=0;
 
     if (zebra_select_database (zh, database))
@@ -1110,7 +1171,6 @@ int zebra_create_database (ZebraHandle zh, const char *database)
     if (zebra_begin_trans (zh, 1))
         return -1;
 
-    zs = zh->service;
     /* announce database */
     if (zebraExplain_newDatabase (zh->reg->zei, database, 0 
                                   /* explainDatabase */))
@@ -1204,7 +1264,6 @@ int zebra_end_read (ZebraHandle zh)
 
 int zebra_begin_trans (ZebraHandle zh, int rw)
 {
-    yaz_log(LOG_LOG, "zebra_begin_trans rw=%d trans=%d", rw, zh->trans_no);
     if (!zh->res)
     {
         zh->errCode = 2;
@@ -1375,7 +1434,10 @@ int zebra_begin_trans (ZebraHandle zh, int rw)
             zebra_lock_r (zh->lock_normal);
         
         if (zh->reg)
+       {
+            resultSetInvalidate (zh);
             zebra_register_close (zh->service, zh->reg);
+       }
         zh->reg = zebra_register_open (zh->service, zh->reg_name,
                                        0, val == 'c' ? 1 : 0,
                                        zh->res, zh->path_reg);
@@ -2058,6 +2120,8 @@ int zebra_search_PQF (ZebraHandle zh, const char *pqf_query,
     
     odr_destroy(odr);
 
+    yaz_log(LOG_API,"Hits: %d",hits);
+
     if (numhits)
        *numhits=hits;
 
@@ -2068,11 +2132,11 @@ int zebra_search_PQF (ZebraHandle zh, const char *pqf_query,
   Sort - a simplified interface, with optional read locks.
   FIXME - This is a horrible name, will conflict with half the applications
 */
-int zebra_sort_2 (ZebraHandle zh, 
-                 ODR stream,
-                 const char *sort_spec,
-                 const char *output_setname,
-                 const char **input_setnames) 
+int zebra_sort_by_specstr (ZebraHandle zh, 
+                          ODR stream,
+                          const char *sort_spec,
+                          const char *output_setname,
+                          const char **input_setnames) 
 {
     int num_input_setnames = 0;
     int sort_status = 0;