/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
* Copyright 2017 Couchbase, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* @brief Command codes for libcouchbase.
*
* @details
* These codes may be passed to 'lcb_cntl'.
*
* Note that the constant values are also public API; thus allowing forwards
* and backwards compatibility.
*/
#ifndef LCB_CNTL_H
#define LCB_CNTL_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @ingroup lcb-cntl
* @defgroup lcb-cntl-settings Setting List
* @brief Adjust tunables for the client
* @details
*
* The constants in this file are used to control the behavior of the library.
* All of the operations above may be passed as the `cmd` parameter to the
* lcb_cntl() function, thus:
*
* @code{.c}
* char something;
* lcb_error_t rv;
* rv = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_FOO, &something);
* @endcode
*
* will retrieve the setting of `LCB_CNTL_FOO` into `something`.
*
* You may also use the lcb_cntl_string() function, which operates on
* strings and can set various configuration properties fairly simply. Note
* however that string names are subject to change, and not all configuration
* directives have a string alias:
*
* @code{.c}
* rv = lcb_cntl_string("operation_timeout", "5.0");
* @endcode
*
* Of the commands listed below, some will be read-only (i.e. you may only
* _read_ the setting using the @ref LCB_CNTL_GET `mode`), some will be write-only
* (i.e. you may only _modify_ the setting, and use @ref LCB_CNTL_SET for the `mode`)
* and some will be both readable and writable.
*
* Along the documentation of each specific command, there is a table displaying
* the modes supported and the expected pointer type to be passed as the `arg`
* value into lcb_cntl(). Note that some read-write commands require different
* pointer types depending on whether the `mode` is retrieval or storage.
*
*
* @section lcb-time-info Timeout and Time Value Settings
*
* There are various settings on the library that control behavior with
* respect to wall clock time.
*
* Timeout settings control how long the library will wait for a certain event
* before proceeding to the next course of action (which may either be to try
* a different operation or fail the current one, depending on the specific
* timeout).
*
* Other settings may configure how often the library proactively polls for
* a configuration update, retries various interally retried operations and
* so forth.
*
* Time values are specified in _microseconds_ stored within an `lcb_U32`.
*
* When specified as an argument to lcb_cntl_string() or through the connection
* string, it will be parsed from a string float value where the integer-part
* is in seconds and the fractional-part is in fractions of a second.
*
* Note that timeouts in libcouchbase are implemented via an event loop
* scheduler. As such their accuracy and promptness is limited by how
* often the event loop is invoked and how much wall time is spent in
* each of their handlers. Specifically if you issue long running blocking
* calls within any of the handlers (and this means any of the library's
* callbacks) then the timeout accuracy will be impacted.
*
* Further behavior is dependent on the event loop plugin itself and how
* it schedules timeouts.
*
*
* @par Configuration Stability Attributes
* Configuration parameters are still subject to the API classification used
* in @ref lcb_attributes. For _deprecated_ control commands, lcb_cntl() will
* either perform the operation, _or_ consider it a no-op, _or_ return an error
* code.
*/
/**
* @addtogroup lcb-cntl-settings
* @{
*/
/**
* @name Modes
* Modes for the lcb_cntl() `mode` argument
* @{
*/
#define LCB_CNTL_SET 0x01 /**< @brief Modify a setting */
#define LCB_CNTL_GET 0x00 /**< @brief Retrieve a setting */
/**@}*/
/**
* @brief Operation Timeout
*
* The operation timeout is the maximum amount of time the library will wait
* for an operation to receive a response before invoking its callback with
* a failure status.
*
* An operation may timeout if:
*
* * A server is taking too long to respond
* * An updated cluster configuration has not been promptly received
*
* @code{.c}
* lcb_U32 tmo = 3500000;
* lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_OP_TIMEOUT, &tmo);
* @endcode
*
* @cntl_arg_both{lcbU32*}
* @committed
* @see lcb-time-info
*/
#define LCB_CNTL_OP_TIMEOUT 0x00
/**
* @brief Views Timeout
* This is the I/O timeout for HTTP requests issues with LCB_HTTP_TYPE_VIEWS
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_VIEW_TIMEOUT 0x01
/**
* @brief N1QL Timeout
* This is the I/O timeout for N1QL queries, issued via lcb_n1ql_query()
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_N1QL_TIMEOUT 0x3D
/**
* @brief Get the name of the bucket
* This returns the name of the bucket this instance is connected to, or `NULL`
* if not yet connected to a bucket
*
* @cntl_arg_getonly{`const char*`}
* @committed
*/
#define LCB_CNTL_BUCKETNAME 0x30
/**
* @brief Get the bucket type.
* This returns the bucket type - which is either of the following:
*
* * LCB_BTYPE_UNSPEC
* * LCB_BTYPE_COUCHBASE
* * LCB_BTYPE_EPHEMERAL
* * LCB_BTYPE_MEMCACHED
*
* @see https://developer.couchbase.com/documentation/server/current/architecture/core-data-access-buckets.html
*
* @cntl_arg_getonly{lcb_BTYPE*}
*/
#define LCB_CNTL_BUCKETTYPE 0x48
/**
* @brief Get the handle type.
* This returns the handle type - which is either LCB_TYPE_CLUSTER or
* LCB_TYPE_BUCKET
*
* @cntl_arg_getonly{lcb_type_t*}
*/
#define LCB_CNTL_HANDLETYPE 0x04
/**@brief Get the vBucket handle.
* Obtains the current cluster configuration from the client.
*
* @cntl_arg_getonly{lcbvb_CONFIG**}
*/
#define LCB_CNTL_VBCONFIG 0x05
/**@brief Get the iops implementation instance
*
* @cntl_arg_getonly{lcb_io_opt_t*}
* @uncommitted
*/
#define LCB_CNTL_IOPS 0x06
/** @brief Structure containing mapping information for a key */
typedef struct lcb_cntl_vbinfo_st {
int version;
union {
/** v0 */
struct {
const void *key; /**< **Input** Key */
lcb_SIZE nkey; /**< **Input** Length of key */
int vbucket; /**< **Output** Mapped vBucket */
int server_index; /**< **Output** Server index for vBucket */
} v0;
} v;
} lcb_cntl_vbinfo_t;
/**
* @brief Get the vBucket ID for a given key, based on the current configuration
*
* @cntl_arg_getonly{lcb_cntl_vbinfo_t*}
* @committed
*/
#define LCB_CNTL_VBMAP 0x07
/**
* Modes for handling IPv6 in the IO layer.
*/
typedef enum {
LCB_IPV6_DISABLED = 0x00, /**< disable IPv6 */
LCB_IPV6_ONLY = 0x1, /**< enforce only IPv6 */
LCB_IPV6_ALLOW = 0x02 /**< use both IPv6 and IPv4 */
} lcb_ipv6_t;
/**
* @brief IPv4/IPv6 selection policy
*
* Setting which controls whether hostname lookups should prefer IPv4 or IPv6
*
* Use `ipv6` in the connection string (e.g. "ipv6=allow" or "ipv6=only")
*
* @cntl_arg_both{lcb_ipv6_t*}
* @committed
*/
#define LCB_CNTL_IP6POLICY 0x0b
/**
* @brief Configuration error threshold.
*
* This number indicates how many
* network/mapping/not-my-vbucket errors are received before a configuration
* update is requested again.
*
* @cntl_arg_both{lcb_SIZE*}
*/
#define LCB_CNTL_CONFERRTHRESH 0x0c
/**
* @brief Default timeout for lcb_durability_poll()
* @ingroup lcb-time-info
*
* This is the time the client will
* spend sending repeated probes to a given key's vBucket masters and replicas
* before they are deemed not to have satisfied the durability requirements
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_DURABILITY_TIMEOUT 0x0d
/**
* @brief Polling grace interval for lcb_durability_poll()
*
* This is the time the client will wait between repeated probes to
* a given server.
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_DURABILITY_INTERVAL 0x0e
/**
* @brief Timeout for otherwise unspecified HTTP requests
*
* Examples of these kinds of HTTP requests might be cluster management,
* user management, etc.
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_HTTP_TIMEOUT 0x0f
/**
* @brief Print verbose plugin load information to console
*
* This modifies a static, global setting regarding whether to
* print verbose information when trying to dynamically load an IO plugin.
* The information printed can be useful in determining why a plugin failed
* to load. This setting can also be controlled via the
* "LIBCOUCHBASE_DLOPEN_DEBUG" environment variable (and if enabled from the
* environment, will override the setting mentioned here).
*
* @cntl_arg_both{int*}
*
* @note Pass NULL to lcb_cntl for the 'instance' parameter.
* @volatile
*/
#define LCB_CNTL_IOPS_DLOPEN_DEBUG 0x11
/**@brief Initial bootstrap timeout.
* This is how long the client will wait to obtain the initial configuration.
*
* @cntl_arg_both{lcb_U32*}
* @committed*/
#define LCB_CNTL_CONFIGURATION_TIMEOUT 0x12
/**
* @brief Randomize order of bootstrap nodes.
*
* This controls whether the connection attempts for configuration retrievals
* should be done in the supplied order or whether they should be randomized.
*
* For the initial connection the supplied order is the list of hosts provided
* in the lcb_create_st structure. For subsequent connections this is the
* order of nodes as received by the server.
*
* @cntl_arg_both{int*}
* @committed
*/
#define LCB_CNTL_RANDOMIZE_BOOTSTRAP_HOSTS 0x14
/**
* @brief Determine if file-based configuration has been loaded
*
* If the configuration cache is in use, the argument pointer
* will be set to a true value. If the configuration cache was not used,
* the argument pointer will be set to false.
*
* A false value may indicates that the client will need to load the
* configuration from the network. This may be caused by the following:
* - The configuration cache did not exist or was empty
* - The configuration cache contained stale information
*
* @cntl_arg_getonly{int*}
* @uncommitted
*/
#define LCB_CNTL_CONFIG_CACHE_LOADED 0x15
/**
* @brief Force a specific SASL mechanism
*
* Force a specific SASL mechanism to use for authentication. This
* can allow a user to ensure a certain level of security and have the
* connection fail if the desired mechanism is not available.
*
* When setting this value, the arg parameter shall be a
* `NUL`-terminated string or a `NULL` pointer (to unset). When retrieving
* this value, the parameter shall be set to a `char **`. Note that this
* value (in LCB_CNTL_GET) is valid only until the next call to a
* libcouchbase API, after which it may have been freed.
*
* @cntl_arg_get_and_set{char**, char*}
*/
#define LCB_CNTL_FORCE_SASL_MECH 0x16
/**
* @brief Maximum number of HTTP redirects to follow
* Set how many redirects the library should follow for the single request.
* Set to -1 to remove limit at all.
*
* @cntl_arg_both{int*}
* @uncommitted
*/
#define LCB_CNTL_MAX_REDIRECTS 0x17
/**
* @name Logging
*
* Verbose logging may be enabled by default using the environment variable
* `LCB_LOGLEVEL` and setting it to a number > 1; higher values produce more
* verbose output. The maximum level is `5`.
*
* You may also install your own logger using lcb_cntl() and the
* @ref LCB_CNTL_LOGGER constant. Note that
* the logger functions will not be called rapidly from within hot paths.
* @{
*/
/**
* @brief Logging Levels
* @committed
*/
typedef enum {
LCB_LOG_TRACE = 0, /**< the most verbose level */
LCB_LOG_DEBUG, /**< diagnostic information, required to investigate problems */
LCB_LOG_INFO, /**< useful notices, not often */
LCB_LOG_WARN, /**< error notifications */
LCB_LOG_ERROR, /**< error messages, usually the library have to re-initialize connection instance */
LCB_LOG_FATAL, /**< fatal errors, the library cannot proceed */
LCB_LOG_MAX /**< internal value for total number of levels */
} lcb_log_severity_t;
struct lcb_logprocs_st;
/**
* @brief Logger callback
*
*
* This callback is invoked for each logging message emitted
* @param procs the logging structure provided
* @param iid instance id
* @param subsys a string describing the module which emitted the message
* @param severity one of the LCB_LOG_* severity constants.
* @param srcfile the source file which emitted this message
* @param srcline the line of the file for the message
* @param fmt a printf format string
* @param ap a va_list for vprintf
*/
typedef void (*lcb_logging_callback)(struct lcb_logprocs_st *procs,
unsigned int iid, const char *subsys, int severity, const char *srcfile,
int srcline, const char *fmt, va_list ap);
/**
* @brief Logging context
* @volatile
*
* This structure defines the logging handlers. Currently there is only
* a single field defined which is the default callback for the loggers.
* This API may change.
*/
typedef struct lcb_logprocs_st {
int version;
union { struct { lcb_logging_callback callback; } v0; } v;
} lcb_logprocs;
/**
* @brief Access the lcb_logprocs structure
* @uncommitted
*
* The lcb_logoprocs structure passed must not be freed until the instance
* is completely destroyed. This will only happen once the destruction
* callback is called (see lcb_set_destroy_callback()).
*
* @cntl_arg_get_and_set{lcb_logprocs**,lcb_logprocs*}*/
#define LCB_CNTL_LOGGER 0x18
/**
* Helper to express printf spec for sensitive data. Usage:
*
* printf("Logged as " LCB_LOG_SPEC("%s") " user", LCB_LOG_UD(instance, doc->username));
*/
#define LCB_LOG_SPEC(fmt) "%s" fmt "%s"
#define LCB_LOG_UD_OTAG ""
#define LCB_LOG_UD_CTAG ""
/**
* User data is data that is stored into Couchbase by the application user account.
*
* - Key and value pairs in JSON documents, or the key exclusively
* - Application/Admin usernames that identify the human person
* - Names and email addresses asked during product registration and alerting
* - Usernames
* - Document xattrs
* - Query statements included in the log file collected by support that leak
* the document fields (Select floor_price from stock).
*/
#define LCB_LOG_UD(instance, val) \
lcb_is_redacting_logs(instance) ? LCB_LOG_UD_OTAG : "", val, lcb_is_redacting_logs(instance) ? LCB_LOG_UD_CTAG : ""
#define LCB_LOG_MD_OTAG ""
#define LCB_LOG_MD_CTAG ""
/**
* Metadata is logical data needed by Couchbase to store and process user data.
*
* - Cluster name
* - Bucket names
* - DDoc/view names
* - View code
* - Index names
* - Mapreduce Design Doc Name and Definition (IP)
* - XDCR Replication Stream Names
* - And other couchbase resource specific meta data
*/
#define LCB_LOG_MD(instance, val) \
lcb_is_redacting_logs(instance) ? LCB_LOG_MD_OTAG : "", val, lcb_is_redacting_logs(instance) ? LCB_LOG_MD_CTAG : ""
#define LCB_LOG_SD_OTAG ""
#define LCB_LOG_SD_CTAG ""
/**
* System data is data from other parts of the system Couchbase interacts with over the network.
*
* - IP addresses
* - IP tables
* - Hosts names
* - Ports
* - DNS topology
*/
#define LCB_LOG_SD(instance, val) \
lcb_is_redacting_logs(instance) ? LCB_LOG_SD_OTAG : "", val, lcb_is_redacting_logs(instance) ? LCB_LOG_SD_CTAG : ""
/**@}*/
/**
* @brief Refresh Throttling
*
* Modify the amount of time (in microseconds) before the
* @ref LCB_CNTL_CONFERRTHRESH will forcefully be set to its maximum
* number forcing a configuration refresh.
*
* Note that if you expect a high number of timeouts in your operations, you
* should set this to a high number (along with `CONFERRTHRESH`). If you
* are using the default timeout setting, then this value is likely optimal.
*
* @cntl_arg_both{lcb_U32*}
* @see LCB_CNTL_CONFERRTHRESH
*/
#define LCB_CNTL_CONFDELAY_THRESH 0x19
/**
* @brief Get the transport used to fetch cluster configuration.
* @cntl_arg_getonly{lcb_config_transport_t*}
* @uncommitted
*/
#define LCB_CNTL_CONFIG_TRANSPORT 0x1A
/**
* @brief Per-node configuration timeout.
*
* The per-node configuration timeout sets the amount of time to wait
* for each node within the bootstrap/configuration process. This interval
* is a subset of the @ref LCB_CNTL_CONFIGURATION_TIMEOUT
* option mentioned above and is intended
* to ensure that the bootstrap process does not wait too long for a given
* node. Nodes that are physically offline may never respond and it may take
* a long time until they are detected as being offline.
* See CCBC-261 and CCBC-313 for more reasons.
*
* @note the `CONFIGURATION_TIMEOUT` should be higher than this number.
* No check is made to ensure that this is the case, however.
*
* @cntl_arg_both{lcb_U32*}
* @see LCB_CNTL_CONFIGURATION_TIMEOUT
* @committed
*/
#define LCB_CNTL_CONFIG_NODE_TIMEOUT 0x1B
/**
* @brief Idling/Persistence for HTTP bootstrap
*
* By default the behavior of the library for HTTP bootstrap is to keep the
* stream open at all times (opening a new stream on a different host if the
* existing one is broken) in order to proactively receive configuration
* updates.
*
* The default value for this setting is -1. Changing this to another number
* invokes the following semantics:
*
* - The configuration stream is not kept alive indefinitely. It is kept open
* for the number of seconds specified in this setting. The socket is closed
* after a period of inactivity (indicated by this setting).
*
* - If the stream is broken (and no current refresh was requested by the
* client) then a new stream is not opened.
*
* @cntl_arg_both{lcb_U32*}
* @volatile
*/
#define LCB_CNTL_HTCONFIG_IDLE_TIMEOUT 0x1C
/**
* @brief Get the current SCM changeset for the library binary
* @cntl_arg_getonly{char**}
*/
#define LCB_CNTL_CHANGESET 0x1F
/**
* @brief File used for the configuration cache.
*
* The configuration
* cache allows to bootstrap from a cluster without using the initial
* bootstrap connection, considerably reducing latency. If the file passed
* does not exist, the normal bootstrap process is performed and the file
* is written to with the current information. File will be updated as
* the configuration in the cluster changes. Multiple instances may race
* to update the file, and that is the intended behavior.
*
* @note The leading directories for the file must exist, otherwise the file
* will never be created.
*
* @note Configuration cache is not supported for memcached buckets
* @cntl_arg_get_and_set{char**, char*}
* @uncommitted
* @see LCB_CNTL_CONFIG_CACHE_LOADED
*/
#define LCB_CNTL_CONFIGCACHE 0x21
/**
* @brief File used for read-only configuration cache
*
* This is identical to the @ref LCB_CNTL_CONFIGCACHE directive, except that
* it guarantees that the library will never overwrite or otherwise modify
* the path specified.
*
* @see LCB_CNTL_CONFIGCACHE
*/
#define LCB_CNTL_CONFIGCACHE_RO 0x36
/**
* SSL options
*
* @committed
*/
typedef enum {
LCB_SSL_ENABLED = 1 << 0, /**< Use SSL */
LCB_SSL_NOVERIFY = 1 << 1, /**< Don't verify certificates */
LCB_SSL_NOGLOBALINIT = 1 << 2 /**< Do not call SSL's global init functions */
} lcb_SSLOPTS;
/**
* @brief Get SSL Mode
*
* Retrieve the SSL mode currently in use by the library. This is a read-only
* setting. To set the SSL mode at the library, specify the appropriate values
* within the connection string. See @ref lcb_create_st3 for details.
*
* @cntl_arg_getonly{`int*` (value is one of @ref lcb_SSLOPTS)}
* @committed
*/
#define LCB_CNTL_SSL_MODE 0x22
/**
* @brief Get SSL Certificate path
*
* Retrieve the path to the CA certificate (if any) being used.
*
* @cntl_arg_getonly{`char**`}
* @see LCB_CNTL_SSL_MODE
* @committed
*/
#define LCB_CNTL_SSL_CERT 0x23
/**
* @brief Get SSL private key path
*
* Retrieve the path to the private key (if any) being used.
* When key specified, the library will use it to authenticate on the services,
* skipping all other authentication mechanisms (SASL, HTTP Basic auth, etc)
*
* @cntl_arg_getonly{`char**`}
* @see LCB_CNTL_SSL_MODE
* @see https://developer.couchbase.com/documentation/server/5.0/security/security-certs-auth.html
* @committed
*/
#define LCB_CNTL_SSL_KEY 0x4b
/**
* @brief Get SSL trust store path
*
* Trust store might be NULL, in this case the library expects it to be concatenated with certificate.
*
* @cntl_arg_getonly{`char**`}
* @see LCB_CNTL_SSL_MODE
* @see https://developer.couchbase.com/documentation/server/5.0/security/security-certs-auth.html
* @committed
*/
#define LCB_CNTL_SSL_TRUSTSTORE 0x4d
/**
* Alias for @ref LCB_CNTL_SSL_CERT for backward compatibility.
* @deprecated
*/
#define LCB_CNTL_SSL_CACERT LCB_CNTL_SSL_CERT
/**
* @brief Select retry mode to manipulate
*/
typedef enum {
LCB_RETRY_ON_TOPOCHANGE = 0, /**< Select retry for topology */
LCB_RETRY_ON_SOCKERR, /**< Select retry for network errors */
LCB_RETRY_ON_VBMAPERR, /**< Select retry for NOT_MY_VBUCKET responses */
/** Retry when there is no node for the item. This case is special as the
* `cmd` setting is treated as a boolean rather than a bitmask*/
LCB_RETRY_ON_MISSINGNODE,
LCB_RETRY_ON_MAX /**<< maximum index */
} lcb_RETRYMODEOPTS;
typedef enum {
/**Don't retry any commands. A command which has been forwarded to
* a server and a not-my-vbucket has been received in response for it
* will result in a failure.*/
LCB_RETRY_CMDS_NONE = 0,
/**Only retry simple retrieval operations (excludes touch,
* get-and-touch, and get-locked) which may be retried many numbers of times
* without risking unintended data manipulation. */
LCB_RETRY_CMDS_GET = 0x01,
/**Retry operations which may potentially fail because they have been
* accepted by a previous server, but will not silently corrupt data.
* Such commands include mutation operations containing a CAS.*/
LCB_RETRY_CMDS_SAFE = 0x03, /* Includes 'GET', plus a new flag (e.g. 0x02|0x01) */
/**Retry all commands, disregarding any potential unintended receipt of
* errors or data mutation.*/
LCB_RETRY_CMDS_ALL = 0x07 /* e.g. 0x01|0x03| NEW FLAG: 0x04 */
} lcb_RETRYCMDOPTS;
/**@brief Create a retry setting value
* @param mode the mode to set (@see lcb_RETRYMODEOPTS)
* @param policy the policy determining which commands should be retried
* (@see lcb_RETRYCMDOPTS)
* @return a value which can be assigned to an `lcb_U32` and passed to
* the @ref LCB_CNTL_RETRYMODE setting
*/
#define LCB_RETRYOPT_CREATE(mode, policy) (((mode) << 16) | policy)
/** Get mode from retry setting value */
#define LCB_RETRYOPT_GETMODE(u) ((u) >> 16)
/** Get policy from retry setting value */
#define LCB_RETRYOPT_GETPOLICY(u) ((u)&0xffff)
/**
* @volatile
*
* @brief Set retry policies
*
* This function sets the retry behavior. The retry behavior is the action the
* library should take when a command has failed because of a failure which
* may be a result of environmental and/or topology issues. In such cases it
* may be possible to retry the command internally and have it succeed a second
* time without propagating an error back to the application.
*
* The behavior consists of a _mode_ and _command_ selectors. The _command_
* selector indicates which commands should be retried (and which should be
* propagated up to the user) whereas the _mode_ indicates under which
* circumstances should the _command_ policy be used.
*
* Disable retries anywhere:
* @code{.c}
* for (int ii = 0; ii < LCB_RETRY_ON_MAX; ++ii) {
* lcb_U32 val = LCB_RETRYOPT_CREATE(ii, LCB_RETRY_CMDS_NONE);
* lcb_error_t err = lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_RETRYMODE, &val);
* }
* @endcode
*
* Only retry simple GET operations when retry is needed because of topology
* changes:
* @code{.c}
* lcb_U32 val = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_TOPOCHANGE, LCB_RETRY_CMDS_GET);
* lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_RETRYMODE, &val);
* @endcode
*
* Determine the behavior of the library when a `NOT_MY_VBUCKET` is received:
* @code{.c}
* lcb_U32 val = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_VBMAPERR, 0);
* lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_RETRYMODE, &val);
* lcb_U32 policy = LCB_RETRYOPT_GETPOLICY(val);
* @endcode
*
* @cntl_arg_both{`lcb_U32 *`}
*/
#define LCB_CNTL_RETRYMODE 0x24
/**
* @brief Enumeration representing various URL forms to use for the configuration
* stream */
typedef enum {
/** `/pools/default/b[s]/$bucket`: Introduced in Couchbase Server 2.5 */
LCB_HTCONFIG_URLTYPE_25PLUS = 0x01,
/** `/pools/default/buckets[Streaming]/$bucket`. */
LCB_HTCONFIG_URLTYPE_COMPAT = 0x02,
/** Try `25PLUS` first and fallback to `COMPAT` */
LCB_HTCONFIG_URLTYPE_TRYALL = 0x03
} lcb_HTCONFIG_URLTYPE;
/**
* @brief Set the URL selection mode.
*
* The URL type can be a mask of the #lcb_HTCONFIG_URLTYPE constants which
* indicate which URLs the HTTP provider should use.
*
* The default is to use the `25PLUS` URI first, and fallback on the compat uri
* if the terse one fails with an HTTP 404 (Not Found). The new-style URI is
* considered more efficient on cluster resources and can help the cluster
* maintain many more streaming connections than the compat version, however
* it is only available in Couchbase Server 2.5 and greater.
*
* This setting is only used when CCCP is disabled. This will typically be for
* older clusters or for memcached buckets.
* @cntl_arg_both{`int*` (value is one of @ref lcb_HTCONFIG_URLTYPE)}
* @volatile Primarily here to support tests and buggy HTTP servers/proxies
* which do not like to maintain a connection upon receipt of a 404.
*/
#define LCB_CNTL_HTCONFIG_URLTYPE 0x25
/**
* Determines whether to run the event loop internally within lcb_destroy()
* until no more I/O resources remain for the library. This is usually only
* necessary if you are creating a lot of instances and/or are using memory
* leak analysis tools.
*
* @cntl_arg_both{`int*` (as a boolean)}
* @see lcb_destroy_async() and lcb_set_destroy_callback()
* @volatile
*/
#define LCB_CNTL_SYNCDESTROY 0x28
/**
* Sets the logging level for the console logger. If a logger is already
* initialized (either from the environment, or via lcb_cntl_logger() then
* this operation does nothing.
*
* This is mainly useful for applications which want to proxy the built in
* logging options via command line options and the like, rather than setting
* it from the environment.
*
* The argument passed to lcb_cntl() is an integer of 0 until
* `LCB_LOG_MAX`, though the actual type is of `lcb_U32` rather than
* an enum type #lcb_log_severity_t.
*
* @cntl_arg_setonly{const lcb_U32 *}
* @see LCB_CNTL_LOGGER
*/
#define LCB_CNTL_CONLOGGER_LEVEL 0x29
/**
*
* Sets the output file (as a `FILE*`) for the console logger. Note that
* any existing file pointer will be cleared (but not `fclose()`d.
*
* If used with lcb_cntl_string(), (using the `console_log_file` parameter),
* the third argument is taken as the _name_ of a file. Note that the user
* is responsible for closing the file.
*
* This setting does not require a library handle and therefore the first
* argument to lcb_cntl() should be `NULL`.
*
*
* @cntl_arg_get_and_set{`FILE**`, `FILE*`}
* @see LCB_CNTL_LOGGER
* @see LCB_CNTL_CONLOGGER_LEVEL
*/
#define LCB_CNTL_CONLOGGER_FP 0x3B
/**
* Sets the behavior for reporting network errors. By default network errors
* are returned as `LCB_NETWORK_ERROR` return codes for compatibility reasons.
* More detailed error codes may be available by enabling this option which will
* return appropriate error codes which have a category of
* @ref LCB_ERRTYPE_NETWORK
*
* Using this option means your programming model is centered around the various
* LCB_EIF* macros (see ) rather than individual codes.
*
* @cntl_arg_both{int * (As a boolean)}
*/
#define LCB_CNTL_DETAILED_ERRCODES 0x2A
/**
*
* Sets the interval at which the retry queue will attempt to resend a failed
* operation. When an operation fails and the retry policy (see
* @ref LCB_CNTL_RETRYMODE) allows the operation to be retried, it shall be
* placed into a queue, and then be retried within a given interval.
*
* Setting a high value will be friendlier on the network but also potentially
* increase latency, while setting this to a low value may cause unnecessary
* network traffic for operations which are not yet ready to be retried.
*
* @cntl_arg_both{lcb_U32* (microseconds)}
*
* @see LCB_CNTL_RETRY_BACKOFF
*/
#define LCB_CNTL_RETRY_INTERVAL 0x2C
/**
*
* When an operation has been retried more than once and it has still not
* succeeded, the library will attempt to back off for the operation by
* scheduling it to be retried in `LCB_CNTL_RETRY_INTEVAL * ${n}` microseconds,
* where `${n}` is the factor controlled by this setting.
*
* @cntl_arg_both{float*}
*/
#define LCB_CNTL_RETRY_BACKOFF 0x2D
/**
* Whether commands are retried immediately upon receipt of not-my-vbucket
* replies.
*
* Since version 2.4.8, packets by default are retried immediately on a
* different node if it had previously failed with a not-my-vbucket
* response, and is thus not subject to the @ref LCB_CNTL_RETRY_INTERVAL
* and @ref LCB_CNTL_RETRY_BACKOFF settings. Disabling this setting will
* restore the older behavior. This may be used in case there are problems
* with the default heuristic/retry algorithm.
*
* @volatile
*/
#define LCB_CNTL_RETRY_NMV_IMM 0x37
/**
* Set the maximum pool size for pooled http (view request) sockets. This should
* be set to 1 (the default) unless you plan to execute concurrent view requests.
* You may set this to 0 to disable pooling
*
* @cntl_arg_both{lcb_SIZE}
* @volatile
*/
#define LCB_CNTL_HTTP_POOLSIZE 0x2E
/**
* Determine whether or not a new configuration should be received when an error
* is received over the HTTP API (i.e. via lcb_make_http_request().
*
* The default value is true, however you may wish to disable this if you are
* expectedly issuing a lot of requests which may result in an error.
*
* @cntl_arg_both{int (as boolean)}
* @uncommitted
*/
#define LCB_CNTL_HTTP_REFRESH_CONFIG_ON_ERROR 0x2F
/**
* Set the behavior of the lcb_sched_leave() API call. By default the
* lcb_sched_leave() will also set up the necessary requirements for flushing
* to the network. If this option is off then an explicit call to
* lcb_sched_flush() must be performed instead.
*
* @cntl_arg_both{int (as boolean)}
* @volatile
*/
#define LCB_CNTL_SCHED_IMPLICIT_FLUSH 0x31
/**
*
* Request the server to return an additional 16 bytes of data for each
* mutation operation. This extra information may help with more reliable
* durability polling, but will also increase the size of the response packet.
*
* This should be set on the instance before issuing lcb_connect(). While this
* may also be set after lcb_connect() is called, it will currently only take
* effect when a server reconnects (which itself may be undefined).
*
* @cntl_arg_both{int (as boolean)}
*/
#define LCB_CNTL_FETCH_MUTATION_TOKENS 0x34
/**
* This setting determines whether the lcb_durability_poll() function will
* transparently attempt to use mutation token functionality (rather than checking
* the CAS). This option is most useful for older code which does
* explicitly use mutation tokens but would like to use its benefits when
* ensuring durability constraints are satisfied.
*
* This option is enabled by default. Users may wish to disable this if they
* are performing durability operations against items stored from different
* client instances, as this will make use of a client-global state which is
* derived on a per-vBucket basis. This means that the last mutation performed
* on a given vBucket for the client will be used, which in some cases may be
* older or newer than the mutations passed to the lcb_durability_poll()
* function.
*
* @cntl_arg_both{int (as boolean)}
* @volatile
*/
#define LCB_CNTL_DURABILITY_MUTATION_TOKENS 0x35
/**
* This read-only property determines if the mutation token mechanism is supported
* on the cluster itself. This will only be accurate once a single operation
* has been performed on the cluster - or in other words, once a connection
* to a data node has been established for the purposes of normal operations.
*
* @cntl_arg_getonly{int (as boolean)}
* @uncommitted
*/
#define LCB_CNTL_MUTATION_TOKENS_SUPPORTED 0x38
/**
* This setting determines if calls to lcb_wait() and lcb_wait3() will reset
* the timeout of pending operations to the time that lcb_wait() was called,
* rather than having the operation maintain the time of the call which
* scheduled it. If the time between lcb_store3() and family and the lcb_wait()
* functions is long, it is recommended to disable this setting in order to
* avoid prematurely having operations time out.
*
* @cntl_arg_both{int (as boolean)}
* @uncommitted
*
* Use `"readj_wait_tmo"` for the string version
*/
#define LCB_CNTL_RESET_TIMEOUT_ON_WAIT 0x3A
/**
* Clears the internal prepared statement cache for N1QL
*
* This does not take any arguments, and is valid only on @ref LCB_CNTL_SET
* @uncommitted
*/
#define LCB_CNTL_N1QL_CLEARACHE 0x3E
/**
* Sets additional text for negotiation. This allows wrappers or applications
* to add additional identifying information which can then be seen in the
* server logs.
*
* @cntl_arg_get_and_set{`const char**`, `const char*`}
*
* Use `"client_string"` for the string version
*/
#define LCB_CNTL_CLIENT_STRING 0x3F
typedef const char *lcb_BUCKETCRED[2];
/**
* Set credentials for a bucket. This is used for N1QL and CBFT APIs to allow
* access to multiple buckets. It can also be used to set the password
* of the current bucket when reconnecting (in case it changes).
*
* The format for the credentials is an array of two nul-terminated strings,
* the first refers to the bucket and the second refers to the password.
*/
#define LCB_CNTL_BUCKET_CRED 0x40
/**
* Set the amount of time the client should wait before retrying a
* not-my-vbucket response packet. The default is 100ms. The value should
* be specified in microseconds.
*
* Use `"retry_nmv_interval"` with lcb_cntl_string()
*
* @cntl_arg_both{lcb_U32*}
*/
#define LCB_CNTL_RETRY_NMV_INTERVAL 0x41
/**
* Limit the number of bytes to be read (and thereby processed) during I/O
* read operations. This setting may be useful when the network is faster than
* processing resources.
*
* @note This setting only works for event-style I/O plugins. This means it
* has no effect on completion style plugins such as libuv or Windows IOCP
*
* @cntl_arg_both{lcb_U32*}
*/
#define LCB_CNTL_READ_CHUNKSIZE 0x42
/**
* Enable/Disable the Error Map feature. This is disabled by default.
* Works only on servers which support error map
*
* Use `enable_errmap` in the connection string
*
* @cntl_arg_both{int* (as boolean)}
*/
#define LCB_CNTL_ENABLE_ERRMAP 0x43
/**
* Enable/Disable sending the SELECT_BUCKET command after authentication.
* This is useful to test auth, and should not be set by end-users.
*
* Note that even if this feature is enabled (the default), the client will
* only send `SELECT_BUCKET` if the server indicates that it is supported
* during negotiation.
*
* Use `select_bucket` in the connection string
*
* @cntl_arg_both{int* (as boolean)}
*/
#define LCB_CNTL_SELECT_BUCKET 0x44
/**
* Enable/Disable setting the `TCP_KEEPALIVE` option on created sockets.
* This is enabled by default for I/O backends which support it.
*
* The keepalive interval will be set to the operating system default.
*
* @cntl_arg_both{int* (as boolean)}
*/
#define LCB_CNTL_TCP_KEEPALIVE 0x45
/**
* Set the amount of time to wait in between polling for a new configuration.
* This will have no effect if connected to a Memcached buckets, or using
* HTTP or File-based configurations (see the `bootstrap_on` connection
* string option).
*
* This option facilitates 'fast failover' - in that the client can preemptively
* check for any cluster topology updates before encountering an error.
*
* @cntl_arg_both{lcb_U32*}
*
* The value for this option is a time value. See the top of this header
* in respect to how to specify this.
*
* Using a value of `0` disables this feature.
*
* You can also use `config_poll_interval` in the connection string.
*
* @note
* Background polling is implemented in the library's non-blocking event loop.
* Synchronous clients (i.e. those using `lcb_wait()`) will only be able to
* poll as often as the library's event loop is active. If the library is
* suspended, that is, if not inside an `lcb_wait()` call, the library will
* be unable to do any kind of background polling.
*/
#define LCB_CNTL_CONFIG_POLL_INTERVAL 0x46
/**
* From version 2.7.4, the C library sends a HELLO command before
* authentication. This works on all modern server versions, but may cause
* disconnects on more ancient variants (Couchbase 2.x for example).
*
* This setting will disable the sending of the HELLO command (which older
* servers don't understand anyway). To disable the sending of hello, set this
* value to false.
*
* @cntl_arg_both{int* (as boolean)}
* @committed
*
* You can also use `send_hello=false` in the connection string.
*/
#define LCB_CNTL_SEND_HELLO 0x47
/**
* Once redaction is enabled, anything at ERROR, WARN and INFO will wrap
* sensitive information with special tags, for further processing with the goal
* to remove or encrypt that information. DEBUG or TRACE level logging are
* expected to have specific info.
*
* Use `log_redaction` in the connection string
*
* @cntl_arg_both{int* (as boolean)}
* @committed
*/
#define LCB_CNTL_LOG_REDACTION 0x4c
/**
* Activate/deactivate end-to-end tracing.
*
* Use `enable_tracing` in the connection string
*
* @cntl_arg_both{int* (as boolean)}
* @see lcb-tracing-api
* @committed
*/
#define LCB_CNTL_ENABLE_TRACING 0x4e
typedef enum {
LCBTRACE_THRESHOLD_KV = 0,
LCBTRACE_THRESHOLD_N1QL,
LCBTRACE_THRESHOLD_VIEW,
LCBTRACE_THRESHOLD_FTS,
LCBTRACE_THRESHOLD_ANALYTICS,
LCBTRACE_THRESHOLD__MAX
} lcbtrace_THRESHOLDOPTS;
/**
* Flush interval for orphaned spans queue in default tracer.
*
* This is the time the tracer will wait between repeated attempts
* to flush most recent orphaned spans.
*
* Use `tracing_orphaned_queue_flush_interval` in the connection string
*
* @code{.c}
* lcb_U32 tmo = 10000000; // 10 seconds in microseconds
* lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_TRACING_ORPHANED_QUEUE_FLUSH_INTERVAL, &tmo);
* @endcode
*
* @code{.c}
* rv = lcb_cntl_string("tracing_orphaned_queue_flush_interval", "10.0");
* @endcode
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_ORPHANED_QUEUE_FLUSH_INTERVAL 0x4f
/**
* Size of orphaned spans queue in default tracer.
*
* Queues in default tracer has fixed size, and it will remove information about older spans,
* when the limit will be reached before flushing time.
*
* Use `tracing_orphaned_queue_size` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_ORPHANED_QUEUE_SIZE 0x50
/**
* Flush interval for spans with total time over threshold in default tracer.
*
* This is the time the tracer will wait between repeated attempts
* to flush threshold queue.
*
* Use `tracing_threshold_queue_flush_interval` in the connection string
*
* @code{.c}
* lcb_U32 tmo = 10000000; // 10 seconds in microseconds
* lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_TRACING_THRESHOLD_QUEUE_FLUSH_INTERVAL, &tmo);
* @endcode
*
* @code{.c}
* rv = lcb_cntl_string("tracing_threshold_queue_flush_interval", "10.0");
* @endcode
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_QUEUE_FLUSH_INTERVAL 0x51
/**
* Size of threshold queue in default tracer.
*
* Queues in default tracer has fixed size, and it will remove information about older spans,
* when the limit will be reached before flushing time.
*
* Use `tracing_threshold_queue_size` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_QUEUE_SIZE 0x52
/**
* Minimum time for the tracing span of KV service to be considered by threshold tracer.
*
* Use `tracing_threshold_kv` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_KV 0x53
/**
* Minimum time for the tracing span of N1QL service to be considered by threshold tracer.
*
* Use `tracing_threshold_n1ql` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_N1QL 0x54
/**
* Minimum time for the tracing span of VIEW service to be considered by threshold tracer.
*
* Use `tracing_threshold_view` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_VIEW 0x55
/**
* Minimum time for the tracing span of FTS service to be considered by threshold tracer.
*
* Use `tracing_threshold_fts` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_FTS 0x56
/**
* Minimum time for the tracing span of ANALYTICS service to be considered by threshold tracer.
*
* Use `tracing_threshold_analytics` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_TRACING_THRESHOLD_ANALYTICS 0x57
/**
* Options for how to handle compression
*
* @committed
*/
typedef enum {
/** Do not perform compression in any direction. Data which is received
* compressed via the server will be indicated as such by having the
* `LCB_VALUE_F_SNAPPYCOMP` flag set in the lcb_GETRESPv0::datatype field */
LCB_COMPRESS_NONE = 0x00,
/**
* Decompress incoming data, if the data has been compressed at the server.
* If this is set, the `datatype` field in responses will always be stripped
* of the `LCB_VALUE_F_SNAPPYCOMP` flag.
*/
LCB_COMPRESS_IN = 1 << 0,
/**
* Compress outgoing data. Note that if the `datatype` field contains the
* `LCB_VALUE_F_SNAPPYCOMP` flag, then the data will never be compressed
* as it is assumed that it is already compressed.
*/
LCB_COMPRESS_OUT = 1 << 1,
LCB_COMPRESS_INOUT = (LCB_COMPRESS_IN|LCB_COMPRESS_OUT),
/**
* By default the library will send a HELLO command to the server to
* determine whether compression is supported or not. Because commands may
* be pipelined prior to the scheduing of the HELLO command it is possible
* that the first few commands may not be compressed when schedule due to
* the library not yet having negotiated settings with the server. Setting
* this flag will force the client to assume that all servers support
* compression despite a HELLO not having been intially negotiated.
*/
LCB_COMPRESS_FORCE = 1 << 2
} lcb_COMPRESSOPTS;
/**
* @brief Control how the library handles compression and deflation to and from
* the server.
*
* Starting in Couchbase Server 3.0, compression can optionally be applied to
* incoming and outcoming data. For incoming (i.e. `GET` requests) the data
* may be received in compressed format and then allow the client to inflate
* the data upon receipt. For outgoing (i.e. `SET` requests) the data may be
* compressed on the client side and then be stored and recognized on the
* server itself.
*
* The default behavior is to transparently handle compression for both incoming
* and outgoing data.
*
* Note that if the lcb_STORECMDv0::datatype field is set with compression
* flags, the data will _never_ be compressed by the library as this is an
* indication that it is _already_ compressed.
*
* @cntl_arg_both{`int*` (value is one of @ref lcb_COMPRESSOPTS)}
* @committed
*/
#define LCB_CNTL_COMPRESSION_OPTS 0x26
/**
* Minimum size of the document payload to be compressed when compression enabled.
*
* Use `compression_min_size` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_COMPRESSION_MIN_SIZE 0x58
/**
* Minimum compression ratio (compressed / original) of the compressed payload to allow sending it to cluster.
*
* Use `compression_min_ratio` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_COMPRESSION_MIN_RATIO 0x59
/**
* Select type of network (alternative addresses).
*
* Use `network` in the connection string
*
* @cntl_arg_get_and_set{`const char**`, `const char*`}
*
* @uncommitted
*/
#define LCB_CNTL_NETWORK 0x5b
/**
* The amount of time the pool should wait before closing idle connections.
*
* Use `http_pool_timeout` in the connection string
*
* @cntl_arg_both{lcb_U32*}
* @committed
*/
#define LCB_CNTL_HTTP_POOL_TIMEOUT 0x5d
/**
* This is not a command, but rather an indicator of the last item.
* @internal
*/
#define LCB_CNTL__MAX 0x5e
/**@}*/
#ifdef __cplusplus
}
#endif
#include "cntl-private.h"
#endif /* LCB_CNTL_H */