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