1/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ 2/* 3 * Copyright 2017 Couchbase, Inc. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17#pragma once 18 19#include "client_connection.h" 20 21#include <nlohmann/json_fwd.hpp> 22#include <functional> 23 24class ConnectionMap { 25public: 26 /** 27 * Initialize the connection map with connections matching the ports 28 * opened from Memcached 29 */ 30 void initialize(const nlohmann::json& ports); 31 32 /** 33 * Invalidate all of the connections 34 */ 35 void invalidate(); 36 37 /** 38 * Get a connection object matching the given attributes 39 * 40 * @param ssl If ssl should be enabled or not 41 * @param family the network family (IPv4 / IPv6) 42 * @param port (optional) The specific port number to use.. 43 * @return A connection object to use 44 * @throws std::runtime_error if the request can't be served 45 */ 46 MemcachedConnection& getConnection(bool ssl, 47 sa_family_t family = AF_INET, 48 in_port_t port = 0); 49 50 /// Get a connection mapped to the given tag 51 MemcachedConnection& getConnection(const std::string& tag, 52 sa_family_t family = AF_INET); 53 54 /** 55 * Just get a connection to the server (protocol / ssl etc 56 * doesn't matter) 57 * 58 * @return A connection to the server 59 */ 60 MemcachedConnection& getConnection() { 61 return *connections.front().get(); 62 } 63 64 /** 65 * Do we have a connection matching the requested attributes 66 */ 67 bool contains(bool ssl, sa_family_t family); 68 69 /** 70 * Iterate over all of the connections 71 */ 72 void iterate(std::function<void(MemcachedConnection&)> fn) { 73 for (auto& connection : connections) { 74 fn(*connection); 75 } 76 } 77 78private: 79 std::vector<std::unique_ptr<MemcachedConnection>> connections; 80}; 81