X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frsm_or.c;fp=rset%2Frsm_or.c;h=0000000000000000000000000000000000000000;hb=70effaa5a4a18f1bef9c6111dc082bb8714e4c19;hp=dee79551bc196290d8f9b7c2399a948f84bda943;hpb=cbb800ea790752fe39645979811e1b9a03dafbbc;p=idzebra-moved-to-github.git diff --git a/rset/rsm_or.c b/rset/rsm_or.c deleted file mode 100644 index dee7955..0000000 --- a/rset/rsm_or.c +++ /dev/null @@ -1,341 +0,0 @@ -/* $Id: rsm_or.c,v 1.20 2004-08-20 14:44:46 heikki Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 - Index Data Aps - -This file is part of the Zebra server. - -Zebra is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -Zebra is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. -*/ - - - - -#include -#include -#include -#include - -#include -#include -#include - -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); -static int r_write (RSFD rfd, const void *buf); - -static const struct rset_control control = -{ - "m-or (old)", - r_create, - r_open, - r_close, - r_delete, - r_rewind, - rset_default_forward, /* FIXME */ - rset_default_pos, /* FIXME */ - r_read, - r_write, -}; - -const struct rset_control *rset_kind_m_or = &control; - -struct rset_mor_info { - int key_size; - int no_rec; - int (*cmp)(const void *p1, const void *p2); - ISAMC isc; - ISAMC_P *isam_positions; - - int no_isam_positions; - int no_save_positions; - struct rset_mor_rfd *rfd_list; -}; - -struct trunc_info { - int *ptr; - int *indx; - char **heap; - int heapnum; - int (*cmp)(const void *p1, const void *p2); - int keysize; - char *swapbuf; - char *tmpbuf; - char *buf; -}; - -struct rset_mor_rfd { - int flag; - int position; - int position_max; - ISAMC_PP *ispt; - struct rset_mor_rfd *next; - struct rset_mor_info *info; - struct trunc_info *ti; - char *pbuf; -}; - -static void heap_swap (struct trunc_info *ti, int i1, int i2) -{ - int swap; - - swap = ti->ptr[i1]; - ti->ptr[i1] = ti->ptr[i2]; - ti->ptr[i2] = swap; -} - -static void heap_delete (struct trunc_info *ti) -{ - int cur = 1, child = 2; - - heap_swap (ti, 1, ti->heapnum--); - while (child <= ti->heapnum) { - if (child < ti->heapnum && - (*ti->cmp)(ti->heap[ti->ptr[child]], - ti->heap[ti->ptr[1+child]]) > 0) - child++; - if ((*ti->cmp)(ti->heap[ti->ptr[cur]], - ti->heap[ti->ptr[child]]) > 0) - { - heap_swap (ti, cur, child); - cur = child; - child = 2*cur; - } - else - break; - } -} - -static void heap_insert (struct trunc_info *ti, const char *buf, int indx) -{ - int cur, parent; - - cur = ++(ti->heapnum); - memcpy (ti->heap[ti->ptr[cur]], buf, ti->keysize); - ti->indx[ti->ptr[cur]] = indx; - parent = cur/2; - while (parent && (*ti->cmp)(ti->heap[ti->ptr[parent]], - ti->heap[ti->ptr[cur]]) > 0) - { - heap_swap (ti, cur, parent); - cur = parent; - parent = cur/2; - } -} - -static -struct trunc_info *heap_init (int size, int key_size, - int (*cmp)(const void *p1, const void *p2)) -{ - struct trunc_info *ti = (struct trunc_info *) xmalloc (sizeof(*ti)); - int i; - - ++size; - ti->heapnum = 0; - ti->keysize = key_size; - ti->cmp = cmp; - ti->indx = (int *) xmalloc (size * sizeof(*ti->indx)); - ti->heap = (char **) xmalloc (size * sizeof(*ti->heap)); - ti->ptr = (int *) xmalloc (size * sizeof(*ti->ptr)); - ti->swapbuf = (char *) xmalloc (ti->keysize); - ti->tmpbuf = (char *) xmalloc (ti->keysize); - ti->buf = (char *) xmalloc (size * ti->keysize); - for (i = size; --i >= 0; ) - { - ti->ptr[i] = i; - ti->heap[i] = ti->buf + ti->keysize * i; - } - return ti; -} - -static void heap_close (struct trunc_info *ti) -{ - xfree (ti->buf); - xfree (ti->ptr); - xfree (ti->indx); - xfree (ti->heap); - xfree (ti->swapbuf); - xfree (ti->tmpbuf); - xfree (ti); -} - -static void *r_create (RSET ct, const struct rset_control *sel, void *parms) -{ - rset_m_or_parms *r_parms = (rset_m_or_parms *) parms; - struct rset_mor_info *info; - - ct->flags |= RSET_FLAG_VOLATILE; - info = (struct rset_mor_info *) xmalloc (sizeof(*info)); - info->key_size = r_parms->key_size; - assert (info->key_size > 1); - info->cmp = r_parms->cmp; - - info->no_save_positions = r_parms->no_save_positions; - - info->isc = r_parms->isc; - info->no_isam_positions = r_parms->no_isam_positions; - info->isam_positions = (ISAMC_P *) - xmalloc (sizeof(*info->isam_positions) * info->no_isam_positions); - memcpy (info->isam_positions, r_parms->isam_positions, - sizeof(*info->isam_positions) * info->no_isam_positions); - info->rfd_list = NULL; - - 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; -} - -static RSFD r_open (RSET ct, int flag) -{ - struct rset_mor_rfd *rfd; - struct rset_mor_info *info = (struct rset_mor_info *) ct->buf; - int i; - - if (flag & RSETF_WRITE) - { - logf (LOG_FATAL, "m_or set type is read-only"); - return NULL; - } - rfd = (struct rset_mor_rfd *) xmalloc (sizeof(*rfd)); - rfd->flag = flag; - rfd->next = info->rfd_list; - rfd->info = info; - info->rfd_list = rfd; - - rfd->ispt = (ISAMC_PP *) - xmalloc (sizeof(*rfd->ispt) * info->no_isam_positions); - - rfd->ti = heap_init (info->no_isam_positions, info->key_size, info->cmp); - - ct->rset_terms[0]->nn = 0; - for (i = 0; ino_isam_positions; i++) - { - rfd->ispt[i] = isc_pp_open (info->isc, info->isam_positions[i]); - - ct->rset_terms[0]->nn += isc_pp_num (rfd->ispt[i]); - - if (isc_pp_read (rfd->ispt[i], rfd->ti->tmpbuf)) - heap_insert (rfd->ti, rfd->ti->tmpbuf, i); - else - { - isc_pp_close (rfd->ispt[i]); - rfd->ispt[i] = NULL; - } - } - rfd->position = info->no_save_positions; - rfd->pbuf = 0; - r_rewind (rfd); - return rfd; -} - -static void r_close (RSFD rfd) -{ - struct rset_mor_info *info = ((struct rset_mor_rfd*)rfd)->info; - struct rset_mor_rfd **rfdp; - int i; - - for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next) - if (*rfdp == rfd) - { - *rfdp = (*rfdp)->next; - - heap_close (((struct rset_mor_rfd *) rfd)->ti); - for (i = 0; ino_isam_positions; i++) - if (((struct rset_mor_rfd *) rfd)->ispt[i]) - isc_pp_close (((struct rset_mor_rfd *) rfd)->ispt[i]); - xfree (((struct rset_mor_rfd *)rfd)->ispt); - xfree (((struct rset_mor_rfd *)rfd)->pbuf); - xfree (rfd); - return; - } - logf (LOG_FATAL, "r_close but no rfd match!"); - assert (0); -} - -static void r_delete (RSET ct) -{ - struct rset_mor_info *info = (struct rset_mor_info *) ct->buf; - assert (info->rfd_list == NULL); - xfree (info->isam_positions); - xfree (info); -} - -static void r_rewind (RSFD rfd) -{ -} - - -static int r_read (RSFD rfd, void *buf) -{ - struct rset_mor_rfd *mrfd = (struct rset_mor_rfd *) rfd; - struct trunc_info *ti = mrfd->ti; - int n = ti->indx[ti->ptr[1]]; - - if (!ti->heapnum) - return 0; - memcpy (buf, ti->heap[ti->ptr[1]], ti->keysize); - if (((struct rset_mor_rfd *) rfd)->position) - { - if (isc_pp_read (((struct rset_mor_rfd *) rfd)->ispt[n], ti->tmpbuf)) - { - heap_delete (ti); - if ((*ti->cmp)(ti->tmpbuf, ti->heap[ti->ptr[1]]) > 1) - ((struct rset_mor_rfd *) rfd)->position--; - heap_insert (ti, ti->tmpbuf, n); - } - else - heap_delete (ti); - rfd->pbuf = xmalloc (info->key_size); - if (mrfd->countp && ( - *mrfd->countp == 0 || (*ti->cmp)(buf, mrfd->pbuf) > 1)) - { - memcpy (mrfd->pbuf, buf, ti->keysize); - (*mrfd->countp)++; - } - return 1; - } - while (1) - { - if (!isc_pp_read (((struct rset_mor_rfd *) rfd)->ispt[n], ti->tmpbuf)) - { - heap_delete (ti); - break; - } - if ((*ti->cmp)(ti->tmpbuf, ti->heap[ti->ptr[1]]) > 1) - { - heap_delete (ti); - heap_insert (ti, ti->tmpbuf, n); - break; - } - } - if (mrfd->countp && ( - *mrfd->countp == 0 || (*ti->cmp)(buf, mrfd->pbuf) > 1)) - { - memcpy (mrfd->pbuf, buf, ti->keysize); - (*mrfd->countp)++; - } - return 1; -} - -static int r_write (RSFD rfd, const void *buf) -{ - logf (LOG_FATAL, "mor set type is read-only"); - return -1; -}