2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.6 1995-09-28 09:19:49 adam
8 * xfree/xmalloc used everywhere.
9 * Extract/retrieve method seems to work for text records.
11 * Revision 1.5 1995/09/27 16:17:32 adam
12 * More work on retrieve.
14 * Revision 1.4 1995/09/07 13:58:36 adam
15 * New parameter: result-set file descriptor (RSFD) to support multiple
16 * positions within the same result-set.
17 * Boolean operators: and, or, not implemented.
18 * Result-set references.
20 * Revision 1.3 1995/09/06 16:11:19 adam
21 * Option: only one word key per file.
23 * Revision 1.2 1995/09/06 10:33:04 adam
24 * More work on present. Some log messages removed.
26 * Revision 1.1 1995/09/05 15:28:40 adam
27 * More work on search engine.
37 ZServerSet *resultSetAdd (ZServerInfo *zi, const char *name, int ov, RSET rset)
41 for (s = zi->sets; s; s = s->next)
42 if (!strcmp (s->name, name))
46 rset_delete (s->rset);
50 s = xmalloc (sizeof(*s));
53 s->name = xmalloc (strlen(name)+1);
54 strcpy (s->name, name);
59 ZServerSet *resultSetGet (ZServerInfo *zi, const char *name)
63 for (s = zi->sets; s; s = s->next)
64 if (!strcmp (s->name, name))
69 ZServerSetSysno *resultSetSysnoGet (ZServerInfo *zi, const char *name,
70 int num, int *positions)
81 if (!(sset = resultSetGet (zi, name)))
83 if (!(rset = sset->rset))
85 logf (LOG_DEBUG, "resultSetRecordGet");
86 sr = xmalloc (sizeof(*sr) * num);
87 rfd = rset_open (rset, 0);
88 while (rset_read (rset, rfd, &key))
90 if (key.sysno != psysno)
94 if (position == positions[num_i])
96 sr[num_i].sysno = psysno;
103 rset_close (rset, rfd);
112 void resultSetRecordDel (ZServerInfo *zi, ZServerRecord *records, int num)
116 for (i = 0; i<num; i++)
117 xfree (records[i].buf);
123 ZServerSetSysno *resultSetSysno (ZServerInfo *zi, const char *name,
124 int num, int *positions)
135 if (!(sset = resultSetGet (zi, name)))
137 if (!(rset = sset->rset))
139 logf (LOG_DEBUG, "resultSetRecordGet");
140 sr = xmalloc (sizeof(*sr) * num);
141 rfd = rset_open (rset, 0);
142 while (rset_read (rset, rfd, &key))
144 if (key.sysno != psysno)
148 if (position == positions[num_i])
151 char fname[SYS_IDX_ENTRY_LEN];
153 sr[num_i].buf = NULL;
154 if (lseek (zi->sys_idx_fd, psysno * SYS_IDX_ENTRY_LEN,
157 logf (LOG_FATAL|LOG_ERRNO, "lseek of sys_idx");
160 if (read (zi->sys_idx_fd, fname, SYS_IDX_ENTRY_LEN) == -1)
162 logf (LOG_FATAL|LOG_ERRNO, "read of sys_idx");
165 if (!(inf = fopen (fname, "r")))
166 logf (LOG_WARN, "fopen: %s", fname);
171 fseek (inf, 0L, SEEK_END);
173 fseek (inf, 0L, SEEK_SET);
174 logf (LOG_DEBUG, "get sysno=%d, fname=%s, size=%ld",
175 psysno, fname, (long) size);
176 sr[num_i].buf = xmalloc (size+1);
177 sr[num_i].size = size;
178 sr[num_i].buf[size] = '\0';
179 if (fread (sr[num_i].buf, size, 1, inf) != 1)
181 logf (LOG_FATAL|LOG_ERRNO, "fread %s", fname);
192 rset_close (rset, rfd);
195 sr[num_i].buf = NULL;