Private info (buf) moved from struct rset_control to struct rset.
[idzebra-moved-to-github.git] / rset / rsisam.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: rsisam.c,v $
7  * Revision 1.13  1995-10-12 12:41:56  adam
8  * Private info (buf) moved from struct rset_control to struct rset.
9  * Bug fixes in relevance.
10  *
11  * Revision 1.12  1995/10/10  14:00:04  adam
12  * Function rset_open changed its wflag parameter to general flags.
13  *
14  * Revision 1.11  1995/10/06  14:38:05  adam
15  * New result set method: r_score.
16  * Local no (sysno) and score is transferred to retrieveCtrl.
17  *
18  * Revision 1.10  1995/09/08  14:52:42  adam
19  * Work on relevance feedback.
20  *
21  * Revision 1.9  1995/09/07  13:58:43  adam
22  * New parameter: result-set file descriptor (RSFD) to support multiple
23  * positions within the same result-set.
24  * Boolean operators: and, or, not implemented.
25  *
26  * Revision 1.8  1995/09/06  16:11:56  adam
27  * More work on boolean sets.
28  *
29  * Revision 1.7  1995/09/06  10:35:44  adam
30  * Null set implemented.
31  *
32  * Revision 1.6  1995/09/05  11:43:24  adam
33  * Complete version of temporary sets. Not tested yet though.
34  *
35  * Revision 1.5  1995/09/04  12:33:56  adam
36  * Various cleanup. YAZ util used instead.
37  *
38  * Revision 1.4  1995/09/04  09:10:55  adam
39  * Minor changes.
40  *
41  * Revision 1.3  1994/11/22  13:15:37  quinn
42  * Simple
43  *
44  * Revision 1.2  1994/11/04  14:53:12  quinn
45  * Work
46  *
47  */
48
49 #include <stdio.h>
50 #include <assert.h>
51 #include <rsisam.h>
52 #include <alexutil.h>
53
54 static void *r_create(const struct rset_control *sel, void *parms);
55 static RSFD r_open (RSET ct, int flag);
56 static void r_close (RSFD rfd);
57 static void r_delete (RSET ct);
58 static void r_rewind (RSFD rfd);
59 static int r_count (RSET ct);
60 static int r_read (RSFD rfd, void *buf);
61 static int r_write (RSFD rfd, const void *buf);
62 static int r_score (RSFD rfd, int *score);
63
64 static const rset_control control = 
65 {
66     "ISAM set type",
67     r_create,
68     r_open,
69     r_close,
70     r_delete,
71     r_rewind,
72     r_count,
73     r_read,
74     r_write,
75     r_score
76 };
77
78 const rset_control *rset_kind_isam = &control;
79
80 struct rset_ispt_info {
81     ISPT   pt;
82     struct rset_ispt_info *next;
83     struct rset_isam_info *info;
84 };
85
86 struct rset_isam_info {
87     ISAM   is;
88     ISAM_P pos;
89     struct rset_ispt_info *ispt_list;
90 };
91
92 static void *r_create(const struct rset_control *sel, void *parms)
93 {
94     rset_isam_parms *pt = parms;
95     struct rset_isam_info *info;
96
97     info = xmalloc (sizeof(struct rset_isam_info));
98     info->is = pt->is;
99     info->pos = pt->pos;
100     info->ispt_list = NULL;
101     return info;
102 }
103
104 RSFD r_open (RSET ct, int flag)
105 {
106     struct rset_isam_info *info = ct->buf;
107     struct rset_ispt_info *ptinfo;
108
109     logf (LOG_DEBUG, "risam_open");
110     if (flag & RSETF_WRITE)
111     {
112         logf (LOG_FATAL, "ISAM set type is read-only");
113         return NULL;
114     }
115     ptinfo = xmalloc (sizeof(*ptinfo));
116     ptinfo->next = info->ispt_list;
117     info->ispt_list = ptinfo;
118     ptinfo->pt = is_position (info->is, info->pos);
119     ptinfo->info = info;
120     return ptinfo;
121 }
122
123 static void r_close (RSFD rfd)
124 {
125     struct rset_isam_info *info = ((struct rset_ispt_info*) rfd)->info;
126     struct rset_ispt_info **ptinfop;
127
128     for (ptinfop = &info->ispt_list; *ptinfop; ptinfop = &(*ptinfop)->next)
129         if (*ptinfop == rfd)
130         {
131             is_pt_free ((*ptinfop)->pt);
132             *ptinfop = (*ptinfop)->next;
133             free (rfd);
134             return;
135         }
136     logf (LOG_FATAL, "r_close but no rfd match!");
137     assert (0);
138 }
139
140 static void r_delete (RSET ct)
141 {
142     struct rset_isam_info *info = ct->buf;
143
144     logf (LOG_DEBUG, "rsisam_delete");
145     assert (info->ispt_list == NULL);
146     xfree (info);
147 }
148
149 static void r_rewind (RSFD rfd)
150 {   
151     logf (LOG_DEBUG, "rsisam_rewind");
152     is_rewind( ((struct rset_ispt_info*) rfd)->pt);
153 }
154
155 static int r_count (RSET ct)
156 {
157     return 0;
158 }
159
160 static int r_read (RSFD rfd, void *buf)
161 {
162     return is_readkey( ((struct rset_ispt_info*) rfd)->pt, buf);
163 }
164
165 static int r_write (RSFD rfd, const void *buf)
166 {
167     logf (LOG_FATAL, "ISAM set type is read-only");
168     return -1;
169 }
170
171 static int r_score (RSFD rfd, int *score)
172 {
173     *score = -1;
174     return -1;
175 }