2 * Copyright (C) 1994-1997, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.4 1997-09-25 14:57:08 adam
10 * Revision 1.3 1996/05/22 08:21:59 adam
11 * Added public ZebDatabaseInfo structure.
13 * Revision 1.2 1996/05/14 06:16:41 adam
14 * Compact use/set bytes used in search service.
16 * Revision 1.1 1996/05/13 14:23:07 adam
17 * Work on compaction of set/use bytes in dictionary.
34 struct zebSUInfo info;
35 struct zebSUInfoB *next;
38 struct zebDatabaseInfoB {
39 struct zebSUInfoB *SUInfo;
44 struct zebDatabaseInfo info;
45 struct zebDatabaseInfoB *next;
48 struct zebTargetInfo {
52 struct zebDatabaseInfoB *databaseInfo;
53 struct zebDatabaseInfoB *curDatabaseInfo;
56 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
58 struct zebDatabaseInfoB *zdi, *zdi1;
62 char p0[4096], *p = p0;
64 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
65 p += sizeof(zti->dictNum);
66 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
70 char q0[4096], *q = q0;
71 struct zebSUInfoB *zsui;
76 drec = rec_get (zti->records, zdi->sysno);
79 drec = rec_new (zti->records);
80 zdi->sysno = drec->sysno;
83 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
85 memcpy (q, &zdi->info, sizeof(zdi->info));
86 q += sizeof(zdi->info);
87 memcpy (q, &no, sizeof(no));
89 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
91 memcpy (q, &zsui->info, sizeof(zsui->info));
92 q += sizeof(zsui->info);
94 xfree (drec->info[0]);
96 drec->info[0] = xmalloc (drec->size[0]);
97 memcpy (drec->info[0], q0, drec->size[0]);
98 rec_put (zti->records, &drec);
100 strcpy (p, zdi->databaseName);
102 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
103 p += sizeof(zdi->sysno);
108 Record grec = rec_get (zti->records, 1);
111 xfree (grec->info[0]);
112 grec->size[0] = p-p0;
113 grec->info[0] = xmalloc (grec->size[0]);
114 memcpy (grec->info[0], p0, grec->size[0]);
115 rec_put (zti->records, &grec);
118 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
120 struct zebSUInfoB *zsui, *zsui1;
123 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
128 xfree (zdi->databaseName);
134 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
138 struct zebDatabaseInfoB **zdi;
140 zti = xmalloc (sizeof(*zti));
142 zti->curDatabaseInfo = NULL;
143 zti->records = records;
145 zdi = &zti->databaseInfo;
147 rec = rec_get (records, 1);
154 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
155 p += sizeof(zti->dictNum);
158 *zdi = xmalloc (sizeof(**zdi));
159 (*zdi)->SUInfo = NULL;
160 (*zdi)->databaseName = xstrdup (p);
162 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
163 p += sizeof((*zdi)->sysno);
164 (*zdi)->readFlag = 1;
168 assert (p - rec->info[0] == rec->size[0]-1);
175 rec = rec_new (records);
176 rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
177 memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
178 rec->info[0][sizeof(zti->dictNum)] = '\0';
179 rec->size[0] = sizeof(zti->dictNum)+1;
180 rec_put (records, &rec);
188 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
189 struct zebDatabaseInfoB *zdi)
192 struct zebSUInfoB **zsuip = &zdi->SUInfo;
196 rec = rec_get (zti->records, zdi->sysno);
199 memcpy (&zdi->info, p, sizeof(zdi->info));
200 p += sizeof(zdi->info);
201 memcpy (&no, p, sizeof(no));
203 for (i = 0; i<no; i++)
205 *zsuip = xmalloc (sizeof(**zsuip));
206 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
207 p += sizeof((*zsuip)->info);
208 zsuip = &(*zsuip)->next;
215 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
217 struct zebDatabaseInfoB *zdi;
220 if (zti->curDatabaseInfo &&
221 !strcmp (zti->curDatabaseInfo->databaseName, database))
223 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
225 if (!strcmp (zdi->databaseName, database))
231 zebTargetInfo_readDatabase (zti, zdi);
232 zti->curDatabaseInfo = zdi;
236 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
238 struct zebDatabaseInfoB *zdi;
241 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
243 if (!strcmp (zdi->databaseName, database))
248 zdi = xmalloc (sizeof(*zdi));
249 zdi->next = zti->databaseInfo;
250 zti->databaseInfo = zdi;
253 zdi->databaseName = xstrdup (database);
257 zti->curDatabaseInfo = zdi;
261 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
263 struct zebSUInfoB *zsui;
265 assert (zti->curDatabaseInfo);
266 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
267 if (zsui->info.use == use && zsui->info.set == set)
268 return zsui->info.ordinal;
272 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
274 struct zebSUInfoB *zsui;
276 assert (zti->curDatabaseInfo);
277 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
278 if (zsui->info.use == use && zsui->info.set == set)
280 zsui = xmalloc (sizeof(*zsui));
281 zsui->next = zti->curDatabaseInfo->SUInfo;
282 zti->curDatabaseInfo->SUInfo = zsui;
283 zti->curDatabaseInfo->dirty = 1;
285 zsui->info.set = set;
286 zsui->info.use = use;
287 zsui->info.ordinal = (zti->dictNum)++;
288 return zsui->info.ordinal;
291 ZebDatabaseInfo *zebTargetInfo_getDB (ZebTargetInfo *zti)
293 assert (zti->curDatabaseInfo);
295 return &zti->curDatabaseInfo->info;
298 void zebTargetInfo_setDB (ZebTargetInfo *zti, ZebDatabaseInfo *zdi)
300 assert (zti->curDatabaseInfo);
302 zti->curDatabaseInfo->dirty = 1;
303 memcpy (&zti->curDatabaseInfo->info, zdi, sizeof(*zdi));