SSPCPP-616 - clean up concatenated string literals
[shibboleth/cpp-xmltooling.git] / xmltooling / impl / MemoryStorageService.cpp
index 546db20..785bfc6 100644 (file)
@@ -40,6 +40,11 @@ using namespace std;
 
 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
     {
@@ -47,29 +52,27 @@ namespace xmltooling {
         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);
@@ -113,9 +116,9 @@ namespace xmltooling {
         }
 
         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;
@@ -131,13 +134,11 @@ namespace xmltooling {
 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_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()
@@ -146,10 +147,6 @@ 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)
@@ -178,7 +175,7 @@ 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);
 
@@ -195,7 +192,7 @@ void* MemoryStorageService::cleanup_fn(void* pv)
 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));
 }
 
@@ -218,18 +215,10 @@ unsigned long MemoryStorageService::Context::reap(time_t exp)
     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);
@@ -247,10 +236,10 @@ bool MemoryStorageService::createText(const char* context, const char* key, cons
     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())
@@ -266,10 +255,10 @@ int MemoryStorageService::readText(const char* context, const char* key, string*
     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())
@@ -292,10 +281,10 @@ int MemoryStorageService::updateText(const char* context, const char* key, const
     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);
@@ -312,7 +301,7 @@ bool MemoryStorageService::deleteText(const char* context, const char* 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();