File: limit.c

package info (click to toggle)
idzebra 2.2.10-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 10,644 kB
  • sloc: ansic: 54,389; xml: 27,054; sh: 6,211; makefile: 1,099; perl: 210; tcl: 64
file content (132 lines) | stat: -rw-r--r-- 3,296 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* This file is part of the Zebra server.
   Copyright (C) Index Data

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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

*/

#if HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <assert.h>

#include <yaz/xmalloc.h>
#include <yaz/diagbib1.h>
#include "index.h"

#define ZEBRA_LIMIT_DEBUG 0

struct zebra_limit {
    int complement_flag;
    zint *ids;
};

void zebra_limit_destroy(struct zebra_limit *zl)
{
    if (zl)
    {
        xfree(zl->ids);
        xfree(zl);
    }
}

struct zebra_limit *zebra_limit_create(int complement_flag, zint *ids)
{
    struct zebra_limit *zl = 0;
    size_t i;
    if (ids)
    {
        for (i = 0; ids[i]; i++)
            ;
        zl = xmalloc(sizeof(*zl));
        zl->ids = xmalloc((i+1) * sizeof(*ids));
        memcpy(zl->ids, ids, (i+1) * sizeof(*ids));
        zl->complement_flag = complement_flag;
    }
    return zl;
}

static int zebra_limit_filter_cb(const void *buf, void *data)
{
    struct zebra_limit *zl = data;
    const struct it_key *key = buf;
    size_t i;

#if ZEBRA_LIMIT_DEBUG
    yaz_log(YLOG_LOG, "zebra_limit_filter_cb zl=%p key->len=%d", zl, key->len);
#endif
    for (i = 0; zl->ids[i]; i++)
    {
#if ZEBRA_LIMIT_DEBUG
        yaz_log(YLOG_LOG, " i=%d ids=" ZINT_FORMAT " mem=" ZINT_FORMAT,
                i, zl->ids[i], key->mem[1]);
#endif
        if (zl->ids[i] == key->mem[1])
        {
#if ZEBRA_LIMIT_DEBUG
            yaz_log(YLOG_LOG, " match. Ret=%d", zl->complement_flag ? 0:1);
#endif
            return zl->complement_flag ? 0 : 1;
        }
    }
#if ZEBRA_LIMIT_DEBUG
    yaz_log(YLOG_LOG, " no match. Ret=%d", zl->complement_flag ? 1:0);
#endif
    return zl->complement_flag ? 1 : 0;
}

static void zebra_limit_destroy_cb(void *data)
{
    zebra_limit_destroy(data);
}

void zebra_limit_for_rset(struct zebra_limit *zl,
                          int (**filter_func)(const void *buf, void *data),
                          void (**filter_destroy)(void *data),
                          void **filter_data)
{
#if ZEBRA_LIMIT_DEBUG
    yaz_log(YLOG_LOG, "zebra_limit_for_rset debug enabled zl=%p", zl);
#endif
    if (zl && zl->ids)
    {
        struct zebra_limit *hl;

#if ZEBRA_LIMIT_DEBUG
        yaz_log(YLOG_LOG, "enable limit");
#endif
        hl = zebra_limit_create(zl->complement_flag, zl->ids);
        *filter_data = hl;
        *filter_func = zebra_limit_filter_cb;
        *filter_destroy = zebra_limit_destroy_cb;
    }
    else
    {
        *filter_data = 0;
        *filter_func = 0;
        *filter_destroy = 0;
    }
}

/*
 * Local variables:
 * c-basic-offset: 4
 * c-file-style: "Stroustrup"
 * indent-tabs-mode: nil
 * End:
 * vim: shiftwidth=4 tabstop=8 expandtab
 */