// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You 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.
= C++ Thin Client

== Prerequisites

* C++ compiler: MS Visual C++ (10.0 and up), g++ (4.4.0 and up)
* Visual Studio 2010 or newer


== Installation
The source code of the C++ thin client comes with the Ignite distribution package under the `${IGNITE_HOME}/platforms/cpp` directory.


[tabs]
--
tab:Windows[]
[source,bat]
----
cd %IGNITE_HOME%\platforms\cpp\project\vs

msbuild ignite.sln /p:Configuration=Release /p:Platform=x64
----

tab:Ubuntu[]
[source,bash,subs="attributes,specialchars"]
----
cd ${CPP_BUILD_DIR}
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_THIN_CLIENT=ON ${IGNITE_HOME}/platforms/cpp 
make
sudo make install
----

tab:CentOS/RHEL[]
[source,shell,subs="attributes,specialchars"]
----
cd ${CPP_BUILD_DIR}
cmake3 -DCMAKE_BUILD_TYPE=Release -DWITH_THIN_CLIENT=ON ${IGNITE_HOME}/platforms/cpp 
make 
sudo make install
----

--


== Creating Client Instance
The API provided by the thin client is located under the `ignite::thin` namespace.
The main entry point to the API is the `IgniteClient::Start(IgniteClientConfiguration)` method, which returns an instance of the client.

[source, cpp]
----
include::code-snippets/cpp/src/thin_creating_client_instance.cpp[tag=thin-creating-client-instance,indent=0]
----

=== Partition Awareness

include::includes/partition-awareness.adoc[]

The following code sample illustrates how to use the partition awareness feature with the C++ thin client.

[source, cpp]
----
include::code-snippets/cpp/src/thin_partition_awareness.cpp[tag=thin-partition-awareness,indent=0]
----

== Using Key-Value API

=== Getting Cache Instance

To perform basic key-value operations on a cache, obtain an instance of the cache as follows:

[source, cpp]
----
include::code-snippets/cpp/src/thin_client_cache.cpp[tag=thin-getting-cache-instance,indent=0]
----

The `GetOrCreateCache(cacheName)` returns an instance of the cache if it exists or creates the cache.

=== Basic Cache Operations
The following code snippet demonstrates how to execute basic cache operations on a specific cache.
[source, cpp]
----
include::code-snippets/cpp/src/thin_client_cache.cpp[tag=basic-cache-operations,indent=0]
----

== Security

=== SSL/TLS

To use encrypted communication between the thin client and the cluster, you have to enable SSL/TLS both in the cluster configuration and the client configuration. Refer to the link:thin-clients/getting-started-with-thin-clients#enabling-ssltls-for-thin-clients[Enabling SSL/TLS for Thin Clients] section for instructions on the cluster configuration.

[source, cpp]
----
include::code-snippets/cpp/src/thin_client_ssl.cpp[tag=thin-client-ssl,indent=0]
----

=== Authentication

Configure link:security/authentication[authentication on the cluster side] and provide a valid user name and password in the client configuration.

[source, cpp]
----
include::code-snippets/cpp/src/thin_authentication.cpp[tag=thin-authentication,indent=0]
----

