2 * Copyright (C) 1994-1996, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1996-05-22 08:21:59 adam
8 * Added public ZebDatabaseInfo structure.
10 * Revision 1.2 1996/05/14 06:16:41 adam
11 * Compact use/set bytes used in search service.
13 * Revision 1.1 1996/05/13 14:23:07 adam
14 * Work on compaction of set/use bytes in dictionary.
30 struct zebSUInfo info;
31 struct zebSUInfoB *next;
34 struct zebDatabaseInfoB {
35 struct zebSUInfoB *SUInfo;
40 struct zebDatabaseInfo info;
41 struct zebDatabaseInfoB *next;
44 struct zebTargetInfo {
48 struct zebDatabaseInfoB *databaseInfo;
49 struct zebDatabaseInfoB *curDatabaseInfo;
52 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
54 struct zebDatabaseInfoB *zdi, *zdi1;
58 char p0[4096], *p = p0;
60 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
61 p += sizeof(zti->dictNum);
62 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
66 char q0[4096], *q = q0;
67 struct zebSUInfoB *zsui;
72 drec = rec_get (zti->records, zdi->sysno);
75 drec = rec_new (zti->records);
76 zdi->sysno = drec->sysno;
79 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
81 memcpy (q, &zdi->info, sizeof(zdi->info));
82 q += sizeof(zdi->info);
83 memcpy (q, &no, sizeof(no));
85 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
87 memcpy (q, &zsui->info, sizeof(zsui->info));
88 q += sizeof(zsui->info);
90 xfree (drec->info[0]);
92 drec->info[0] = xmalloc (drec->size[0]);
93 memcpy (drec->info[0], q0, drec->size[0]);
94 rec_put (zti->records, &drec);
96 strcpy (p, zdi->databaseName);
98 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
99 p += sizeof(zdi->sysno);
104 Record grec = rec_get (zti->records, 1);
107 xfree (grec->info[0]);
108 grec->size[0] = p-p0;
109 grec->info[0] = xmalloc (grec->size[0]);
110 memcpy (grec->info[0], p0, grec->size[0]);
111 rec_put (zti->records, &grec);
114 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
116 struct zebSUInfoB *zsui, *zsui1;
119 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
124 xfree (zdi->databaseName);
130 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
134 struct zebDatabaseInfoB **zdi;
136 zti = xmalloc (sizeof(*zti));
138 zti->curDatabaseInfo = NULL;
139 zti->records = records;
141 zdi = &zti->databaseInfo;
143 rec = rec_get (records, 1);
150 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
151 p += sizeof(zti->dictNum);
154 *zdi = xmalloc (sizeof(**zdi));
155 (*zdi)->SUInfo = NULL;
156 (*zdi)->databaseName = xstrdup (p);
158 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
159 p += sizeof((*zdi)->sysno);
160 (*zdi)->readFlag = 1;
164 assert (p - rec->info[0] == rec->size[0]-1);
171 rec = rec_new (records);
172 rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
173 memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
174 rec->info[0][sizeof(zti->dictNum)] = '\0';
175 rec->size[0] = sizeof(zti->dictNum)+1;
176 rec_put (records, &rec);
184 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
185 struct zebDatabaseInfoB *zdi)
188 struct zebSUInfoB **zsuip = &zdi->SUInfo;
192 rec = rec_get (zti->records, zdi->sysno);
195 memcpy (&zdi->info, p, sizeof(zdi->info));
196 p += sizeof(zdi->info);
197 memcpy (&no, p, sizeof(no));
199 for (i = 0; i<no; i++)
201 *zsuip = xmalloc (sizeof(**zsuip));
202 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
203 p += sizeof((*zsuip)->info);
204 zsuip = &(*zsuip)->next;
211 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
213 struct zebDatabaseInfoB *zdi;
216 if (zti->curDatabaseInfo &&
217 !strcmp (zti->curDatabaseInfo->databaseName, database))
219 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
221 if (!strcmp (zdi->databaseName, database))
227 zebTargetInfo_readDatabase (zti, zdi);
228 zti->curDatabaseInfo = zdi;
232 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
234 struct zebDatabaseInfoB *zdi;
237 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
239 if (!strcmp (zdi->databaseName, database))
244 zdi = xmalloc (sizeof(*zdi));
245 zdi->next = zti->databaseInfo;
246 zti->databaseInfo = zdi;
249 zdi->databaseName = xstrdup (database);
253 zti->curDatabaseInfo = zdi;
257 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
259 struct zebSUInfoB *zsui;
261 assert (zti->curDatabaseInfo);
262 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
263 if (zsui->info.use == use && zsui->info.set == set)
264 return zsui->info.ordinal;
268 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
270 struct zebSUInfoB *zsui;
272 assert (zti->curDatabaseInfo);
273 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
274 if (zsui->info.use == use && zsui->info.set == set)
276 zsui = xmalloc (sizeof(*zsui));
277 zsui->next = zti->curDatabaseInfo->SUInfo;
278 zti->curDatabaseInfo->SUInfo = zsui;
279 zti->curDatabaseInfo->dirty = 1;
281 zsui->info.set = set;
282 zsui->info.use = use;
283 zsui->info.ordinal = (zti->dictNum)++;
284 return zsui->info.ordinal;
287 ZebDatabaseInfo *zebTargetInfo_getDB (ZebTargetInfo *zti)
289 assert (zti->curDatabaseInfo);
291 return &zti->curDatabaseInfo->info;
294 void zebTargetInfo_setDB (ZebTargetInfo *zti, ZebDatabaseInfo *zdi)
296 assert (zti->curDatabaseInfo);
298 zti->curDatabaseInfo->dirty = 1;
299 memcpy (&zti->curDatabaseInfo->info, zdi, sizeof(*zdi));