-/* $Id: rsmultior.c,v 1.3 2004-08-19 14:11:54 heikki Exp $
+/* $Id: rsmultior.c,v 1.6 2004-08-24 14:25:16 heikki Exp $
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
Index Data Aps
#include <isamc.h>
#include <rsmultior.h>
-static void *r_create(RSET ct, const struct rset_control *sel, void *parms);
static RSFD r_open (RSET ct, int flag);
static void r_close (RSFD rfd);
static void r_delete (RSET ct);
static void r_rewind (RSFD rfd);
-static int r_read (RSFD rfd, void *buf, int *term_index);
+static int r_read (RSFD rfd, void *buf);
static int r_write (RSFD rfd, const void *buf);
-static int r_forward(RSET ct, RSFD rfd, void *buf, int *term_index,
+static int r_forward(RSET ct, RSFD rfd, void *buf,
int (*cmpfunc)(const void *p1, const void *p2),
const void *untilbuf);
static void r_pos (RSFD rfd, double *current, double *total);
static const struct rset_control control =
{
"multi-or",
- r_create,
r_open,
r_close,
r_delete,
int (*cmp)(const void *p1, const void *p2);
int no_rsets;
RSET *rsets;
- int term_index;
struct rset_multior_rfd *rfd_list;
};
HEAP h;
struct rset_multior_rfd *next;
struct rset_multior_info *info;
- zint *countp; /* inc at every new record we see */
zint hits; /* returned so far */
char *prevvalue; /* to see if we are in another record */
+ /* FIXME - is this really needed? */
};
#if 0
}
+RSET rsmultior_create( NMEM nmem, int key_size,
+ int (*cmp)(const void *p1, const void *p2),
+ int no_rsets, RSET* rsets)
+{
+ RSET rnew=rset_create_base(&control, nmem);
+ struct rset_multior_info *info;
+ info = (struct rset_multior_info *) nmem_malloc(rnew->nmem,sizeof(*info));
+ info->key_size = key_size;
+ info->cmp = cmp;
+ info->no_rsets=no_rsets;
+ info->rsets=(RSET*)nmem_malloc(rnew->nmem, no_rsets*sizeof(*rsets));
+ memcpy(info->rsets,rsets,no_rsets*sizeof(*rsets));
+ info->rfd_list = NULL;
+ rnew->priv=info;
+ return rnew;
+}
+
+static void r_delete (RSET ct)
+{
+ struct rset_multior_info *info = (struct rset_multior_info *) ct->priv;
+ int i;
+
+ assert (info->rfd_list == NULL);
+ for(i=0;i<info->no_rsets;i++)
+ rset_delete(info->rsets[i]);
+/* xfree(info->rsets); */ /* nmem'd */
+/* xfree(info); */ /* nmem'd */
+}
+#if 0
static void *r_create (RSET ct, const struct rset_control *sel, void *parms)
{
rset_multior_parms *r_parms = (rset_multior_parms *) parms;
struct rset_multior_info *info;
-
- ct->flags |= RSET_FLAG_VOLATILE;
- /* FIXME - Remove the whole flags thing, from all rsets */
info = (struct rset_multior_info *) xmalloc (sizeof(*info));
info->key_size = r_parms->key_size;
assert (info->key_size > 1);
info->no_rsets= r_parms->no_rsets;
info->rsets=r_parms->rsets; /* now we own it! */
info->rfd_list=0;
- info->term_index=0 ; /* r_parms->rset_term; */ /*??*/ /*FIXME */
- ct->no_rset_terms = 1;
- ct->rset_terms = (RSET_TERM *) xmalloc (sizeof(*ct->rset_terms));
- ct->rset_terms[0] = r_parms->rset_term;
return info;
}
+#endif
static RSFD r_open (RSET ct, int flag)
{
struct rset_multior_rfd *rfd;
- struct rset_multior_info *info = (struct rset_multior_info *) ct->buf;
+ struct rset_multior_info *info = (struct rset_multior_info *) ct->priv;
int i;
- int dummy_termindex;
if (flag & RSETF_WRITE)
{
rfd->next = info->rfd_list;
rfd->info = info;
info->rfd_list = rfd;
- if (ct->no_rset_terms==1)
- rfd->countp=&ct->rset_terms[0]->count;
- else
- rfd->countp=0;
rfd->h = heap_create( info->no_rsets, info->key_size, info->cmp);
rfd->prevvalue=0;
rfd->hits=0;
rfd->items[i].fd=rset_open(info->rsets[i],RSETF_READ);
/* if (item_readbuf(&(rfd->items[i]))) */
if ( rset_read(rfd->items[i].rset, rfd->items[i].fd,
- rfd->items[i].buf, &dummy_termindex) )
+ rfd->items[i].buf) )
heap_insert(rfd->h, &(rfd->items[i]));
}
return rfd;
assert (0);
}
-static void r_delete (RSET ct)
-{
- struct rset_multior_info *info = (struct rset_multior_info *) ct->buf;
- int i;
-
- assert (info->rfd_list == NULL);
- for(i=0;i<info->no_rsets;i++)
- rset_delete(info->rsets[i]);
- xfree(info->rsets);
- xfree(info);
-
- for (i = 0; i<ct->no_rset_terms; i++) /* usually only 1 */
- rset_term_destroy (ct->rset_terms[i]);
- xfree (ct->rset_terms);
-}
static void r_rewind (RSFD rfd)
{
}
-static int r_forward(RSET ct, RSFD rfd, void *buf, int *term_index,
+static int r_forward(RSET ct, RSFD rfd, void *buf,
int (*cmpfunc)(const void *p1, const void *p2),
const void *untilbuf)
{
struct rset_multior_info *info = mrfd->info;
struct heap_item it;
int rdres;
- int dummycount=0;
if (heap_empty(mrfd->h))
return 0;
if (cmpfunc)
assert(cmpfunc==mrfd->info->cmp);
- *term_index=0;
it = *(mrfd->h->heap[1]);
memcpy(buf,it.buf, info->key_size);
(mrfd->hits)++;
- if (mrfd->countp) {
- if (mrfd->prevvalue) { /* in another record */
- if ( (*mrfd->info->cmp)(mrfd->prevvalue,it.buf) < -1)
- (*mrfd->countp)++;
- } else {
- mrfd->prevvalue=xmalloc(info->key_size);
- (*mrfd->countp)++;
- }
- memcpy(mrfd->prevvalue,it.buf, info->key_size);
- }
if (untilbuf)
- rdres=rset_forward(it.rset, it.fd, it.buf, &dummycount,
- cmpfunc,untilbuf);
+ rdres=rset_forward(it.rset, it.fd, it.buf, cmpfunc,untilbuf);
else
- rdres=rset_read(it.rset, it.fd, it.buf, &dummycount);
+ rdres=rset_read(it.rset, it.fd, it.buf);
if ( rdres )
heap_balance(mrfd->h);
else
}
-static int r_read (RSFD rfd, void *buf, int *term_index)
+static int r_read (RSFD rfd, void *buf)
{
- return r_forward(0,rfd, buf, term_index,0,0);
+ return r_forward(0,rfd, buf,0,0);
}
static void r_pos (RSFD rfd, double *current, double *total)