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