- memcached_return rv;
- string final_key;
- bool success;
-
- if (use_prefix) {
- final_key = m_prefix + key;
- } else {
- final_key = key;
- }
-
- m_lock->lock();
- rv = memcached_replace(memc, (char *)final_key.c_str(), final_key.length(), (char *)value.c_str(), value.length(), timeout, flags);
- m_lock->unlock();
-
- if (rv == MEMCACHED_SUCCESS) {
- success = true;
- } else if (rv == MEMCACHED_NOTSTORED) {
- // not there
- success = false;
- } else if (rv == MEMCACHED_ERRNO) {
- // System error
- string error = string("Memcache::replaceMemcache() SYSTEM ERROR: ") + string(strerror(memc->cached_errno));
- log.error(error);
- throw IOException(error);
- } else {
- string error = string("Memcache::replaceMemcache() Problems: ") + memcached_strerror(memc, rv);
- log.error(error);
- throw IOException(error);
- }
-
- return success;
-}
-
-MemcacheBase::MemcacheBase(const DOMElement* e) : m_root(e), log(Category::getInstance("XMLTooling.StorageService.MEMCACHE")), m_prefix("") {
-
- auto_ptr_char p(e ? e->getAttributeNS(nullptr,prefix) : nullptr);
- if (p.get() && *p.get()) {
- log.debug("INIT: GOT key prefix: %s", p.get());
- m_prefix = p.get();
- }
-
- m_lock = Mutex::create();
- log.debug("Lock created");
-
- memc = memcached_create(nullptr);
- if (memc == nullptr) {
- throw XMLToolingException("MemcacheBase::Memcache(): memcached_create() failed");
- }
-
- log.debug("Memcache created");
-
- unsigned int hash = MEMCACHED_HASH_CRC;
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, hash);
- log.debug("CRC hash set");
-
- int32_t send_timeout = 999999;
- const XMLCh* tag = e ? e->getAttributeNS(nullptr, sendTimeout) : nullptr;
- if (tag && *tag) {
- send_timeout = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_SND_TIMEOUT will be set to %d", send_timeout);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, send_timeout);
-
- int32_t recv_timeout = 999999;
- tag = e ? e->getAttributeNS(nullptr, sendTimeout) : nullptr;
- if (tag && *tag) {
- recv_timeout = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_RCV_TIMEOUT will be set to %d", recv_timeout);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, recv_timeout);
-
- int32_t poll_timeout = 1000;
- tag = e ? e->getAttributeNS(nullptr, pollTimeout) : nullptr;
- if (tag && *tag) {
- poll_timeout = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_POLL_TIMEOUT will be set to %d", poll_timeout);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, poll_timeout);
-
- int32_t fail_limit = 5;
- tag = e ? e->getAttributeNS(nullptr, failLimit) : nullptr;
- if (tag && *tag) {
- fail_limit = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT will be set to %d", fail_limit);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, fail_limit);
-
- int32_t retry_timeout = 30;
- tag = e ? e->getAttributeNS(nullptr, retryTimeout) : nullptr;
- if (tag && *tag) {
- retry_timeout = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_RETRY_TIMEOUT will be set to %d", retry_timeout);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, retry_timeout);
-
- int32_t nonblock_set = 1;
- tag = e ? e->getAttributeNS(nullptr, nonBlocking) : nullptr;
- if (tag && *tag) {
- nonblock_set = XMLString::parseInt(tag);
- }
- log.debug("MEMCACHED_BEHAVIOR_NO_BLOCK will be set to %d", nonblock_set);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, nonblock_set);
-
- // Grab hosts from the configuration.
- e = e ? XMLHelper::getFirstChildElement(e,Hosts) : nullptr;
- if (!e || !e->hasChildNodes()) {
- throw XMLToolingException("Memcache StorageService requires Hosts element in configuration.");
- }
- auto_ptr_char h(e->getFirstChild()->getNodeValue());
- log.debug("INIT: GOT Hosts: %s", h.get());
- memcached_server_st *servers;
- servers = memcached_servers_parse(const_cast<char*>(h.get()));
- log.debug("Got %u hosts.", memcached_server_list_count(servers));
- if (memcached_server_push(memc, servers) != MEMCACHED_SUCCESS) {
- throw IOException("MemcacheBase::Memcache(): memcached_server_push() failed");
- }
- memcached_server_list_free(servers);
-
- log.debug("Memcache object initialized");