2 * Copyright (C) 1994-1996, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1996-05-14 06:16:41 adam
8 * Compact use/set bytes used in search service.
10 * Revision 1.1 1996/05/13 14:23:07 adam
11 * Work on compaction of set/use bytes in dictionary.
27 struct zebSUInfo info;
28 struct zebSUInfoB *next;
31 struct zebDatabaseInfo {
32 struct zebSUInfoB *SUInfo;
37 struct zebDatabaseInfo *next;
40 struct zebTargetInfo {
44 struct zebDatabaseInfo *databaseInfo;
45 struct zebDatabaseInfo *curDatabaseInfo;
48 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
50 struct zebDatabaseInfo *zdi, *zdi1;
54 char p0[4096], *p = p0;
56 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
57 p += sizeof(zti->dictNum);
58 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
62 char q0[4096], *q = q0;
63 struct zebSUInfoB *zsui;
68 drec = rec_get (zti->records, zdi->sysno);
71 drec = rec_new (zti->records);
72 zdi->sysno = drec->sysno;
75 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
77 memcpy (q, &no, sizeof(no));
79 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
81 memcpy (q, &zsui->info, sizeof(zsui->info));
82 q += sizeof(zsui->info);
84 xfree (drec->info[0]);
86 drec->info[0] = xmalloc (drec->size[0]);
87 memcpy (drec->info[0], q0, drec->size[0]);
88 rec_put (zti->records, &drec);
90 strcpy (p, zdi->databaseName);
92 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
93 p += sizeof(zdi->sysno);
98 Record grec = rec_get (zti->records, 1);
101 xfree (grec->info[0]);
102 grec->size[0] = p-p0;
103 grec->info[0] = xmalloc (grec->size[0]);
104 memcpy (grec->info[0], p0, grec->size[0]);
105 rec_put (zti->records, &grec);
108 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
110 struct zebSUInfoB *zsui, *zsui1;
113 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
118 xfree (zdi->databaseName);
124 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
128 struct zebDatabaseInfo **zdi;
130 zti = xmalloc (sizeof(*zti));
132 zti->curDatabaseInfo = NULL;
133 zti->records = records;
135 zdi = &zti->databaseInfo;
137 rec = rec_get (records, 1);
144 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
145 p += sizeof(zti->dictNum);
148 *zdi = xmalloc (sizeof(**zdi));
149 (*zdi)->SUInfo = NULL;
150 (*zdi)->databaseName = xstrdup (p);
152 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
153 p += sizeof((*zdi)->sysno);
154 (*zdi)->readFlag = 1;
158 assert (p - rec->info[0] == rec->size[0]-1);
165 rec = rec_new (records);
166 rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
167 memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
168 rec->info[0][sizeof(zti->dictNum)] = '\0';
169 rec->size[0] = sizeof(zti->dictNum)+1;
170 rec_put (records, &rec);
178 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
179 struct zebDatabaseInfo *zdi)
182 struct zebSUInfoB **zsuip = &zdi->SUInfo;
186 rec = rec_get (zti->records, zdi->sysno);
189 memcpy (&no, p, sizeof(no));
191 for (i = 0; i<no; i++)
193 *zsuip = xmalloc (sizeof(**zsuip));
194 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
195 p += sizeof((*zsuip)->info);
196 zsuip = &(*zsuip)->next;
203 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
205 struct zebDatabaseInfo *zdi;
208 if (zti->curDatabaseInfo &&
209 !strcmp (zti->curDatabaseInfo->databaseName, database))
211 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
213 if (!strcmp (zdi->databaseName, database))
219 zebTargetInfo_readDatabase (zti, zdi);
220 zti->curDatabaseInfo = zdi;
224 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
226 struct zebDatabaseInfo *zdi;
229 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
231 if (!strcmp (zdi->databaseName, database))
236 zdi = xmalloc (sizeof(*zdi));
237 zdi->next = zti->databaseInfo;
238 zti->databaseInfo = zdi;
241 zdi->databaseName = xstrdup (database);
245 zti->curDatabaseInfo = zdi;
249 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
251 struct zebSUInfoB *zsui;
253 assert (zti->curDatabaseInfo);
254 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
255 if (zsui->info.use == use && zsui->info.set == set)
256 return zsui->info.ordinal;
260 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
262 struct zebSUInfoB *zsui;
264 assert (zti->curDatabaseInfo);
265 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
266 if (zsui->info.use == use && zsui->info.set == set)
268 zsui = xmalloc (sizeof(*zsui));
269 zsui->next = zti->curDatabaseInfo->SUInfo;
270 zti->curDatabaseInfo->SUInfo = zsui;
271 zti->curDatabaseInfo->dirty = 1;
273 zsui->info.set = set;
274 zsui->info.use = use;
275 zsui->info.ordinal = (zti->dictNum)++;
276 return zsui->info.ordinal;