2 * Copyright (C) 1994-1997, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.6 1998-02-17 10:29:27 adam
8 * Moved towards 'automatic' EXPLAIN database.
10 * Revision 1.5 1997/10/27 14:33:05 adam
11 * Moved towards generic character mapping depending on "structure"
12 * field in abstract syntax file. Fixed a few memory leaks. Fixed
13 * bug with negative integers when doing searches with relational
16 * Revision 1.4 1997/09/25 14:57:08 adam
19 * Revision 1.3 1996/05/22 08:21:59 adam
20 * Added public ZebDatabaseInfo structure.
22 * Revision 1.2 1996/05/14 06:16:41 adam
23 * Compact use/set bytes used in search service.
25 * Revision 1.1 1996/05/13 14:23:07 adam
26 * Work on compaction of set/use bytes in dictionary.
43 struct zebSUInfo info;
44 struct zebSUInfoB *next;
47 struct zebDatabaseInfoB {
48 struct zebSUInfoB *SUInfo;
53 struct zebDatabaseInfo info;
54 struct zebDatabaseInfoB *next;
57 struct zebTargetInfo {
61 struct zebDatabaseInfoB *databaseInfo;
62 struct zebDatabaseInfoB *curDatabaseInfo;
65 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
67 struct zebDatabaseInfoB *zdi, *zdi1;
71 char p0[4096], *p = p0;
73 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
74 p += sizeof(zti->dictNum);
75 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
79 char q0[4096], *q = q0;
80 struct zebSUInfoB *zsui;
85 drec = rec_get (zti->records, zdi->sysno);
88 drec = rec_new (zti->records);
90 drec->info[recInfo_fileType] =
91 rec_strdup ("grs.explain.databaseInfo",
92 &drec->size[recInfo_fileType]);
94 drec->info[recInfo_databaseName] =
95 rec_strdup ("IR-Explain-1",
96 &drec->size[recInfo_databaseName]);
97 zdi->sysno = drec->sysno;
100 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
102 memcpy (q, &zdi->info, sizeof(zdi->info));
103 q += sizeof(zdi->info);
104 memcpy (q, &no, sizeof(no));
106 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
108 memcpy (q, &zsui->info, sizeof(zsui->info));
109 q += sizeof(zsui->info);
111 xfree (drec->info[recInfo_storeData]);
112 drec->size[recInfo_storeData] = q-q0;
113 drec->info[recInfo_storeData] = xmalloc (drec->size[recInfo_storeData]);
114 memcpy (drec->info[recInfo_storeData], q0, drec->size[recInfo_storeData]);
115 rec_put (zti->records, &drec);
117 strcpy (p, zdi->databaseName);
119 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
120 p += sizeof(zdi->sysno);
125 Record grec = rec_get (zti->records, 1);
128 xfree (grec->info[recInfo_storeData]);
129 grec->size[recInfo_storeData] = p-p0;
130 grec->info[recInfo_storeData] = xmalloc (grec->size[recInfo_storeData]);
131 memcpy (grec->info[recInfo_storeData], p0, grec->size[recInfo_storeData]);
132 rec_put (zti->records, &grec);
135 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
137 struct zebSUInfoB *zsui, *zsui1;
140 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
145 xfree (zdi->databaseName);
151 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
155 struct zebDatabaseInfoB **zdi;
157 zti = xmalloc (sizeof(*zti));
159 zti->curDatabaseInfo = NULL;
160 zti->records = records;
162 zdi = &zti->databaseInfo;
164 trec = rec_get (records, 1);
169 p = trec->info[recInfo_storeData];
171 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
172 p += sizeof(zti->dictNum);
175 *zdi = xmalloc (sizeof(**zdi));
176 (*zdi)->SUInfo = NULL;
177 (*zdi)->databaseName = xstrdup (p);
179 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
180 p += sizeof((*zdi)->sysno);
181 (*zdi)->readFlag = 1;
185 assert (p - trec->info[recInfo_storeData] == trec->size[recInfo_storeData]-1);
192 trec = rec_new (records);
194 trec->info[recInfo_fileType] =
195 rec_strdup ("grs.explain.targetInfo",
196 &trec->size[recInfo_fileType]);
197 trec->info[recInfo_databaseName] =
198 rec_strdup ("IR-Explain-1",
199 &trec->size[recInfo_databaseName]);
200 trec->info[recInfo_databaseName] = xstrdup ("IR-Explain-1");
201 trec->info[recInfo_storeData] = xmalloc (1+sizeof(zti->dictNum));
202 memcpy (trec->info[recInfo_storeData], &zti->dictNum, sizeof(zti->dictNum));
203 trec->info[recInfo_storeData][sizeof(zti->dictNum)] = '\0';
204 trec->size[recInfo_storeData] = sizeof(zti->dictNum)+1;
205 rec_put (records, &trec);
213 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
214 struct zebDatabaseInfoB *zdi)
217 struct zebSUInfoB **zsuip = &zdi->SUInfo;
221 rec = rec_get (zti->records, zdi->sysno);
223 p = rec->info[recInfo_storeData];
224 memcpy (&zdi->info, p, sizeof(zdi->info));
225 p += sizeof(zdi->info);
226 memcpy (&no, p, sizeof(no));
228 for (i = 0; i<no; i++)
230 *zsuip = xmalloc (sizeof(**zsuip));
231 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
232 p += sizeof((*zsuip)->info);
233 zsuip = &(*zsuip)->next;
240 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
242 struct zebDatabaseInfoB *zdi;
245 if (zti->curDatabaseInfo &&
246 !strcmp (zti->curDatabaseInfo->databaseName, database))
248 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
250 if (!strcmp (zdi->databaseName, database))
256 zebTargetInfo_readDatabase (zti, zdi);
257 zti->curDatabaseInfo = zdi;
261 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
263 struct zebDatabaseInfoB *zdi;
266 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
268 if (!strcmp (zdi->databaseName, database))
273 zdi = xmalloc (sizeof(*zdi));
274 zdi->next = zti->databaseInfo;
275 zti->databaseInfo = zdi;
278 zdi->databaseName = xstrdup (database);
282 zti->curDatabaseInfo = zdi;
286 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
288 struct zebSUInfoB *zsui;
290 assert (zti->curDatabaseInfo);
291 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
292 if (zsui->info.use == use && zsui->info.set == set)
293 return zsui->info.ordinal;
297 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
299 struct zebSUInfoB *zsui;
301 assert (zti->curDatabaseInfo);
302 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
303 if (zsui->info.use == use && zsui->info.set == set)
305 zsui = xmalloc (sizeof(*zsui));
306 zsui->next = zti->curDatabaseInfo->SUInfo;
307 zti->curDatabaseInfo->SUInfo = zsui;
308 zti->curDatabaseInfo->dirty = 1;
310 zsui->info.set = set;
311 zsui->info.use = use;
312 zsui->info.ordinal = (zti->dictNum)++;
313 return zsui->info.ordinal;
316 ZebDatabaseInfo *zebTargetInfo_getDB (ZebTargetInfo *zti)
318 assert (zti->curDatabaseInfo);
320 return &zti->curDatabaseInfo->info;
323 void zebTargetInfo_setDB (ZebTargetInfo *zti, ZebDatabaseInfo *zdi)
325 assert (zti->curDatabaseInfo);
327 zti->curDatabaseInfo->dirty = 1;
328 memcpy (&zti->curDatabaseInfo->info, zdi, sizeof(*zdi));