2 * Copyright (C) 1994-1997, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.5 1997-10-27 14:33:05 adam
8 * Moved towards generic character mapping depending on "structure"
9 * field in abstract syntax file. Fixed a few memory leaks. Fixed
10 * bug with negative integers when doing searches with relational
13 * Revision 1.4 1997/09/25 14:57:08 adam
16 * Revision 1.3 1996/05/22 08:21:59 adam
17 * Added public ZebDatabaseInfo structure.
19 * Revision 1.2 1996/05/14 06:16:41 adam
20 * Compact use/set bytes used in search service.
22 * Revision 1.1 1996/05/13 14:23:07 adam
23 * Work on compaction of set/use bytes in dictionary.
40 struct zebSUInfo info;
41 struct zebSUInfoB *next;
44 struct zebDatabaseInfoB {
45 struct zebSUInfoB *SUInfo;
50 struct zebDatabaseInfo info;
51 struct zebDatabaseInfoB *next;
54 struct zebTargetInfo {
58 struct zebDatabaseInfoB *databaseInfo;
59 struct zebDatabaseInfoB *curDatabaseInfo;
62 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
64 struct zebDatabaseInfoB *zdi, *zdi1;
68 char p0[4096], *p = p0;
70 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
71 p += sizeof(zti->dictNum);
72 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
76 char q0[4096], *q = q0;
77 struct zebSUInfoB *zsui;
82 drec = rec_get (zti->records, zdi->sysno);
85 drec = rec_new (zti->records);
86 zdi->sysno = drec->sysno;
89 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
91 memcpy (q, &zdi->info, sizeof(zdi->info));
92 q += sizeof(zdi->info);
93 memcpy (q, &no, sizeof(no));
95 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
97 memcpy (q, &zsui->info, sizeof(zsui->info));
98 q += sizeof(zsui->info);
100 xfree (drec->info[0]);
101 drec->size[0] = q-q0;
102 drec->info[0] = xmalloc (drec->size[0]);
103 memcpy (drec->info[0], q0, drec->size[0]);
104 rec_put (zti->records, &drec);
106 strcpy (p, zdi->databaseName);
108 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
109 p += sizeof(zdi->sysno);
114 Record grec = rec_get (zti->records, 1);
117 xfree (grec->info[0]);
118 grec->size[0] = p-p0;
119 grec->info[0] = xmalloc (grec->size[0]);
120 memcpy (grec->info[0], p0, grec->size[0]);
121 rec_put (zti->records, &grec);
124 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
126 struct zebSUInfoB *zsui, *zsui1;
129 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
134 xfree (zdi->databaseName);
140 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
144 struct zebDatabaseInfoB **zdi;
146 zti = xmalloc (sizeof(*zti));
148 zti->curDatabaseInfo = NULL;
149 zti->records = records;
151 zdi = &zti->databaseInfo;
153 rec = rec_get (records, 1);
160 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
161 p += sizeof(zti->dictNum);
164 *zdi = xmalloc (sizeof(**zdi));
165 (*zdi)->SUInfo = NULL;
166 (*zdi)->databaseName = xstrdup (p);
168 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
169 p += sizeof((*zdi)->sysno);
170 (*zdi)->readFlag = 1;
174 assert (p - rec->info[0] == rec->size[0]-1);
181 rec = rec_new (records);
182 rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
183 memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
184 rec->info[0][sizeof(zti->dictNum)] = '\0';
185 rec->size[0] = sizeof(zti->dictNum)+1;
186 rec_put (records, &rec);
194 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
195 struct zebDatabaseInfoB *zdi)
198 struct zebSUInfoB **zsuip = &zdi->SUInfo;
202 rec = rec_get (zti->records, zdi->sysno);
205 memcpy (&zdi->info, p, sizeof(zdi->info));
206 p += sizeof(zdi->info);
207 memcpy (&no, p, sizeof(no));
209 for (i = 0; i<no; i++)
211 *zsuip = xmalloc (sizeof(**zsuip));
212 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
213 p += sizeof((*zsuip)->info);
214 zsuip = &(*zsuip)->next;
221 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
223 struct zebDatabaseInfoB *zdi;
226 if (zti->curDatabaseInfo &&
227 !strcmp (zti->curDatabaseInfo->databaseName, database))
229 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
231 if (!strcmp (zdi->databaseName, database))
237 zebTargetInfo_readDatabase (zti, zdi);
238 zti->curDatabaseInfo = zdi;
242 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
244 struct zebDatabaseInfoB *zdi;
247 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
249 if (!strcmp (zdi->databaseName, database))
254 zdi = xmalloc (sizeof(*zdi));
255 zdi->next = zti->databaseInfo;
256 zti->databaseInfo = zdi;
259 zdi->databaseName = xstrdup (database);
263 zti->curDatabaseInfo = zdi;
267 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
269 struct zebSUInfoB *zsui;
271 assert (zti->curDatabaseInfo);
272 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
273 if (zsui->info.use == use && zsui->info.set == set)
274 return zsui->info.ordinal;
278 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
280 struct zebSUInfoB *zsui;
282 assert (zti->curDatabaseInfo);
283 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
284 if (zsui->info.use == use && zsui->info.set == set)
286 zsui = xmalloc (sizeof(*zsui));
287 zsui->next = zti->curDatabaseInfo->SUInfo;
288 zti->curDatabaseInfo->SUInfo = zsui;
289 zti->curDatabaseInfo->dirty = 1;
291 zsui->info.set = set;
292 zsui->info.use = use;
293 zsui->info.ordinal = (zti->dictNum)++;
294 return zsui->info.ordinal;
297 ZebDatabaseInfo *zebTargetInfo_getDB (ZebTargetInfo *zti)
299 assert (zti->curDatabaseInfo);
301 return &zti->curDatabaseInfo->info;
304 void zebTargetInfo_setDB (ZebTargetInfo *zti, ZebDatabaseInfo *zdi)
306 assert (zti->curDatabaseInfo);
308 zti->curDatabaseInfo->dirty = 1;
309 memcpy (&zti->curDatabaseInfo->info, zdi, sizeof(*zdi));