2 * Copyright (C) 1994-2002, Index Data
5 * $Id: rsisam.c,v 1.22 2002-04-05 08:46:26 adam Exp $
12 static void *r_create(RSET ct, const struct rset_control *sel, void *parms);
13 static RSFD r_open (RSET ct, int flag);
14 static void r_close (RSFD rfd);
15 static void r_delete (RSET ct);
16 static void r_rewind (RSFD rfd);
17 static int r_count (RSET ct);
18 static int r_read (RSFD rfd, void *buf, int *term_index);
19 static int r_write (RSFD rfd, const void *buf);
21 static const struct rset_control control =
34 const struct rset_control *rset_kind_isam = &control;
36 struct rset_ispt_info {
38 struct rset_ispt_info *next;
39 struct rset_isam_info *info;
42 struct rset_isam_info {
45 struct rset_ispt_info *ispt_list;
48 static void *r_create(RSET ct, const struct rset_control *sel, void *parms)
50 rset_isam_parms *pt = (rset_isam_parms *) parms;
51 struct rset_isam_info *info;
53 ct->flags |= RSET_FLAG_VOLATILE;
54 info = (struct rset_isam_info *) xmalloc (sizeof(struct rset_isam_info));
57 info->ispt_list = NULL;
59 ct->no_rset_terms = 1;
60 ct->rset_terms = (RSET_TERM *) xmalloc (sizeof(*ct->rset_terms));
61 ct->rset_terms[0] = pt->rset_term;
65 RSFD r_open (RSET ct, int flag)
67 struct rset_isam_info *info = (struct rset_isam_info *) ct->buf;
68 struct rset_ispt_info *ptinfo;
70 logf (LOG_DEBUG, "risam_open");
71 if (flag & RSETF_WRITE)
73 logf (LOG_FATAL, "ISAM set type is read-only");
76 ptinfo = (struct rset_ispt_info *) xmalloc (sizeof(*ptinfo));
77 ptinfo->next = info->ispt_list;
78 info->ispt_list = ptinfo;
79 ptinfo->pt = is_position (info->is, info->pos);
82 if (ct->rset_terms[0]->nn < 0)
83 ct->rset_terms[0]->nn = is_numkeys (ptinfo->pt);
87 static void r_close (RSFD rfd)
89 struct rset_isam_info *info = ((struct rset_ispt_info*) rfd)->info;
90 struct rset_ispt_info **ptinfop;
92 for (ptinfop = &info->ispt_list; *ptinfop; ptinfop = &(*ptinfop)->next)
95 is_pt_free ((*ptinfop)->pt);
96 *ptinfop = (*ptinfop)->next;
100 logf (LOG_FATAL, "r_close but no rfd match!");
104 static void r_delete (RSET ct)
106 struct rset_isam_info *info = (struct rset_isam_info *) ct->buf;
108 logf (LOG_DEBUG, "rsisam_delete");
109 assert (info->ispt_list == NULL);
110 rset_term_destroy (ct->rset_terms[0]);
111 xfree (ct->rset_terms);
115 static void r_rewind (RSFD rfd)
117 logf (LOG_DEBUG, "rsisam_rewind");
118 is_rewind( ((struct rset_ispt_info*) rfd)->pt);
121 static int r_count (RSET ct)
126 static int r_read (RSFD rfd, void *buf, int *term_index)
129 return is_readkey( ((struct rset_ispt_info*) rfd)->pt, buf);
132 static int r_write (RSFD rfd, const void *buf)
134 logf (LOG_FATAL, "ISAM set type is read-only");