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