/*
- * 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"
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;
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)
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)
{
{
Record rec;
ZebTargetInfo *zti;
- struct zebDatabaseInfo **zdi;
+ struct zebDatabaseInfoB **zdi;
zti = xmalloc (sizeof(*zti));
zti->dirty = 0;
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);
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);
}
}
}
static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
- struct zebDatabaseInfo *zdi)
+ struct zebDatabaseInfoB *zdi)
{
const char *p;
struct zebSUInfoB **zsuip = &zdi->SUInfo;
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++)
int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
{
- struct zebDatabaseInfo *zdi;
+ struct zebDatabaseInfoB *zdi;
assert (zti);
if (zti->curDatabaseInfo &&
int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
{
- struct zebDatabaseInfo *zdi;
+ struct zebDatabaseInfoB *zdi;
assert (zti);
for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
zdi->readFlag = 0;
zdi->databaseName = xstrdup (database);
zdi->SUInfo = NULL;
+ zdi->dirty = 1;
+ zti->dirty = 1;
zti->curDatabaseInfo = zdi;
return 0;
}
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));
+}
+