#ifndef LCB_CONNSPEC_H
#define LCB_CONNSPEC_H
#include <libcouchbase/couchbase.h>
#include "config.h"
#include <string>
#include <vector>
#include <set>
namespace lcb {
struct Spechost {
Spechost() : port(0), type(0) {}
lcb_U16 port;
short type;
std::string hostname;
bool isSSL() const { return type == LCB_CONFIG_MCD_SSL_PORT || type == LCB_CONFIG_HTTP_SSL_PORT; }
bool isHTTPS() const { return type == LCB_CONFIG_HTTP_SSL_PORT; }
bool isHTTP() const { return type == LCB_CONFIG_HTTP_PORT; }
bool isMCD() const { return type == LCB_CONFIG_MCD_PORT; }
bool isMCDS() const { return type == LCB_CONFIG_MCD_SSL_PORT; }
bool isTypeless() const { return type == 0 ; }
bool isAnyMcd() const {
return isMCD() || isMCDS() || type == LCB_CONFIG_MCCOMPAT_PORT;
}
bool isAnyHttp() const {
return isHTTP() || isHTTPS();
}
};
#define LCB_CONNSPEC_F_FILEONLY (1<<4)
class LCB_CLASS_EXPORT Connspec {
public:
typedef std::vector<std::pair<std::string,std::string> > Options;
Connspec() : m_sslopts(0), m_implicit_port(0), m_loglevel(0), m_flags(0) {}
lcb_error_t parse(const char *connstr, const char **errmsg = NULL);
lcb_error_t load(const lcb_create_st&);
bool has_bsmode(int mode) const {
return m_transports.find(mode) != m_transports.end();
}
bool is_bs_udef() const {
return !m_transports.empty() || (m_flags & LCB_CONNSPEC_F_FILEONLY);
}
bool is_bs_http() const { return has_bsmode(LCB_CONFIG_TRANSPORT_HTTP); }
bool is_bs_cccp() const { return has_bsmode(LCB_CONFIG_TRANSPORT_CCCP); }
bool is_bs_file() const { return m_flags & LCB_CONNSPEC_F_FILEONLY; }
uint16_t default_port() const { return m_implicit_port; }
const std::vector<Spechost>& hosts() const { return m_hosts; }
const std::string& bucket() const { return m_bucket; }
const std::string& username() const { return m_username; }
const std::string& password() const { return m_password; }
const std::string& certpath() const { return m_certpath; }
unsigned sslopts() const { return m_sslopts; }
const Options& options() const { return m_ctlopts; }
unsigned loglevel() const { return m_loglevel; }
const std::string& connstr() const { return m_connstr; }
private:
Options m_ctlopts;
std::string m_bucket;
std::string m_username;
std::string m_password;
std::string m_certpath;
std::string m_connstr;
unsigned m_sslopts;
std::vector<Spechost> m_hosts;
lcb_U16 m_implicit_port;
int m_loglevel;
inline lcb_error_t parse_options(
const char *options, const char *optend, const char **errmsg);
inline lcb_error_t parse_hosts(
const char *hostbegin, const char *hostend, const char **errmsg);
std::set<int> m_transports;
unsigned m_flags;
};
#define LCB_SPECSCHEME_RAW "couchbase+explicit://"
#define LCB_SPECSCHEME_MCD "couchbase://"
#define LCB_SPECSCHEME_MCD_SSL "couchbases://"
#define LCB_SPECSCHEME_HTTP "http://"
#define LCB_SPECSCHEME_HTTP_SSL "https-internal://"
#define LCB_SPECSCHEME_MCCOMPAT "memcached://"
} #endif