/*
- * 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.6 1998-02-17 10:29:27 adam
+ * Moved towards 'automatic' EXPLAIN database.
+ *
+ * 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;
else
{
drec = rec_new (zti->records);
+
+ drec->info[recInfo_fileType] =
+ rec_strdup ("grs.explain.databaseInfo",
+ &drec->size[recInfo_fileType]);
+
+ drec->info[recInfo_databaseName] =
+ rec_strdup ("IR-Explain-1",
+ &drec->size[recInfo_databaseName]);
zdi->sysno = drec->sysno;
}
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 (q, &zsui->info, sizeof(zsui->info));
q += sizeof(zsui->info);
}
- xfree (drec->info[0]);
- drec->size[0] = q-q0;
- drec->info[0] = xmalloc (drec->size[0]);
- memcpy (drec->info[0], q0, drec->size[0]);
+ xfree (drec->info[recInfo_storeData]);
+ drec->size[recInfo_storeData] = q-q0;
+ drec->info[recInfo_storeData] = xmalloc (drec->size[recInfo_storeData]);
+ memcpy (drec->info[recInfo_storeData], q0, drec->size[recInfo_storeData]);
rec_put (zti->records, &drec);
}
strcpy (p, zdi->databaseName);
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[recInfo_storeData]);
+ grec->size[recInfo_storeData] = p-p0;
+ grec->info[recInfo_storeData] = xmalloc (grec->size[recInfo_storeData]);
+ memcpy (grec->info[recInfo_storeData], p0, grec->size[recInfo_storeData]);
+ rec_put (zti->records, &grec);
+ }
}
for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
{
ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
{
- Record rec;
+ Record trec;
ZebTargetInfo *zti;
- struct zebDatabaseInfo **zdi;
+ struct zebDatabaseInfoB **zdi;
zti = xmalloc (sizeof(*zti));
zti->dirty = 0;
zdi = &zti->databaseInfo;
- rec = rec_get (records, 1);
- if (rec)
+ trec = rec_get (records, 1);
+ if (trec)
{
const char *p;
- p = rec->info[0];
+ p = trec->info[recInfo_storeData];
memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
p += sizeof(zti->dictNum);
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);
+ assert (p - trec->info[recInfo_storeData] == trec->size[recInfo_storeData]-1);
}
else
{
zti->dictNum = 1;
if (writeFlag)
{
- rec = rec_new (records);
- 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_put (records, &rec);
+ trec = rec_new (records);
+
+ trec->info[recInfo_fileType] =
+ rec_strdup ("grs.explain.targetInfo",
+ &trec->size[recInfo_fileType]);
+ trec->info[recInfo_databaseName] =
+ rec_strdup ("IR-Explain-1",
+ &trec->size[recInfo_databaseName]);
+ trec->info[recInfo_databaseName] = xstrdup ("IR-Explain-1");
+ trec->info[recInfo_storeData] = xmalloc (1+sizeof(zti->dictNum));
+ memcpy (trec->info[recInfo_storeData], &zti->dictNum, sizeof(zti->dictNum));
+ trec->info[recInfo_storeData][sizeof(zti->dictNum)] = '\0';
+ trec->size[recInfo_storeData] = sizeof(zti->dictNum)+1;
+ rec_put (records, &trec);
}
}
*zdi = NULL;
- rec_rm (&rec);
+ rec_rm (&trec);
return zti;
}
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];
+ p = rec->info[recInfo_storeData];
+ 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));
+}
+