The upgrade to automake 1.8/1.9 causes the product dist to be called
[yazpp-moved-to-github.git] / src / yaz-z-cache.cpp
index 1468b7d..fd35f7c 100644 (file)
@@ -1,21 +1,24 @@
 /*
- * Copyright (c) 2002-2003, Index Data.
+ * Copyright (c) 2002-2004, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-z-cache.cpp,v 1.6 2003-10-08 08:52:59 adam Exp $
+ * $Id: yaz-z-cache.cpp,v 1.15 2006-03-29 13:14:18 adam Exp $
  */
 
 #include <yaz/log.h>
-#include <yaz++/proxy.h>
+#include <yaz/proto.h>
+#include <yazpp/record-cache.h>
 
-struct Yaz_RecordCache_Entry {
+using namespace yazpp_1;
+
+struct yazpp_1::RecordCache_Entry {
     int m_offset;
     Z_NamePlusRecord *m_record;
     Z_RecordComposition *m_comp;
-    Yaz_RecordCache_Entry *m_next;
+    RecordCache_Entry *m_next;
 };
 
-Yaz_RecordCache::Yaz_RecordCache ()
+RecordCache::RecordCache ()
 {
     m_mem = nmem_create();
     m_entries = 0;
@@ -24,17 +27,17 @@ Yaz_RecordCache::Yaz_RecordCache ()
     m_max_size = 200000;
 }
 
-Yaz_RecordCache::~Yaz_RecordCache ()
+RecordCache::~RecordCache ()
 {
     nmem_destroy(m_mem);
 }
 
-void Yaz_RecordCache::set_max_size(int sz)
+void RecordCache::set_max_size(int sz)
 {
     m_max_size = sz;
 }
 
-void Yaz_RecordCache::clear ()
+void RecordCache::clear ()
 {
     nmem_destroy(m_mem);
     m_mem = nmem_create();
@@ -43,7 +46,7 @@ void Yaz_RecordCache::clear ()
     m_searchRequest = 0;
 }
 
-void Yaz_RecordCache::copy_searchRequest(Z_SearchRequest *sr)
+void RecordCache::copy_searchRequest(Z_SearchRequest *sr)
 {
     ODR encode = odr_createmem(ODR_ENCODE);
     ODR decode = odr_createmem(ODR_DECODE);
@@ -53,17 +56,17 @@ void Yaz_RecordCache::copy_searchRequest(Z_SearchRequest *sr)
     int v = z_SearchRequest (encode, &sr, 1, 0);
     if (v)
     {
-       int len;
-       char *buf = odr_getbuf(encode, &len, 0);
-       odr_setbuf(decode, buf, len, 0);
-       z_SearchRequest(decode, &m_searchRequest, 1, 0);
-       nmem_transfer(m_mem, decode->mem);
+        int len;
+        char *buf = odr_getbuf(encode, &len, 0);
+        odr_setbuf(decode, buf, len, 0);
+        z_SearchRequest(decode, &m_searchRequest, 1, 0);
+        nmem_transfer(m_mem, decode->mem);
     }
     odr_destroy(encode);
     odr_destroy(decode);
 }
 
-void Yaz_RecordCache::copy_presentRequest(Z_PresentRequest *pr)
+void RecordCache::copy_presentRequest(Z_PresentRequest *pr)
 {
     ODR encode = odr_createmem(ODR_ENCODE);
     ODR decode = odr_createmem(ODR_DECODE);
@@ -73,36 +76,36 @@ void Yaz_RecordCache::copy_presentRequest(Z_PresentRequest *pr)
     int v = z_PresentRequest (encode, &pr, 1, 0);
     if (v)
     {
-       int len;
-       char *buf = odr_getbuf(encode, &len, 0);
-       odr_setbuf(decode, buf, len, 0);
-       z_PresentRequest(decode, &m_presentRequest, 1, 0);
-       nmem_transfer(m_mem, decode->mem);
+        int len;
+        char *buf = odr_getbuf(encode, &len, 0);
+        odr_setbuf(decode, buf, len, 0);
+        z_PresentRequest(decode, &m_presentRequest, 1, 0);
+        nmem_transfer(m_mem, decode->mem);
     }
     odr_destroy(encode);
     odr_destroy(decode);
 }
 
-void Yaz_RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
-                          int hits)
+void RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
+                           int hits)
 {
     if (nmem_total(m_mem) > m_max_size)
-       return;
+        return;
     // Build appropriate compspec for this response
     Z_RecordComposition *comp = 0;
     if (hits == -1 && m_presentRequest)
-       comp = m_presentRequest->recordComposition;
+        comp = m_presentRequest->recordComposition;
     else if (hits > 0 && m_searchRequest)
     {
-       Z_ElementSetNames *esn;
-
-       if (hits <= *m_searchRequest->smallSetUpperBound)
-           esn = m_searchRequest->smallSetElementSetNames;
-       else
-           esn = m_searchRequest->mediumSetElementSetNames;
-       comp = (Z_RecordComposition *) nmem_malloc(m_mem, sizeof(*comp));
-       comp->which = Z_RecordComp_simple;
-       comp->u.simple = esn;
+        Z_ElementSetNames *esn;
+
+        if (hits <= *m_searchRequest->smallSetUpperBound)
+            esn = m_searchRequest->smallSetElementSetNames;
+        else
+            esn = m_searchRequest->mediumSetElementSetNames;
+        comp = (Z_RecordComposition *) nmem_malloc(m_mem, sizeof(*comp));
+        comp->which = Z_RecordComp_simple;
+        comp->u.simple = esn;
     }
 
     // Z_NamePlusRecordList *npr to be owned by m_mem..
@@ -114,19 +117,23 @@ void Yaz_RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
     int i;
     for (i = 0; i<npr->num_records; i++)
     {
-       Yaz_RecordCache_Entry *entry = (Yaz_RecordCache_Entry *)
-           nmem_malloc(m_mem, sizeof(*entry));
-       entry->m_record = npr->records[i];
-       entry->m_comp = comp;
-       entry->m_offset = i + start;
-       entry->m_next = m_entries;
-       m_entries = entry;
+        RecordCache_Entry *entry = (RecordCache_Entry *)
+            nmem_malloc(m_mem, sizeof(*entry));
+        entry->m_record = (Z_NamePlusRecord *)
+            nmem_malloc(m_mem, sizeof(*entry->m_record));
+        entry->m_record->databaseName = npr->records[i]->databaseName;
+        entry->m_record->which = npr->records[i]->which;
+        entry->m_record->u.databaseRecord  = npr->records[i]->u.databaseRecord;
+        entry->m_comp = comp;
+        entry->m_offset = i + start;
+        entry->m_next = m_entries;
+        m_entries = entry;
     }
 }
 
-int Yaz_RecordCache::match (Yaz_RecordCache_Entry *entry,
-                           Odr_oid *syntax, int offset,
-                           Z_RecordComposition *comp)
+int RecordCache::match (RecordCache_Entry *entry,
+                            Odr_oid *syntax, int offset,
+                            Z_RecordComposition *comp)
 {
     // See if our compspec match...
     int match = 0;
@@ -142,56 +149,76 @@ int Yaz_RecordCache::match (Yaz_RecordCache_Entry *entry,
     char *buf2 = odr_getbuf(o2, &len2, 0);
     
     if (buf1 && buf2 && len1 && len1 == len2 && !memcmp(buf1, buf2, len1))
-       match = 1;
+        match = 1;
     else if (!buf1 && !buf2 && !len1 && !len2)
-       match = 1;
+        match = 1;
     
     odr_destroy(o1);
     odr_destroy(o2);
     if (!match)
-       return 0;
-
+        return 0;
     if (!syntax)
-       return 0;
+        return 0;
     // See if offset, OID match..
     if (entry->m_offset == offset &&
-       entry->m_record->which == Z_NamePlusRecord_databaseRecord &&
-       !oid_oidcmp(entry->m_record->u.databaseRecord->direct_reference,
-                   syntax))
-       return 1;
+        entry->m_record->which == Z_NamePlusRecord_databaseRecord &&
+        !oid_oidcmp(entry->m_record->u.databaseRecord->direct_reference,
+                    syntax))
+        return 1;
+#if 0
+    char mstr1[100];
+    oid_to_dotstring(entry->m_record->u.databaseRecord->direct_reference, mstr1);
+    char mstr2[100];
+    oid_to_dotstring(syntax, mstr2);
+    yaz_log(YLOG_LOG, "match fail 3 d=%s s=%s", mstr1, mstr2);
+#endif
+
     return 0;
 }
 
-int Yaz_RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
-                            int start, int num,
-                            Odr_oid *syntax,
-                            Z_RecordComposition *comp)
+int RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
+                             int start, int num,
+                             Odr_oid *syntax,
+                             Z_RecordComposition *comp)
 {
     int i;
-    yaz_log(LOG_DEBUG, "cache lookup start=%d num=%d", start, num);
+    yaz_log(YLOG_DEBUG, "cache lookup start=%d num=%d", start, num);
 
     for (i = 0; i<num; i++)
     {
-       Yaz_RecordCache_Entry *entry = m_entries;
-       for(; entry; entry = entry->m_next)
-           if (match(entry, syntax, start+i, comp))
-               break;
-       if (!entry)
-           return 0;
+        RecordCache_Entry *entry = m_entries;
+        for(; entry; entry = entry->m_next)
+            if (match(entry, syntax, start+i, comp))
+                break;
+        if (!entry)
+            return 0;
     }
     *npr = (Z_NamePlusRecordList *) odr_malloc(o, sizeof(**npr));
     (*npr)->num_records = num;
     (*npr)->records = (Z_NamePlusRecord **)
-       odr_malloc(o, num * sizeof(Z_NamePlusRecord *));
+        odr_malloc(o, num * sizeof(Z_NamePlusRecord *));
     for (i = 0; i<num; i++)
     {
-       Yaz_RecordCache_Entry *entry = m_entries;
-       for(; entry; entry = entry->m_next)
-           if (match(entry, syntax, start+i, comp))
-               break;
-       if (!entry)
-           return 0;
-       (*npr)->records[i] = entry->m_record;
+        RecordCache_Entry *entry = m_entries;
+        for(; entry; entry = entry->m_next)
+            if (match(entry, syntax, start+i, comp))
+                break;
+        if (!entry)
+            return 0;
+        (*npr)->records[i] = (Z_NamePlusRecord *)
+            odr_malloc(o, sizeof(Z_NamePlusRecord));
+        (*npr)->records[i]->databaseName = entry->m_record->databaseName;
+        (*npr)->records[i]->which = entry->m_record->which;
+        (*npr)->records[i]->u.databaseRecord =
+            entry->m_record->u.databaseRecord;
     }
     return 1;
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+