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