Code calls xfree() instead of free().
[idzebra-moved-to-github.git] / index / zinfo.c
index 4f34867..17a20e4 100644 (file)
@@ -1,16 +1,32 @@
 /*
- * Copyright (C) 1994-1996, Index Data I/S 
+ * Copyright (C) 1994-1997, Index Data I/S 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zinfo.c,v $
- * Revision 1.1  1996-05-13 14:23:07  adam
+ * Revision 1.5  1997-10-27 14:33:05  adam
+ * Moved towards generic character mapping depending on "structure"
+ * field in abstract syntax file. Fixed a few memory leaks. Fixed
+ * bug with negative integers when doing searches with relational
+ * operators.
+ *
+ * Revision 1.4  1997/09/25 14:57:08  adam
+ * Added string.h.
+ *
+ * Revision 1.3  1996/05/22 08:21:59  adam
+ * Added public ZebDatabaseInfo structure.
+ *
+ * Revision 1.2  1996/05/14 06:16:41  adam
+ * Compact use/set bytes used in search service.
+ *
+ * Revision 1.1  1996/05/13 14:23:07  adam
  * Work on compaction of set/use bytes in dictionary.
  *
  */
 
 #include <stdlib.h>
 #include <assert.h>
+#include <string.h>
 
 #include "zinfo.h"
 
@@ -25,36 +41,37 @@ struct zebSUInfoB {
     struct zebSUInfoB *next;
 };
 
-struct zebDatabaseInfo {
+struct zebDatabaseInfoB {
     struct zebSUInfoB *SUInfo;
     char *databaseName;
     int sysno;
     int readFlag;
-    struct zebDatabaseInfo *next;
+    int dirty;
+    struct zebDatabaseInfo info;
+    struct zebDatabaseInfoB *next;
 };
 
 struct zebTargetInfo {
     int  dictNum;
     int  dirty;
     Records records;
-    struct zebDatabaseInfo *databaseInfo;
-    struct zebDatabaseInfo *curDatabaseInfo;
+    struct zebDatabaseInfoB *databaseInfo;
+    struct zebDatabaseInfoB *curDatabaseInfo;
 };
 
 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
 {
-    struct zebDatabaseInfo *zdi, *zdi1;
+    struct zebDatabaseInfoB *zdi, *zdi1;
     
     if (writeFlag)
     {
-        Record grec;
         char p0[4096], *p = p0;
 
         memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
         p += sizeof(zti->dictNum);
         for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
         {
-            if (zdi->readFlag || !zdi->sysno)
+            if (zdi->dirty)
             {
                 char q0[4096], *q = q0;
                 struct zebSUInfoB *zsui;
@@ -71,6 +88,8 @@ void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
                 assert (drec);
                 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
                     no++;
+               memcpy (q, &zdi->info, sizeof(zdi->info));
+                q += sizeof(zdi->info);
                 memcpy (q, &no, sizeof(no));
                 q += sizeof(no);
                 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
@@ -89,13 +108,18 @@ void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
             memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
             p += sizeof(zdi->sysno);
         }
-        *p = '\0';
-        grec = rec_get (zti->records, 1);
-        xfree (grec->info[0]);
-        grec->size[0] = p-p0;
-        grec->info[0] = xmalloc (grec->size[0]);
-        memcpy (grec->info[0], p0, grec->size[0]);
-        rec_put (zti->records, &grec);
+        *p++ = '\0';
+        if (zti->dirty)
+        {
+            Record grec = rec_get (zti->records, 1);
+
+            assert (grec);
+            xfree (grec->info[0]);
+            grec->size[0] = p-p0;
+            grec->info[0] = xmalloc (grec->size[0]);
+            memcpy (grec->info[0], p0, grec->size[0]);
+            rec_put (zti->records, &grec);
+        }
     }
     for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
     {
@@ -117,7 +141,7 @@ ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
 {
     Record rec;
     ZebTargetInfo *zti;
-    struct zebDatabaseInfo **zdi;
+    struct zebDatabaseInfoB **zdi;
 
     zti = xmalloc (sizeof(*zti));
     zti->dirty = 0;
@@ -144,6 +168,7 @@ ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
             memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
             p += sizeof((*zdi)->sysno);
             (*zdi)->readFlag = 1;
+            (*zdi)->dirty = 0;
             zdi = &(*zdi)->next;
         }
         assert (p - rec->info[0] == rec->size[0]-1);
@@ -157,6 +182,7 @@ ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
             rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
             memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
             rec->info[0][sizeof(zti->dictNum)] = '\0';
+            rec->size[0] = sizeof(zti->dictNum)+1;
             rec_put (records, &rec);
         }
     }
@@ -166,7 +192,7 @@ ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
 }
 
 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
-                                        struct zebDatabaseInfo *zdi)
+                                        struct zebDatabaseInfoB *zdi)
 {
     const char *p;
     struct zebSUInfoB **zsuip = &zdi->SUInfo;
@@ -176,6 +202,8 @@ static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
     rec = rec_get (zti->records, zdi->sysno);
     assert (rec);
     p = rec->info[0];
+    memcpy (&zdi->info, p, sizeof(zdi->info));
+    p += sizeof(zdi->info);
     memcpy (&no, p, sizeof(no));
     p += sizeof(no);
     for (i = 0; i<no; i++)
@@ -192,7 +220,7 @@ static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
 
 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
 {
-    struct zebDatabaseInfo *zdi;
+    struct zebDatabaseInfoB *zdi;
     
     assert (zti);
     if (zti->curDatabaseInfo &&
@@ -213,7 +241,7 @@ int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
 
 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
 {
-    struct zebDatabaseInfo *zdi;
+    struct zebDatabaseInfoB *zdi;
 
     assert (zti);
     for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
@@ -230,6 +258,8 @@ int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
     zdi->readFlag = 0;
     zdi->databaseName = xstrdup (database);
     zdi->SUInfo = NULL;
+    zdi->dirty = 1;
+    zti->dirty = 1;
     zti->curDatabaseInfo = zdi;
     return 0;
 }
@@ -256,8 +286,26 @@ int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
     zsui = xmalloc (sizeof(*zsui));
     zsui->next = zti->curDatabaseInfo->SUInfo;
     zti->curDatabaseInfo->SUInfo = zsui;
+    zti->curDatabaseInfo->dirty = 1;
+    zti->dirty = 1;
     zsui->info.set = set;
     zsui->info.use = use;
     zsui->info.ordinal = (zti->dictNum)++;
     return zsui->info.ordinal;
 }
+
+ZebDatabaseInfo *zebTargetInfo_getDB (ZebTargetInfo *zti)
+{
+    assert (zti->curDatabaseInfo);
+
+    return &zti->curDatabaseInfo->info;
+}
+
+void zebTargetInfo_setDB (ZebTargetInfo *zti, ZebDatabaseInfo *zdi)
+{
+    assert (zti->curDatabaseInfo);
+
+    zti->curDatabaseInfo->dirty = 1;
+    memcpy (&zti->curDatabaseInfo->info, zdi, sizeof(*zdi));
+}
+