MCResult MemCacheClient::IncDec( const char * aType, unsigned aService, const char * aKey, uint64_t * aNewValue, uint64_t aDiff, bool aWantReply ) { string_t key(aKey); Server * pServer = FindServer(key, aService); if (!pServer) return MCERR_NOSERVER; char szBuf[50]; string_t sRequest(aType); sRequest += ' '; sRequest += aKey; snprintf(szBuf, sizeof(szBuf), " %" PRIu64, aDiff); sRequest += szBuf; if (!aWantReply) { sRequest += " noreply"; } sRequest += "\r\n"; try { pServer->SendBytes(sRequest.data(), sRequest.length()); if (!aWantReply) { return MCERR_NOREPLY; } string_t sValue; sValue = pServer->GetByte(); while (sValue[sValue.length()-1] != '\n') { sValue += pServer->GetByte(); } if (sValue == "NOT_FOUND\r\n") { return MCERR_NOTFOUND; } if (aNewValue) { *aNewValue = strtoull(sValue.data(), NULL, 10); } return MCERR_OK; } catch (const Socket::Exception & e) { mTrace.Trace(CLINFO, "IncDec: error '%s' at %s, marking request as NOSERVER", e.mDetail, pServer->GetAddress()); pServer->Disconnect(); return MCERR_NOSERVER; } }
int MemCacheClient::FlushAll( const char * aServer, int aExpiry ) { char szRequest[50]; snprintf(szRequest, sizeof(szRequest), "flush_all %u\r\n", aExpiry); Server test(mTrace); if (aServer && !test.Set(aServer)) { return false; } int nSuccess = 0; for (size_t n = 0; n < mServer.size(); ++n) { Server * pServer = mServer[n]; if (aServer && *pServer != test) continue; // ensure that we are connected if (pServer->Connect(mTimeoutMs, mRetryMs) != Server::CONNECT_SUCCESS) { continue; } try { // request pServer->SendBytes(szRequest, strlen(szRequest)); // response string_t sValue; sValue = pServer->GetByte(); while (sValue[sValue.length()-1] != '\n') { sValue += pServer->GetByte(); } if (sValue == "OK\r\n") { // done ++nSuccess; } else { // unknown response, connection may be bad pServer->Disconnect(); } } catch (const Socket::Exception &) { mTrace.Trace(CLINFO, "socket error, ignoring flush request"); // data error } } return nSuccess; }
MCResult MemCacheClient::IncDec( const char * a_pszType, const char * a_pszKey, uint64_t * a_pnNewValue, uint64_t a_nDiff, bool a_bWantReply ) { Server * pServer = FindServer(a_pszKey); if (!pServer) return MCERR_NOSERVER; char szBuf[50]; string_t sRequest(a_pszType); sRequest += ' '; sRequest += a_pszKey; snprintf(szBuf, sizeof(szBuf), " " SPRINTF_UINT64, a_nDiff); sRequest += szBuf; if (!a_bWantReply) { sRequest += " noreply"; } sRequest += "\r\n"; try { pServer->SendBytes(sRequest.data(), sRequest.length()); if (!a_bWantReply) { return MCERR_NOREPLY; } string_t sValue; sValue = pServer->GetByte(); while (sValue[sValue.length()-1] != '\n') { sValue += pServer->GetByte(); } if (sValue == "NOT_FOUND\r\n") { return MCERR_NOTFOUND; } if (a_pnNewValue) { *a_pnNewValue = STRTOUL64(sValue.data(), NULL, 10); } return MCERR_OK; } catch (const ServerSocket::Exception &) { pServer->Disconnect(); return MCERR_NOSERVER; } }
int MemCacheClient::FlushAll( const char * a_pszServer, int a_nExpiry ) { char szRequest[50]; snprintf(szRequest, sizeof(szRequest), "flush_all %u\r\n", a_nExpiry); Server test; if (a_pszServer && !test.Set(a_pszServer)) return false; int nSuccess = 0; for (size_t n = 0; n < m_rgpServer.size(); ++n) { Server * pServer = m_rgpServer[n]; if (a_pszServer && *pServer != test) continue; // ensure that we are connected if (!pServer->Connect(m_nTimeoutMs)) { continue; } try { // request pServer->SendBytes(szRequest, strlen(szRequest)); // response string_t sValue; sValue = pServer->GetByte(); while (sValue[sValue.length()-1] != '\n') { sValue += pServer->GetByte(); } if (sValue == "OK\r\n") { // done ++nSuccess; } else { // unknown response, connection may be bad pServer->Disconnect(); } } catch (const ServerSocket::Exception &) { // data error } } return nSuccess; }