X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-z-cache.cpp;h=cb2fac0393fa5ced745a7177e0f20994465be1fd;hp=9706009ed1c4c75bcf689de569c6a4b587cd6438;hb=2c25ce513613784819fcb216c60d1584402e7907;hpb=7bd1f8f00ec4db97bbe5038d22c216b27319dfbf diff --git a/src/yaz-z-cache.cpp b/src/yaz-z-cache.cpp index 9706009..cb2fac0 100644 --- a/src/yaz-z-cache.cpp +++ b/src/yaz-z-cache.cpp @@ -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 -#include +#include +#include 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; irecords[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; }