using xercesc::DOMElement;
+namespace {
+ // Reasonably extended sizes to avoid callers needing to shrink unduly.
+ static const XMLTOOL_DLLLOCAL StorageService::Capabilities g_memCaps(0x4000, 0x4000, 0x4000);
+};
+
namespace xmltooling {
class XMLTOOL_DLLLOCAL MemoryStorageService : public StorageService
{
MemoryStorageService(const DOMElement* e);
virtual ~MemoryStorageService();
- bool createString(const char* context, const char* key, const char* value, time_t expiration) {
- if (m_log.isDebugEnabled() && value && strlen(value) > 255) {
- m_log.debug("string value for key (%s) exceeded allowed length", key);
- }
- return createText(context, key, value, expiration);
+ const Capabilities& getCapabilities() const {
+ return g_memCaps;
}
- int readString(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0) {
- return readText(context, key, pvalue, pexpiration, version);
+
+ bool createString(const char* context, const char* key, const char* value, time_t expiration);
+ int readString(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0);
+ int updateString(const char* context, const char* key, const char* value=nullptr, time_t expiration=0, int version=0);
+ bool deleteString(const char* context, const char* key);
+
+ bool createText(const char* context, const char* key, const char* value, time_t expiration) {
+ return createString(context, key, value, expiration);
}
- int updateString(const char* context, const char* key, const char* value=nullptr, time_t expiration=0, int version=0) {
- if (m_log.isDebugEnabled() && value && strlen(value) > 255) {
- m_log.debug("string value for key (%s) exceeded allowed length", key);
- }
- return updateText(context, key, value, expiration, version);
+ int readText(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0) {
+ return readString(context, key, pvalue, pexpiration, version);
}
- bool deleteString(const char* context, const char* key) {
- return deleteText(context, key);
+ int updateText(const char* context, const char* key, const char* value=nullptr, time_t expiration=0, int version=0) {
+ return updateString(context, key, value, expiration, version);
+ }
+ bool deleteText(const char* context, const char* key) {
+ return deleteString(context, key);
}
-
- bool createText(const char* context, const char* key, const char* value, time_t expiration);
- int readText(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0);
- int updateText(const char* context, const char* key, const char* value=nullptr, time_t expiration=0, int version=0);
- bool deleteText(const char* context, const char* key);
void reap(const char* context);
void updateContext(const char* context, time_t expiration);
}
map<string,Context> m_contextMap;
- RWLock* m_lock;
- CondWait* shutdown_wait;
- Thread* cleanup_thread;
+ auto_ptr<RWLock> m_lock;
+ auto_ptr<CondWait> shutdown_wait;
+ auto_ptr<Thread> cleanup_thread;
static void* cleanup_fn(void*);
bool shutdown;
int m_cleanupInterval;
static const XMLCh cleanupInterval[] = UNICODE_LITERAL_15(c,l,e,a,n,u,p,I,n,t,e,r,v,a,l);
MemoryStorageService::MemoryStorageService(const DOMElement* e)
- : m_lock(nullptr), shutdown_wait(nullptr), cleanup_thread(nullptr), shutdown(false),
+ : m_lock(RWLock::create()), shutdown_wait(CondWait::create()), shutdown(false),
m_cleanupInterval(XMLHelper::getAttrInt(e, 900, cleanupInterval)),
m_log(Category::getInstance(XMLTOOLING_LOGCAT".StorageService"))
{
- m_lock = RWLock::create();
- shutdown_wait = CondWait::create();
- cleanup_thread = Thread::create(&cleanup_fn, (void*)this);
+ cleanup_thread.reset(Thread::create(&cleanup_fn, (void*)this));
}
MemoryStorageService::~MemoryStorageService()
shutdown = true;
shutdown_wait->signal();
cleanup_thread->join(nullptr);
-
- delete cleanup_thread;
- delete shutdown_wait;
- delete m_lock;
}
void* MemoryStorageService::cleanup_fn(void* pv)
unsigned long count=0;
time_t now = time(nullptr);
cache->m_lock->wrlock();
- SharedLock locker(cache->m_lock, false);
+ SharedLock locker(cache->m_lock.get(), false);
for (map<string,Context>::iterator i=cache->m_contextMap.begin(); i!=cache->m_contextMap.end(); ++i)
count += i->second.reap(now);
void MemoryStorageService::reap(const char* context)
{
Context& ctx = writeContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
ctx.reap(time(nullptr));
}
return count;
}
-bool MemoryStorageService::createText(const char* context, const char* key, const char* value, time_t expiration)
+bool MemoryStorageService::createString(const char* context, const char* key, const char* value, time_t expiration)
{
- // This doesn't matter for this implementation, but helps identify bugs that might break others.
- if (m_log.isDebugEnabled()) {
- if (strlen(context) > 255)
- m_log.debug("context value (%s) exceeded allowed length", context);
- if (strlen(key) > 255)
- m_log.debug("key value (%s) in context (%s) exceeded allowed length", key, context);
- }
-
Context& ctx = writeContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
// Check for a duplicate.
map<string,Record>::iterator i=ctx.m_dataMap.find(key);
return true;
}
-int MemoryStorageService::readText(const char* context, const char* key, string* pvalue, time_t* pexpiration, int version)
+int MemoryStorageService::readString(const char* context, const char* key, string* pvalue, time_t* pexpiration, int version)
{
Context& ctx = readContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
map<string,Record>::iterator i=ctx.m_dataMap.find(key);
if (i==ctx.m_dataMap.end())
return i->second.version;
}
-int MemoryStorageService::updateText(const char* context, const char* key, const char* value, time_t expiration, int version)
+int MemoryStorageService::updateString(const char* context, const char* key, const char* value, time_t expiration, int version)
{
Context& ctx = writeContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
map<string,Record>::iterator i=ctx.m_dataMap.find(key);
if (i==ctx.m_dataMap.end())
return i->second.version;
}
-bool MemoryStorageService::deleteText(const char* context, const char* key)
+bool MemoryStorageService::deleteString(const char* context, const char* key)
{
Context& ctx = writeContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
// Find the record.
map<string,Record>::iterator i=ctx.m_dataMap.find(key);
void MemoryStorageService::updateContext(const char* context, time_t expiration)
{
Context& ctx = writeContext(context);
- SharedLock locker(m_lock, false);
+ SharedLock locker(m_lock.get(), false);
time_t now = time(nullptr);
map<string,Record>::iterator stop=ctx.m_dataMap.end();