Build for Ubuntu precise, no build for maverick
[idzebra-moved-to-github.git] / index / limit.c
index 36a94f8..1647600 100644 (file)
@@ -1,8 +1,5 @@
-/* $Id: limit.c,v 1.2 2005-05-09 10:16:13 adam Exp $
-   Copyright (C) 1995-2005
-   Index Data ApS
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+   Copyright (C) 1994-2011 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
@@ -15,11 +12,14 @@ 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.
+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>
 
@@ -27,6 +27,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <yaz/diagbib1.h>
 #include "index.h"
 
+#define ZEBRA_LIMIT_DEBUG 0
+
 struct zebra_limit {
     int complement_flag;
     zint *ids;
@@ -45,10 +47,10 @@ struct zebra_limit *zebra_limit_create(int complement_flag, zint *ids)
 {
     struct zebra_limit *zl = 0;
     size_t i;
-    for (i = 0; ids && ids[i]; i++)
-       ;
-    if (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));
@@ -63,12 +65,27 @@ static int zebra_limit_filter_cb(const void *buf, void *data)
     const struct it_key *key = buf;
     size_t i;
 
-    if (key->len != 3)
-       return 1;
+#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;
-    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)
@@ -81,10 +98,16 @@ void zebra_limit_for_rset(struct zebra_limit *zl,
                          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;
@@ -98,3 +121,12 @@ void zebra_limit_for_rset(struct zebra_limit *zl,
     }
 }
                          
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+