text: Couchbase C SDK Release Notes and Download Archives
  Installation
  You can install the C SDK from a repository for your platform, download prebuilt binaries, or compile from source.
  Installation on Mac OS X
  Installing on Linux
  For installation on Linux, install the couchbase-release repository, and then install the libcouchbase packages.]).
  # Only needed during first-time setup: wget sudo dpkg -i couchbase-release-1.0-6-amd64.deb # Will install or upgrade packages sudo apt-get update sudo apt-get install libcouchbase-dev libcouchbase2-bin build-essential
  Note that as of Couchbase Data Platform 6.0, couchbase-release (1.0.6) supports Debian 7, 8, and 9, and Ubuntu 12.04, 14.04, 16.04, and 18.04. If you wish to install a Couchbase SDK on another Ubuntu or Debian variation, follow these steps (but note that while newer releases may work, other platforms are not necessarily supported):
  # Install Couchbase's GPG key sudo wget -O - | sudo apt-key add - # Adding Ubuntu 18.04 repo to apt/sources.list of 18.10 or 19.04 echo "deb bionic bionic/main" | sudo tee /etc/apt/sources.list.d/couchbase.list # To install or upgrade packages sudo apt-get update sudo apt-get install libcouchbase-dev libcouchbase2-bin build-essential
  # Only needed during first-time setup: wget sudo rpm -iv couchbase-release-1.0-6-x86_64.rpm # Will install or upgrade existing packages sudo yum install libcouchbase-devel libcouchbase2-bin gcc gcc-c++
  Installing Manually - Linux
  If you want to install the C SDK manually, either from a static binary package or by manually configuring the repositories, you can use the following procedures.
  The various Linux distributions contain the following packages:
  libcouchbase2-core: The core library package.
  libcouchbase-dev(or
  libcouchbase-devel): The development package, required if building SDKs which depend on the C SDK.
  libcouchbase2-bin: The command line utilities (
  cbcand
  cbc-pillowfight).
  libcouchbase2-libevent: Optional but recommended component for I/O performance. Can also be used to integrate with libevent (see Asynchronous Programming).
  libcouchbase2-libev: Optional, for use with applications that make use of event loop integration with libev (see Asynchronous Programming).
  Configuring yum repositories (CentOS, Red Hat)
  This section assumes you know how to add an external yum repository and Linux quick start explains the steps it will perform on your distribution. To configure the repository:
  Find the appropriate repository location for your distribution in the following table. CentOS and RHEL allow 32-bit packages to be installed on a 64-bit system. This is usually not what you want, soensure that you use the 64-bit repository for your 64-bit system (unless you specifically want the 32-bit SDK).
  Create a
  couchbase.repofile in your
  /etc/yum.repos.ddirectory. It should look similar to the following:
  [couchbase] enabled = 1 name = Couchbase package repository baseurl = REPLACE THIS WITH THE ACTUAL REPOSITORY FOR YOUR PLATFORM.
  Installing binary packages without a repository
  You can install standalone packages by downloading a containing the necessary binary packages for your platform.
  Installing RPMs manually
  tar xf libcouchbase-2.4.0_centos62_x86_64.tar cd libcouchbase-2.4.0_centos62_x86_64/ sudo rpm -ivh libcouchbase-devel-2.4.0-1.el6.x86_64.rpm libcouchbase2-core-2.4.0-1.el6.x86_64.rpm \ libcouchbase2-bin-2.4.0-1.el6.x86_64.rpm libcouchbase2-libevent-2.4.0-1.el6.x86_64.rpm > Preparing... ########################################### [100%] > 1:libcouchbase2-core ########################################### [ 25%] > 2:libcouchbase-devel ########################################### [ 50%] > 3:libcouchbase2-bin ########################################### [ 75%] > 4:libcouchbase2-libevent ########################################### [100%]
  Installing DEBs manually
  tar xf libcouchbase-2.2.0_ubuntu1204_amd64.tar cd libcouchbase-2.2.0_ubuntu1204_amd64 sudo dpkg -i libcouchbase2-core_2.2.0-2453_amd64.deb libcouchbase2-libevent_2.2.0-2453_amd64.deb \ libcouchbase-dev_2.2.0-2453_amd64.deb libcouchbase2-bin_2.2.0-2453_amd64.deb > Selecting previously unselected package libcouchbase2-core. > (Reading database ... 28297 files and directories currently installed.) > Unpacking libcouchbase2-core (from libcouchbase2-core_2.2.0-2453_amd64.deb) ... > Selecting previously unselected package libcouchbase2-libevent. > Unpacking libcouchbase2-libevent (from libcouchbase2-libevent_2.2.0-2453_amd64.deb) ... > Selecting previously unselected package libcouchbase-dev. > Unpacking libcouchbase-dev (from libcouchbase-dev_2.2.0-2453_amd64.deb) ... > Selecting previously unselected package libcouchbase2-bin. > Unpacking libcouchbase2-bin (from libcouchbase2-bin_2.2.0-2453_amd64.deb) ... > Setting up libcouchbase2-core (2.2.0-2453) ... > Processing triggers for man-db ... > Setting up libcouchbase2-bin (2.2.0-2453) ... > Setting up libcouchbase2-libevent (2.2.0-2453) ... > Setting up libcouchbase-dev (2.2.0-2453) ... > Processing triggers for libc-bin ... > ldconfig deferred processing now taking place
  Installation from source
  You may install the library from source either by downloading a source archive, or by checking out the git repository. Follow the instructions in the archive’s README for further instructions..
  2.10.4 (June 19 2019)
  CCBC-600: Use special error when authentication is successful, but the bucket is not found:
  LCB_BUCKET_ENOENT.
  CCBC-1055: Do not include assert.h if NDEBUG defined. The library will use its own assert implementation.
  CCBC-866: Fix invalid memory access during iteration of bootstrap provides.
  More usage examples (analytics, XATTRs)
  2.10.3 (December 20 2018)
  CCBC-1008: jsoncpp: use
  unique_ptrinstead of
  auto_ptr. Replaced use of deprecated compiler feature with newer, standardized variant of smart pointers.
  CCBC-1011: Port vbucketkeygen tool to cbc-keygen. The tool generates list of keys, that distributed over all vBuckets in the bucket.
  CCBC-1006: Cleanup pending queue of pipeline on retry. LCB was (incorrectly) retrying mutations after timeout errors; it will no longer do this.
  CCBC-1007: Trusted store path will now work without key file.
  MB-31875: cliopts: grow list only if needed.
  2.10.2 (November 23 2018)
  Fixed incorrect header-guard for analytics.h, which might affect API visibility (when included before
  libcouchbase/n1ql.h)
  2.10.1 (November 22 2018)
  CCBC-997: Extract analytics queries into separate file, and expose new API as set of
  lcb_analytics_*functions.
  CCBC-992: KV ingest mode for analytics. Ingestion mode a way to funnel analytics results back into the KV layer through mutation.
  CCBC-991: Analytics Deferred Queries. Deferred queries allow to decouple the execution of an analytics query from actually fetching the results. This is very important for queries that take a long time to complete.
  CCBC-1004: Fix request counting for CAS-observe. Incorrect mapping server indexes during scheduling observe requests might lead to crashes on multi-node clusters.
  CCBC-1005:
  select(2)-based IO plugin: always use expiration when using
  lcb_tick_nowaitfunction to avoid waiting for IO events.
  Updates in testing infrastructure
  2.10.0 (October 12 2018)
  CCBC-982: Support analytics for N1QL service in
  lcb_ping3.
  CCBC-989: Write bucket capabilities into config cache, so that the client which was bootstrapped from the cache will be able to reason about features availability (e.g. views).
  CCBC-987: Document tracing options for cbc tools.
  CCBC-988: Update cbc-pillowfight to work with by-id collections. It still does not use any changes in protocol yet. The collection API will be exposed in 3.0 release.
  2.9.5 (September 21 2018)
  CCBC-980: Make idle timeout for HTTP pool tunable.
  CCBC-977: Update documentation analytics. Add example demonstrating analytics queries.
  CCBC-968: Improve log message for SELECT_BUCKET on EACCESS. Add note saying that this error code might be because of missing bucket.
  CCBC-976: Keep HTTP connections pooled after
  lcb_ping3.
  CCBC-975: Make sure kv service is only enabled if in nodes list.
  CCBC-972: Fix memory issues reported by valgrind.
  CCBC-973: Correctly convert non-null terminated tag buffers to
  Json::Value.
  2.9.4 (August 28 2018)
  CCBC-970: Update list of retriable errors for analytics
  CCBC-965: Update log level in config cache provider
  CCBC-967: Optimize Threshold Tracer queues/sorting
  CCBC-963: Remove global state from random generator, and make it thread-safe.
  CCBC-966: Return current network for LCB_CNTL_NETWORK
  CCBC-969: Allow to skip version from git tags
  CCBC-961: Add examples for FTS queries
  CCBC-971: Disable dead socket detection for older libuv (fixes build on platforms, where old libuv-dev package installed).
  HELOfeatures to logger in the single line.
  Allow to select compression mode in connection string. This might be useful for debugging purposes. For example, to bypass inflation step when receiving data.
  CONNSTRING=couchbase://localhost/default?compression=deflate_only cbc cat -U $CONNSTRING 00000000.json > bindoc.dat 00000000.json CAS=0x15431f831dc60000, Flags=0x0, Size=739, Datatype=0x03(JSON,SNAPPY)
  2.9.3 (July 18 2018)
  CCBC-955: Parse uint32 as unsigned ints instead of timeouts. Some settings were interpreted as time values, while they should not (e.g. console_log_level, compression_min_size etc). This issue forced the library to misinterpret user input (converter was multiplying all values to 1000000, e.g. log level was always
  TRACE).
  CCBC-957: Automatically disable SSL support, when OpenSSL is unavailable.
  CCBC-954: Define
  EFTYPEerror code if it does not exist. Fixes support of libuv 1.21 and higher.
  CCBC-951: Remove experimental warning from subdoc API.
  CCBC-948: Consider retry queue with only 0xb5 as empty. This allows a breakout from
  lcb_waitearlier (when application operates in synchronous style). The old behaviour, where lcb_wait does not breakout until the library gets the first successful configuration, still can be restored with lcb_cntl(…, LCB_CNTL_WAIT_FOR_CONFIG, …).
  CCBC-939: Optimize the performance of built-in tracer. It now uses
  sllistfor tags container instead of
  Json::Value.
  CCBC-958: Check tracing span tags argument more pedantically and return error if arguments are not valid.
  CCBC-956: Combine operation id and name into single field in the threshold tracer.
  CCBC-949: Do not hardcode libevent dependencies in DEB packages. Instead let
  dh_shlibdepsscript to detect dependencies for each platform. This fixes useless dependency on libevent-1 for ubuntu 18.04.
  CCBC-947: Fix build scripts for examples (when built with -DLCB_BUILD_EXAMPLES=ON).
  And other small fixes and improvements.
  2.9.2 (June 22 2018)
  2.9.1 (June 22 2018)
  CCBC-942 Expose new error codes for subdocument operations.
  CCBC-866 Check cached provider isn’t NULL.
  CCBC-890 Always check if SSL used when getting ports.
  CCBC-945 Allow to specify logger in lcb_create().
  CCBC-935 Display orphan tracer report on WARN log level.
  CCBC-936 Update default tracing interval to 10 seconds.
  CCBC-937 Implement support for alternate addresses.
  CCBC-943 Implement option to dump TCP packets. This change introduces new cmake option, which will force library to report all incoming/outgoing TCP packets on TRACE log level. It renders the bytes in Base64 encoding. Also there is simple extraction tool, which beautifies packet traces, and could be used like this:
  cbc cat -vvv foo bar 2>&1 | tools/extract-packets.rb
  2.9.0 (May 24 2018)
  This release is mostly about API visibility bump from uncommited to committed, but also includes several bug fixes.
  CCBC-930: Dump threshold logging tracer queues before destroying the tracer.
  Updates in crypto API as per RFC. This basically change of the API (ABI has preserved compatible, but v0 crypto API will return runtime error with 2.9.0 library. From this release, all encryption key management encapsulated into crypto provider, so it does not need to expose key loader interface. In addition, that user API is changed to conform RFC, and use noun fields instead of document (e.g.
  lcbcrypt_encrypt_fields).
  CCBC-925: Fix existence checks for registered crypto providers.
  CCBC-924: Initialize flag for JSON server feature. Otherwise it might be left uninitialized and the library will send JSON datatype to servers, which do not support it.
  PCBC-543, CCBC-932, CCBC-933: Update log levels
  2.8.7 (May 2 2018)
  CCBC-917: Add tracing for observe. So now the library will group all CAS-observe operations, and in general will nest observe operations under common parent when lcb_storedur3 API used.
  CCBC-918: Don’t ping KV on nodes without DATA service.
  CCBC-685: Implementation of SCRAM-SHA{1,256,512} authentication mechanisms for KV service. Support for SCRAM-SHA* SASL auth is disabled by default, because it is not portable, and not every Couchbase service supports it. But if it is necessary, it could be enabled using lcb_cntl(…, LCB_CNTL_FORCE_SASL_MECH, …) operation, or "force_sasl_mech=SCRAM-SHA512" option in connection string.
  CCBC-919: More granular settings for compression. Now it is possible to specify minimum size of the value to be considered for compression, and also the minimal ratio (compressed / original). See LCB_CNTL_COMPRESSION_MIN_SIZE (or "compression_min_size=100" in bytes), and LCB_CNTL_COMPRESSION_MIN_RATIO (or "compression=0.9").
  CCBC-916: Do not set JSON datatype if server didn’t ack it. Fixes behavior where old server rejecting commands as invalid when compression is enabled.
  CCBC-923: Allow to disable fast-forward map for NMV handler. See LCB_CNTL_VB_NOREMAP ("vb_noremap=true"). This option is disabled by default.
  Build improvements:
  2.8.6 (April 5 2018)
  Additions and bug fixes in this version:
  CCBC-888: Add threshold logging tracer, which tracks and reports above threshold and orphaned operations. This is beta functionality, which is disabled by default. To enable it, use enable_tracing=on in the connection string.
  CCBC-910: Field encryption API. The lcbcrypto_* functions abstracts encrypted field layout from actual crypto implementations (OpenSSL, libsodium, etc.). The wrapper or application using libcouchbase is expected to connect their own crypto and key providers, while libcouchbase provides transformation of the encrypted data. See sample crypto provider in example/crypto.
  CCBC-904: Remove trailing comma in lcb_KVBUFTYPE enum. Fixes build on some older compilers.
  CCBC-907: cbc-n1qlback: Do not require trailing empty line for input.
  CCBC-908: cbc-n1qlback: Report number of loaded queries.
  Add ability to write OPS/SEC from cbc-pillowfight to a file
  cbc-pillowfight 2> /tmp/stats.txt
  or, when writing to terminal required:
  cbc-pillowfight 2>&1 | tee /tmp/stats.txt
  Build improvements for easier integration into with server manifest (and TLM project).
  2.8.5 (February 23 2018)
  Additions and bug fixes in this version:
  CCBC-883: Always use built-in compression. It is not possible to unbundle the Snappy library, as libcouchbase uses the C++ API which is not exported in the headers. Also, compression can now work on all types of buffers, including LCB_KV_IOV and LCB_KV_IOVCOPY. This fixes compression in cbc-pillowfight tool.
  CCBC-895: Fix typo in rendering IPv6 addresses in lcb_diag.
  CCBC-879: Implement log redaction. When log_redaction=on is specified in the connection string, the library will wrap sensitive data in the logs in special tags, which can be processed by the cblogredaction tool from the server distribution.
  CCBC-893: Updated list of subdoc error codes.
  CCBC-892: Enable the SSL trust store to be in a separate file. Trust store has to be specified with option truststorepath=…, otherwise the library will expect it to be stored with the certificate in certpath=.
  CCBC-888: Per operation tracing. When compiled with tracing support (cmake -DLCB_TRACING=ON), the library will expose the tracing API, which allows to measure time of every data operation, and include some extra information. The API is modeled after OpenTracing and allows one to write custom tracers to consume this information. For more information, see an example in example/tracing/tracing.c. This is uncommitted API at this time.
  Also this feature includes support for new type of the server responses, which include time spent to execute the KV command on the server. This feature controlled by enable_tracing option in connection string or lcb_cntl(…, LCB_CNTL_ENABLE_TRACING, …).
  Added basic support of JSON datatype. The library will negotiate a mode, in which the application will see LCB_VALUE_F_JSON flag on datatype field of the response in the operation callback, if the cluster detected the content of the document to be valid JSON. Also the application can send this flag on the outgoing documents to notify the server about payload format.
  Refresh dtrace/systemtap integration. Also adds tapset for SystemTap to simplify access to trace points.
  cbc-pillowfight improvements and changes:
  dump diagnostics on SIGQUIT (CTRL-\ in terminal).
  with -J/--json, the JSON datatype will be sent on the documents.
  enable randomized document bodies with -R/--random-body switch.
  durability checks for pillowfight with
  --persist-to/--replicate-to.
  pessimistic locking of keys before updating with --lock.
  when requesting timings with -T/--timings, the application will no longer dump them periodically.Instead it will await for the user to signal SIGQUIT and also dump them on exit. The old mode of reporting regularly is enabled by repeating the switch more than once (e.g. -TT).
  Added the cbc-watch command to monitor server stats. By default it tracks cmd_total_ops, cmd_total_gets and cmd_total_sets updating stats once a second, and displaying diff with the previous value.
  2.8.4 (December 20 2017)
  Additions and bug fixes in this version:
  https://)
  couchbases://127.0.0.1?certpath=/path/to/chain.pem&keypath=/path/to/client.key
  Read more at server docs:
  CCBC-883: Revisit builtin compression implementation (snappy). Add compression to cbc tools (see --compress, -y options). Future versions of Couchbase Server will have end-to-end compression.
  CCBC-885: Do not skip HTTP Basic authentication when password is empty.
  CCBC-876: Make sure that server authority is always specified. In some cases, when libcouchbase generates vbucket configuration or data service is not available, the authority of the server might be NULL. This could cause issues, as we compare servers from configs using their authority fields.
  CCBC-878: Support collections in cbc-pillowfight.
  Note that this change does not expose anything related to Collections API for libcouchbase. It defines hidden switches for pillowfight tool to allow benchmark of collections. The switches are not documented and might be removed in the future. Use with care.
  Generate only
  beer:<seqno> keys:
  cbc pillowfight --separator : --collection beer
  Using many --collection will alternate in generating
  beer:<seqno>, brewery:<seqno>keys (default separator is ":"):
  cbc pillowfight --collection beer --collection brewery
  CCBC-801: Expose information about network IO for monitoring. The diagnostics exposed as string with encoded JSON object.
  void diag_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *rb) { const lcb_RESPDIAG *resp = (const lcb_RESPDIAG *)rb; if (resp->rc != LCB_SUCCESS) { fprintf(stderr, "failed: %s\n", lcb_strerror(NULL, resp->rc)); } else { if (resp->njson) { fprintf(stderr, "\n%.*s", (int)resp->njson, resp->json); } } } lcb_install_callback3(instance, LCB_CALLBACK_DIAG, diag_callback); lcb_CMDDIAG cmd = { 0 }; lcb_diag(instance, NULL, &cmd); lcb_wait(instance);
  CCBC-874: Dynamic authenticator. Note that this feature should not be considered at public interface. To use it, application have to define two callbacks, which will return username and password dependending on bucket name and hostname/port of the endpoint.
  std::map< std::string, std::string > credentials = { {"protected", "secret"} }; extern "C" { static const char *get_username(void *cookie, const char *host, const char *port, const char *bucket) { return bucket; } static const char *get_password(void *cookie, const char *host, const char *port, const char *bucket) { std::map< std::string, std::string > *credentials = static_cast<std::map< std::string, std::string > *>(cookie); return (*credentials)[bucket].c_str(); } }
  and later pass these callbacks to authenticator like this:
  lcb_AUTHENTICATOR *auth = lcbauth_new(); lcbauth_set_callbacks(auth, &credentials, get_username, get_password); lcbauth_set_mode(auth, LCBAUTH_MODE_DYNAMIC); lcb_set_auth(instance, auth);
  Include platform/compiler into client id, which included into HELLO and HTTP requests.
  Fix parallel build on Linux when dtrace enabled
  cbc-proxy: proxy N1QL, FTS and Analytics queries using STAT command.
  2.8.3 (November 22 2017)
  Additions and bug fixes in this version:
  CCBC-415: Fixes in IPv6 support. To use IPv6 addresses, the application should connect to IPv6-enabled Couchbase Server, and explicitly switch on option via connection string ipv6=allow or ipv6=only, where first variant permits the library to use both IPv6 and IPv4, and the second — disables IPv4. Alternatively this setting controlled with LCB_CNTL_IP6POLICY and lcb_cntl.
  CCBC-872: Metrics management These metrics are intended at providing information on libcouchbase operations performed over the lifetime of the current lcb_t instance (processed request packets, processed response packets, request packets pending emission, server errors, server timeouts, misrouted operations, retried operations).
  Metrics collection is currently disabled by default. To enable metrics collection, the user should call:
  int activate = 1; lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_METRICS, &activate);
  Access to the collected metrics is done using:
  lcb_METRICS* my_metrics; lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_METRICS, &my_metrics);
  CCBC-870: Fix updating URL on retry. When retrying HTTP request, instead of replacing just host:port part of the old URL, the library inserted full URL.
  CCBC-547: Detect dead sockets under libuv.
  Ensure macros safe by surrounding values with parentheses
  2.8.2 (October 17 2017)
  Additions and bug fixes in this version:
  CCBC-833, CCBC-834: Update real cluster integration in the test suite.
  CCBC-860: cbc-connstr: Do not zero out C++ instances.
  CCBC-859: Fix libm shared object detection on Debian 9.
  Bugs reported by clang analyzer:
  CCBC-858: Fix memory leak for compressed packet.
  CCBC-857: Fix possible NULL pointer dereference in mcreq_reserve_key.
  CCBC-856: Initialize response struct in H_config.
  CCBC-855: Fix dead assignments in contrib/genhash.
  CCBC-854: Init vbguess array before entry lookup.
  CCBC-853: cbc-proxy: do not use client object after free.
  CCBC-852: Do not free memory twice in N1QL index manager.
  2.8.1 (September 20 2017)
  Additions and bug fixes in this version:
  CCBC-817: Check nodes number for durability checks. The store with durability requirements will report more specific error when the library cannot fulfill the condition during failover.
  CCBC-846: Handle enhanced error messages for subdoc operations. The subdoc responses will now expose context and reference ID if present.
  CCBC-840: Discover and bootstrap analytics service from cluster configuration.
  CCBC-835: Improve documentation of configuration parameters.
  CCBC-838: Enable Error Map feature by default.
  Cleanup and extend minimal, libeventdirect, instancepool examples
  Tools:
  improve error reporting
  experimental subcommand cbc-proxy
  fix memory leaks
  retry store operations during population phase in cbc-pillowfight
  2.8.0 (August 31 2017)
  Known Isssues:
  As reported in Issue CCBC-838, version 2.8.0 should have Error Maps enabled by default, but it does not. Users may work around this issue by specifying errmap_enable=true in connection string or setting it programmatically:
  int enabled = 1; lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_ENABLE_ERRMAP, &enabled);
  Additions and bug fixes in this version:
  Add support for OpenSSL-1.1.
  Mask LOCKED status code for backward compatibility. This code (as well as others possible codes with 'item-locked' attribute) replaced with LCB_KEY_EEXISTS for SET, REPLACE and DELETE operations, and with LCB_ETMPFAIL for the rest.
  Stop enumerating bootstrap nodes and mechanisms when the server returns authentication error.
  Fixed double free error with lcb_ping3.
  Exposed additional N1QL query parameters: lcb_n1p_readonly, lcb_n1p_scancap, lcb_n1p_pipelinecap.
  Fixed cbc-subdoc/upsert without XATTR.
  XERROR attributes synchronized with recent list on server.
  Add missing documentation, and update stability of the API.
  Do not throttle background configuration polling by throttle interval of configuration error handler.
  Turn on background polling by default. The library will try to schedule configuration update every 2.5 seconds. To disable it use config_poll_interval=0.
  2.7.7 (August 17 2017)
  Implement new function lcb_ping3, which sends NOOP-like message to each service in the cluster and allows to measure latency along with health status of the connection. Might be useful for application-side keep-alive mechanisms.
  Detect and expose bucket type through LCB_CNTL_BUCKETTYPE:
  lcb_BTYPE type; lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_BUCKETTYPE, &type);
  Fixed setting expiration in subdoc mutations.
  Fixed DNS SRV support of Fedora 26 and FreeBSD.
  Fixed DNS SRV with SSL connections.
  Define EREMOTEIO in libuv
  New subdocument command to remove whole document
  New cbc command: cbc-subdoc. It provides interactive shell, where all subdocument commands accessible to inspect and modify documents in the cluster.
  New cbc command: cbc-ping. It sends NOOP-like messages to all accessible services in the cluster, and displays the status along with latency.
  Fix cbc-cat --replica, which now allows reading documents from replicas.
  Implement NOOP command and cbc-pillowfight --noop, which sends NOOP instead of data manipulation commands.
  Clarify errors found in .cbcrc. Now it will display configuration path along with error message.
  Issues:
  Update examples:
  Support username/password in subdoc and libeventdirect examples
  Added example for subdoc XATTRs
  Integrate fix for parallel build with dtrace on FreeBSD
  Make enhanced errors API public
  Fixed various compiler and cppcheck warnings and documentation update.
  2.7.6 (July 11 2017)
  Expose enhanced errors for data commands. Couchbase Server 5 might return additional information about errors in the response body. According to SDK-RFC-28, the library allow user code to inspect this information using following functions:
  lcb_resp_get_error_context(int, const lcb_RESPBASE *)
  lcb_resp_get_error_ref(int, const lcb_RESPBASE *)
  Report contextualized error messages during negotiation. The event reference could be used to find more details about authentication errors in the server logs.
  Specify correct protocol level for SO_KEEPALIVE. This fixes setting tcp_keepalive option on connections.
  Implement Error Map Retries. This implements the mechanics needed to retry commands on various errors based on dynamic settings supplied via the error map.
  Add cluster admin provider. This provider doesn’t do anything except serve as a source of management hostnames. And the library will fall back to it when bucket is not specified for cluster management connections.
  Implement RBAC user management in cbc tools. In addition to examples/users, this can be a demonstration of new security APIs which appear in Couchbase Server 5.
  Allow to inspect query errors in cbc-n1qlback. The command will write details for failed queries to file, specified with option --error-log.
  Fix memory leak in io::Pool
  Fix LCB_SDCMD_GET_FULLDOC. This would not actually work beforehand because the opcode it’s mapped to is 0, and we used 0 as a sentinel value for an invalid opcode within the subdoc implementation.
  Add LCB_NOT_AUTHORIZED error code. This error code maps to Memcached’s EACCESS
  Don’t send empty Authorization header for HTTP requests, If there’s no username and/or password
  Internal refactoring:
  io::Pool - remove empty dtor
  Fix BadPluginEnvironment test on Fedora where libm.so is ld script
  Add missing commands for cbc-help
  Documentation update:
  Add additional documentation for lcb_n1ql_cancel()
  Typos
  2.7.5 (May 17 2017)
  Allow to disable sending the HELLO command when connecting to a server. Sending HELLO will cause a bootstrap failure with Couchbase Server 2.0 and older.
  Fix error return value on reprepared query. Previously an error was returned if a N1QL query was reprepared, because the prior internal failure status was not updated.
  Check for more N1QL error strings indicating the need to reprepare a statement.
  Fix uninitialized memory issue when initializing lcb::Server and mc_PIPELINE
  Couchbase 5.0 additions for Subdocument. This adds new protocol extensions for Couchbase 5.0. This consists of:
  Fix bug where CCCP subsystem would be suspended indefinitely. CCCP subsystem would hang if an error was received for the config request itself.
  Fix bootstrap with LCB_TYPE_CLUSTER. Previously bootstrap would fail because the client would not send proper credentials. Note that at this point, the default bucket must still exist.
  Ignore empty DNS SRV replies. Some buggy DNS configurations return positive replies to SRV queries, but without actually containing any kind of A record as a response.
  Enable background polling for configuration changes. This allows the client to periodically poll for configuration changes. This feature is disabled by default. You can use the config_poll_interval setting to enable it in the connection string.
  Enable TCP Keepalive for newly created sockets. Newly created sockets have TCP keepalive enabled in order to avoid firewalls breaking connections due to inactivity. TCP Keepalive does not yet work for the libuv plugin (e.g. nodejs). You can use the tcp_keepalive=false directive in the connection string to disable it.
  2.7.4 (April 21 2017)
  Send SELECT_BUCKET command by default if server supports it. This enables new-style 'RBAC' authentication by default. In 2.7.3 users were required to use select_bucket=true in the connection string to enable this feature. In this version, the option is still available but is now mainly useful to disable it.
  Improve lcb_AUTHENTICATOR API. This provides better documentation and some API/design/implementation fixes to the authenticator interface. The authenticator may be useful for integrators/wrappers who wish to correlate multiple credentials with their buckets. Note that the use of lcb_AUTHENTICATOR is not required for RBAC support. In order to use RBAC, simply make use of the username field in the lcb_create_st struct, or the usernameparameter in the connection string.
  Fix bug where lcb_get_server_list() would return NULL.
  Fix bug where client would not recover from failover. Clients from version 2.7.1 through 2.7.3 would not obtain a new cluster map after a node had been failed over (e.g. by hitting the "fail over" button in the UI).
  2.7.3 (March.
  Additions and bug fixes in this version:
  Provide the ability to send the SELECT_BUCKET when establishing a to a server. This is a building block allowing us to use 'RBAC'/username auth in the future. Note that this requires the select_bucket=true option in the connection string or equivalent, and that this feature as a whole is considered experimental.
  Provide an option to disable DNS-SRV lookups. Because DNS SRV lookups often result in no result (i.e. NXDOMAIN) - which takes longer, allowing to disable such lookups may speed up startup time. This option is available via the connection string, using dnssrv=off
  Send client/user-specific identifier in User-Agent HTTP header. The library already does this for data nodes (Memcached). Using it in HTTP services allows better supportability when diagnosing issues by reading the HTTP logs.
  Fix bug where DNS SRV hostnames would not be used. While DNS SRV lookup was working, the library would not actually attempt bootstrap off those received hostnames.
  Provide experimental Analytics support. This allows access to the Couchbase Analytics Service, available in some pre-release builds. API and syntax wise, Analytics is very similar to N1QL. To use the analytics service, set the
  LCB_CMDN1QL_F_CBASQUERYbit in
  lcb_CMDN1QL::cmdflags, and provide the appropriate
  host:port combinationin the
  lcb_CMDN1QL::hostfield. - Currently, analytics support is not used in the cluster map/configuration.
  2.7.2 (February and some improved logging messages. There is enhanced experimental XATTR support. This release also contains some bug fixes:
  Fix build issues on FreeBSD. This allows normal BSD make to be used, rather than forcing gmake
  Fixed broken JIRA link in README
  Fix hanging SSL connections in IOCP/Completion mode. This would sometimes stall the connection by not requesting a write if a read was in progress. This would result in the command not being sent and the client hanging. Note that this only affects completion-style I/O plugins such as IOCP and libuv.
  Rename
  LCB_SDSPEC_F_VIRTPATH to LCB_SDSPEC_F_MACROVALUES.
  VIRTPATHis intended for possible future materialized XATTRs.
  Add
  LCB_SDSPEC_F_XATTR_DELETED_OK, which maps to the protocol flag of roughly the same name.
  2.7.1 (January 20. More internals have been converted to C++.
  Provide XATTR (Extended Attribute) prototype support. This provides a prototype implementation of xattrs, allowing the client to access extended (hidden) attributes of a document. This feature can be used on the client side by simply setting the
  LCB_SDSPEC_F_XATTRPATHbit in the
  lcb_SDSPEC::optionsfield.
  Add automatic DNS SRV record lookup when simple hostname supplied. The library will now automatically attempt to look up SRV records for various couchbase services if only one host is present in the connection string. Automatic lookup will not be performed if more than a single host is provded. See the Java Documentationon the matter (go to the bottom of the page).
  2.7.0 (December 21 2016)
  This release contains many significant internal enhancements. It does not fix any known bugs or add any new features.
  2.6.4 (November 28 2016)
  Fix bug in pillowfight where large value sizes would cause a segfault.
  Allow 64 bit values with
  cbc-incrand
  cbc-decr.
  Fix encoding in
  lcb_n1p_setconsistent_token. This function would encode it as scan_vector but it should be scan_vectors.
  Refactor negotiation internals to use C++. This is part of an internal refactoring to move our internals over to C++. This will make the code more manageable and extendable in the future.
  2.6.3 (September 27 2016)
  Fix memory corruption for some JSON APIs when no rows are returned. This fixes a bug where the JSON parser would read from garbage memory when parsing a response that had no rows, but due to a slow network, would be received in multiple chunks. This affects N1QL, CBFT, and View APIs.
  Allow to adjust bytes to read per event loop iteration. This allows applications with high network throughput but low CPU capacity to prevent the library from oversaturating a specific event callback invocation or starve other sockets. It may be controlled through the read_chunk_size connection string option or via
  lcb_cntl_string.
  Use htonll for CAS values. This allows a consistent representation of CAS values regardless of underlying platform. This allows interoperability between other SDKs with respect to exchanging CAS values. This however may break interoperability with older versions of the same SDK, if the CAS value is being passed around (which it shouldn’t be).
  New subdocument additions. This adds the LCB_SUBDOC_F_MKDOCUMENT flag which allows document creation if the document does not exist, and can be used for mutation operations which may create new paths or values. TheLCB_SUBDOC_CMD_GET_COUNT is also added, which is a new command which retrieves the number of elements (for an array) or key-value items (within an object/dictionary) of a given path. Both these features require Couchbase Server 4.6 (or its prereleases).
  C SDK Version 2.6.2 (July 27 2016)
  Don’t crash on high number of FDs with select plugin. Because select(2) can only accomodate up to a certain number of file descriptors in the application, if opening a socket results in a too-high-numbered FD, the plugin will return an error rather than silently failing during polling.
  Pillowfight can now set ttl (expiry). This is done via the
  -eor
  --expiryoption.
  Log URLs of HTTP requests. This may make it easier to debug some HTTP-based APIs. The URLs are printed as part of the TRACE logging level.
  Fix crash on shutdown with completion-based I/O. The crash was a result of dereferencing the lcb_t after it had been destroyed. This bug affected completion-based I/O subsystems such as libuv and IOCP.
  Do not require operation field to be set on lcb_CMDSTORE. Starting from this version, a new lcb_storage_t constant,LCB_UPSERT has been added with a value of 0. This means that upsert operations no longer need to explicitly useLCB_SET, it being the default.
  C SDK Version 2.6.1 (June 21 2016)
  Index management API now properly handles 'fields' field. Previously this was treated as a csv string, when it is in fact a JSON array.
  pillowfight now has a
  --populate-onlyoption, which is useful when simply trying to populate buckets with large amounts of data.
  Allow to bypass OpenSSL initialization. This allows applications which already have OpenSSL intialization code in place to suppress libcouchbase’s own OpenSSL initialization code. You can disable SSL initialization by usingssl=no_global_init in the connection string.
  Allow to toggle sending of multiple credentials in N1QL queries. You can use the LCB_CMD_F_MULTIAUTH in the
  lcb_CMDN1QL::cmdflagsfield to indicate that multiple credentials should be added. Otherwise only the current bucket’s credentials will be sent.
  Fix infinite loop on completion (UV,nodejs,IOCP) type IO plugins. This bug would be triggered when only a single server remained in the cluster and that single server failed. This would result in the client never being able to perform operations due to a delayed reference count decrement.
  C SDK Version 2.6.0 (May 2016)
  Improve index management API and implementation. The rawjson field was being ignored and the condition field was missing as well.
  Add pillowfight support for subdoc. At the simplest level you can simply invoke pillowfight as
  cbc-pillowfight --subdoc --json <other args>. Refer to the pillowfight documentation for more details.