/*
- * 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.3 2003-07-25 19:28:07 adam Exp $
+ * $Id: yaz-z-cache.cpp,v 1.13 2005-06-08 13:28:06 adam Exp $
*/
#include <yaz/log.h>
-#include <yaz++/proxy.h>
+#include <yaz/proto.h>
+#include <yaz++/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;
m_presentRequest = 0;
m_searchRequest = 0;
+ m_max_size = 200000;
}
-Yaz_RecordCache::~Yaz_RecordCache ()
+RecordCache::~RecordCache ()
{
nmem_destroy(m_mem);
}
-void Yaz_RecordCache::clear ()
+void RecordCache::set_max_size(int sz)
+{
+ m_max_size = sz;
+}
+
+void RecordCache::clear ()
{
nmem_destroy(m_mem);
m_mem = nmem_create();
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);
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);
odr_destroy(decode);
}
-void Yaz_RecordCache::add (ODR o, Z_NamePlusRecordList *npr, int start,
+void 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)
int i;
for (i = 0; i<npr->num_records; i++)
{
- Yaz_RecordCache_Entry *entry = (Yaz_RecordCache_Entry *)
+ RecordCache_Entry *entry = (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;
}
}
-int Yaz_RecordCache::match (Yaz_RecordCache_Entry *entry,
+int RecordCache::match (RecordCache_Entry *entry,
Odr_oid *syntax, int offset,
Z_RecordComposition *comp)
{
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(YLOG_LOG, "match fail 3 d=%s s=%s", mstr1, mstr2);
+#endif
+
return 0;
}
-int Yaz_RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
+int RecordCache::lookup (ODR o, Z_NamePlusRecordList **npr,
int start, int num,
Odr_oid *syntax,
Z_RecordComposition *comp)
{
int i;
- yaz_log(LOG_LOG, "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;
+ RecordCache_Entry *entry = m_entries;
for(; entry; entry = entry->m_next)
if (match(entry, syntax, start+i, comp))
break;
odr_malloc(o, num * sizeof(Z_NamePlusRecord *));
for (i = 0; i<num; i++)
{
- Yaz_RecordCache_Entry *entry = m_entries;
+ 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;
+ (*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;
}