1a3ec60fcf3f0e187eb79c6343e6536d8a8d7685
[idzebra-moved-to-github.git] / rset / rsisams.c
1 /*
2  * Copyright (C) 1994-1999, Index Data
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: rsisams.c,v $
7  * Revision 1.1  1999-05-12 15:24:25  adam
8  * First version of ISAMS.
9  *
10  */
11
12 #include <stdio.h>
13 #include <assert.h>
14 #include <rsisams.h>
15 #include <zebrautl.h>
16
17 static void *r_create(RSET ct, const struct rset_control *sel, void *parms);
18 static RSFD r_open (RSET ct, int flag);
19 static void r_close (RSFD rfd);
20 static void r_delete (RSET ct);
21 static void r_rewind (RSFD rfd);
22 static int r_count (RSET ct);
23 static int r_read (RSFD rfd, void *buf, int *term_index);
24 static int r_write (RSFD rfd, const void *buf);
25
26 static const struct rset_control control = 
27 {
28     "isams",
29     r_create,
30     r_open,
31     r_close,
32     r_delete,
33     r_rewind,
34     r_count,
35     r_read,
36     r_write,
37 };
38
39 const struct rset_control *rset_kind_isams = &control;
40
41 struct rset_pp_info {
42     ISAMS_PP pt;
43     struct rset_pp_info *next;
44     struct rset_isams_info *info;
45 };
46
47 struct rset_isams_info {
48     ISAMS   is;
49     ISAMS_P pos;
50     struct rset_pp_info *ispt_list;
51 };
52
53 static void *r_create(RSET ct, const struct rset_control *sel, void *parms)
54 {
55     rset_isams_parms *pt = parms;
56     struct rset_isams_info *info;
57
58     ct->flags |= RSET_FLAG_VOLATILE;
59     info = xmalloc (sizeof(*info));
60     info->is = pt->is;
61     info->pos = pt->pos;
62     info->ispt_list = NULL;
63     ct->no_rset_terms = 1;
64     ct->rset_terms = xmalloc (sizeof(*ct->rset_terms));
65     ct->rset_terms[0] = pt->rset_term;
66     return info;
67 }
68
69 RSFD r_open (RSET ct, int flag)
70 {
71     struct rset_isams_info *info = ct->buf;
72     struct rset_pp_info *ptinfo;
73
74     logf (LOG_DEBUG, "risams_open");
75     if (flag & RSETF_WRITE)
76     {
77         logf (LOG_FATAL, "ISAMS set type is read-only");
78         return NULL;
79     }
80     ptinfo = xmalloc (sizeof(*ptinfo));
81     ptinfo->next = info->ispt_list;
82     info->ispt_list = ptinfo;
83     ptinfo->pt = isams_pp_open (info->is, info->pos);
84     ptinfo->info = info;
85     if (ct->rset_terms[0]->nn < 0)
86         ct->rset_terms[0]->nn = isams_pp_num (ptinfo->pt);
87     return ptinfo;
88 }
89
90 static void r_close (RSFD rfd)
91 {
92     struct rset_isams_info *info = ((struct rset_pp_info*) rfd)->info;
93     struct rset_pp_info **ptinfop;
94
95     for (ptinfop = &info->ispt_list; *ptinfop; ptinfop = &(*ptinfop)->next)
96         if (*ptinfop == rfd)
97         {
98             isams_pp_close ((*ptinfop)->pt);
99             *ptinfop = (*ptinfop)->next;
100             xfree (rfd);
101             return;
102         }
103     logf (LOG_FATAL, "r_close but no rfd match!");
104     assert (0);
105 }
106
107 static void r_delete (RSET ct)
108 {
109     struct rset_isams_info *info = ct->buf;
110
111     logf (LOG_DEBUG, "rsisams_delete");
112     assert (info->ispt_list == NULL);
113     rset_term_destroy (ct->rset_terms[0]);
114     xfree (ct->rset_terms);
115     xfree (info);
116 }
117
118 static void r_rewind (RSFD rfd)
119 {   
120     logf (LOG_DEBUG, "rsisams_rewind");
121     abort ();
122 }
123
124 static int r_count (RSET ct)
125 {
126     return 0;
127 }
128
129 static int r_read (RSFD rfd, void *buf, int *term_index)
130 {
131     *term_index = 0;
132     return isams_pp_read( ((struct rset_pp_info*) rfd)->pt, buf);
133 }
134
135 static int r_write (RSFD rfd, const void *buf)
136 {
137     logf (LOG_FATAL, "ISAMS set type is read-only");
138     return -1;
139 }