New parameter: result-set file descriptor (RSFD) to support multiple
[idzebra-moved-to-github.git] / index / zsets.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: zsets.c,v $
7  * Revision 1.4  1995-09-07 13:58:36  adam
8  * New parameter: result-set file descriptor (RSFD) to support multiple
9  * positions within the same result-set.
10  * Boolean operators: and, or, not implemented.
11  * Result-set references.
12  *
13  * Revision 1.3  1995/09/06  16:11:19  adam
14  * Option: only one word key per file.
15  *
16  * Revision 1.2  1995/09/06  10:33:04  adam
17  * More work on present. Some log messages removed.
18  *
19  * Revision 1.1  1995/09/05  15:28:40  adam
20  * More work on search engine.
21  *
22  */
23 #include <stdio.h>
24 #include <assert.h>
25 #include <unistd.h>
26
27 #include "zserver.h"
28 #include <rstemp.h>
29
30 ZServerSet *resultSetAdd (ZServerInfo *zi, const char *name, int ov, RSET rset)
31 {
32     ZServerSet *s;
33
34     for (s = zi->sets; s; s = s->next)
35         if (!strcmp (s->name, name))
36         {
37             if (!ov)
38                 return NULL;
39             rset_delete (s->rset);
40             s->rset = rset;
41             return s;
42         }
43     s = xmalloc (sizeof(*s));
44     s->next = zi->sets;
45     zi->sets = s;
46     s->name = xmalloc (strlen(name)+1);
47     strcpy (s->name, name);
48     s->rset = rset;
49     return s;
50 }
51
52 ZServerSet *resultSetGet (ZServerInfo *zi, const char *name)
53 {
54     ZServerSet *s;
55
56     for (s = zi->sets; s; s = s->next)
57         if (!strcmp (s->name, name))
58             return s;
59     return NULL;
60 }
61
62 ZServerRecord *resultSetRecordGet (ZServerInfo *zi, const char *name, 
63                                    int num, int *positions)
64 {
65     ZServerSet *sset;
66     ZServerRecord *sr;
67     RSET rset;
68     int num_i = 0;
69     int position = 0;
70     int psysno = 0;
71     struct it_key key;
72     RSFD rfd;
73
74     if (!(sset = resultSetGet (zi, name)))
75         return NULL;
76     if (!(rset = sset->rset))
77         return NULL;
78     logf (LOG_DEBUG, "resultSetRecordGet");
79     sr = xmalloc (sizeof(*sr) * num);
80     rfd = rset_open (rset, 0);
81     while (rset_read (rset, rfd, &key))
82     {
83         if (key.sysno != psysno)
84         {
85             psysno = key.sysno;
86             position++;
87             if (position == positions[num_i])
88             {
89                 FILE *inf;
90                 char fname[SYS_IDX_ENTRY_LEN];
91
92                 sr[num_i].buf = NULL;
93                 if (lseek (zi->sys_idx_fd, psysno * SYS_IDX_ENTRY_LEN,
94                            SEEK_SET) == -1)
95                 {
96                     logf (LOG_FATAL|LOG_ERRNO, "lseek of sys_idx");
97                     exit (1);
98                 }
99                 if (read (zi->sys_idx_fd, fname, SYS_IDX_ENTRY_LEN) == -1)
100                 {
101                     logf (LOG_FATAL|LOG_ERRNO, "read of sys_idx");
102                     exit (1);
103                 }
104                 if (!(inf = fopen (fname, "r")))
105                     logf (LOG_WARN, "fopen: %s", fname);
106                 else
107                 {
108                     long size;
109
110                     fseek (inf, 0L, SEEK_END);
111                     size = ftell (inf);
112                     fseek (inf, 0L, SEEK_SET);
113                     logf (LOG_DEBUG, "get sysno=%d, fname=%s, size=%ld",
114                           psysno, fname, (long) size);
115                     sr[num_i].buf = xmalloc (size+1);
116                     sr[num_i].size = size;
117                     sr[num_i].buf[size] = '\0';
118                     if (fread (sr[num_i].buf, size, 1, inf) != 1)
119                     {
120                         logf (LOG_FATAL|LOG_ERRNO, "fread %s", fname);
121                         exit (1);
122                     }
123                     fclose (inf);
124                 }
125                 num_i++;
126                 if (num_i == num)
127                     break;
128             }
129         }
130     }
131     rset_close (rset, rfd);
132     while (num_i < num)
133     {
134         sr[num_i].buf = NULL;
135         sr[num_i].size = 0;
136         num_i++;
137     }
138     return sr;
139 }
140
141 void resultSetRecordDel (ZServerInfo *zi, ZServerRecord *records, int num)
142 {
143     int i;
144
145     for (i = 0; i<num; i++)
146         free (records[i].buf);
147     free (records);
148 }