22 #include "drwnPersistentStorage.h"
54 key(k), record(r), dirty(false) { }
55 inline ~_drwnRecordEntry() { }
58 typedef list<_drwnRecordEntry> _drwnRecordList;
59 typedef map<string, typename _drwnRecordList::iterator> _drwnRecordRef;
71 size_t size()
const {
return _records.size(); }
73 size_t memory()
const {
return _memoryUsed; }
85 void erase(
const string& key);
106 _storage(bCompressed), _memoryUsed(0)
122 typename _drwnRecordRef::iterator it = _recref.find(key);
123 if (it != _recref.end()) {
125 _records.push_front(*it->second);
126 _records.erase(it->second);
127 it->second = _records.begin();
128 return it->second->record;
133 _storage.read(key.c_str(), p);
135 _recref.insert(make_pair(key, _records.begin()));
136 _memoryUsed += p->numBytesOnDisk();
146 typename _drwnRecordRef::iterator it = _recref.find(key);
147 if (it != _recref.end()) {
148 _memoryUsed -= it->second->record->numBytesOnDisk();
149 _records.erase(it->second);
155 _records.front().dirty =
true;
156 _recref.insert(make_pair(key, _records.begin()));
158 _memoryUsed += p->numBytesOnDisk();
165 typename _drwnRecordRef::iterator it = _recref.find(key);
166 if (it != _recref.end()) {
167 _memoryUsed -= it->second->record->numBytesOnDisk();
168 _records.erase(it->second);
171 _storage.erase(key.c_str());
177 for (
typename _drwnRecordList::const_iterator it = _records.begin(); it != _records.end(); it++) {
179 _storage.write(it->key.c_str(), it->record);
191 while (!_records.empty()) {
192 if ((_records.size() <= MAX_RECORDS) && (_memoryUsed <= MAX_MEMORY))
break;
194 const string key = _records.back().key;
195 DRWN_LOG_DEBUG(
"removing " << (_records.back().dirty ?
"dirty" :
"clean") <<
196 " record \"" << key <<
"\" from drwnPersistentStorageBuffer");
197 _memoryUsed -= _records.back().record->numBytesOnDisk();
198 if (_records.back().dirty) {
199 _storage.write(key.c_str(), _records.back().record);
202 typename _drwnRecordRef::iterator it = _recref.find(key);
203 DRWN_ASSERT_MSG(it != _recref.end(), key);
void erase(const string &key)
erases a record from storage (and memory)
Definition: drwnPersistentStorageBuffer.h:163
Definition: drwnPersistentStorageBuffer.h:45
void enforceLimits()
checks memory and count limits, writes and frees pending records if exceeded
Definition: drwnPersistentStorageBuffer.h:189
size_t memory() const
returns memory used by in-memory records
Definition: drwnPersistentStorageBuffer.h:73
size_t _memoryUsed
current memory usage
Definition: drwnPersistentStorageBuffer.h:64
bool open(const char *indexFile, const char *dataFile)
open persistent storage index and data files
Definition: drwnPersistentStorage.cpp:70
_drwnRecordList _records
cached records (in most-recently-used order)
Definition: drwnPersistentStorageBuffer.h:63
size_t size() const
returns number of records in the buffer
Definition: drwnPersistentStorageBuffer.h:71
bool dirty
dirty flag (requires write-back)
Definition: drwnPersistentStorageBuffer.h:49
void write(const string &key, drwnSmartPointer< T > &p)
writes a record to storage (the write is delayed until the record is removed from memory or flush is ...
Definition: drwnPersistentStorageBuffer.h:143
_drwnRecordRef _recref
reference to records
Definition: drwnPersistentStorageBuffer.h:62
drwnPersistentStorage _storage
storage object
Definition: drwnPersistentStorageBuffer.h:61
drwnSmartPointer< T > read(const string &key)
returns a record from the in-memory buffer or disk storage
Definition: drwnPersistentStorageBuffer.h:120
static size_t MAX_RECORDS
maximum number of records stored
Definition: drwnPersistentStorageBuffer.h:42
Provides indexed storage for multiple records using two files (a binary data file and a text index fi...
Definition: drwnPersistentStorage.h:162
const drwnPersistentStorage & storage() const
returns a reference to the storage object
Definition: drwnPersistentStorageBuffer.h:75
bool isOpen() const
returns true if the persistent storage has been opened and not closed
Definition: drwnPersistentStorage.h:201
string key
the record's key
Definition: drwnPersistentStorageBuffer.h:47
drwnSmartPointer< T > record
the record's data
Definition: drwnPersistentStorageBuffer.h:48
Implements a shared pointer interface to avoid the need to deep copy constant (shared) objects...
Definition: drwnSmartPointer.h:64
Provides buffered storage (delayed write-back) of objects with a drwnPersistentRecord interface...
Definition: drwnPersistentStorageBuffer.h:39
static size_t MAX_MEMORY
maximum number of bytes stored
Definition: drwnPersistentStorageBuffer.h:41
void flush()
write all pending records to disk
Definition: drwnPersistentStorageBuffer.h:175