Move yaz-proxy to separate sub directory.
[yazpp-moved-to-github.git] / src / yaz-z-cache.cpp
index 9706009..cb2fac0 100644 (file)
@@ -1,12 +1,13 @@
 /*
- * 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.2 2003-07-25 08:57:01 adam Exp $
+ * $Id: yaz-z-cache.cpp,v 1.9 2004-03-29 22:46:51 adam Exp $
  */
 
 #include <yaz/log.h>
-#include <yaz++/proxy.h>
+#include <yaz/proto.h>
+#include <yaz++/record-cache.h>
 
 struct Yaz_RecordCache_Entry {
     int m_offset;
@@ -21,6 +22,7 @@ Yaz_RecordCache::Yaz_RecordCache ()
     m_entries = 0;
     m_presentRequest = 0;
     m_searchRequest = 0;
+    m_max_size = 200000;
 }
 
 Yaz_RecordCache::~Yaz_RecordCache ()
@@ -28,6 +30,11 @@ Yaz_RecordCache::~Yaz_RecordCache ()
     nmem_destroy(m_mem);
 }
 
+void Yaz_RecordCache::set_max_size(int sz)
+{
+    m_max_size = sz;
+}
+
 void Yaz_RecordCache::clear ()
 {
     nmem_destroy(m_mem);
@@ -80,6 +87,8 @@ void Yaz_RecordCache::copy_presentRequest(Z_PresentRequest *pr)
 void Yaz_RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
                           int hits)
 {
+    if (nmem_total(m_mem) > m_max_size)
+       return;
     // Build appropriate compspec for this response
     Z_RecordComposition *comp = 0;
     if (hits == -1 && m_presentRequest)
@@ -108,7 +117,11 @@ void Yaz_RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
     {
        Yaz_RecordCache_Entry *entry = (Yaz_RecordCache_Entry *)
            nmem_malloc(m_mem, sizeof(*entry));
-       entry->m_record = npr->records[i];
+       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;
@@ -133,7 +146,6 @@ int Yaz_RecordCache::match (Yaz_RecordCache_Entry *entry,
     int len2 = -1;
     char *buf2 = odr_getbuf(o2, &len2, 0);
     
-    yaz_log(LOG_LOG, "buf1=%p buf2=%p len1=%d len2=%d", buf1, buf2, len1, len2);
     if (buf1 && buf2 && len1 && len1 == len2 && !memcmp(buf1, buf2, len1))
        match = 1;
     else if (!buf1 && !buf2 && !len1 && !len2)
@@ -143,13 +155,22 @@ int Yaz_RecordCache::match (Yaz_RecordCache_Entry *entry,
     odr_destroy(o2);
     if (!match)
        return 0;
-
+    if (!syntax)
+       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;
+#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(LOG_LOG, "match fail 3 d=%s s=%s", mstr1, mstr2);
+#endif
+
     return 0;
 }
 
@@ -159,7 +180,7 @@ int Yaz_RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
                             Z_RecordComposition *comp)
 {
     int i;
-    yaz_log(LOG_LOG, "cache lookup start=%d num=%d", start, num);
+    yaz_log(LOG_DEBUG, "cache lookup start=%d num=%d", start, num);
 
     for (i = 0; i<num; i++)
     {
@@ -182,7 +203,12 @@ int Yaz_RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
                break;
        if (!entry)
            return 0;
-       (*npr)->records[i] = entry->m_record;
+       (*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;
 }