<!--

    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++ Native API

## 1. Dependencies

- Java 8+
- Flex
- Bison 2.7+
- Boost 1.56+
- OpenSSL 1.0+
- GCC 5.5.0+

## 2. Installation

### 2.1 Install Required Dependencies

- **MAC**
    1. Install Bison:

       Use the following brew command to install the Bison version:
       ```shell
       brew install bison
       ```

    2. Install Boost: Make sure to install the latest version of Boost.

       ```shell
       brew install boost
       ```

    3. Check OpenSSL: Make sure the OpenSSL library is installed. The default OpenSSL header file path is "/usr/local/opt/openssl/include".

       If you encounter errors related to OpenSSL not being found during compilation, try adding `-Dopenssl.include.dir=""`.

- **Ubuntu 16.04+ or Other Debian-based Systems**

  Use the following commands to install dependencies:

    ```shell
    sudo apt-get update
    sudo apt-get install gcc g++ bison flex libboost-all-dev libssl-dev
    ```

- **CentOS 7.7+/Fedora/Rocky Linux or Other Red Hat-based Systems**

  Use the yum command to install dependencies:

    ```shell
    sudo yum update
    sudo yum install gcc gcc-c++ boost-devel bison flex openssl-devel
    ```

- **Windows**

    1. Set Up the Build Environment
        - Install MS Visual Studio (version 2019+ recommended): Make sure to select Visual Studio C/C++ IDE and compiler (supporting CMake, Clang, MinGW) during installation.
        - Download and install [CMake](https://cmake.org/download/).

    2. Download and Install Flex, Bison
        - Download [Win_Flex_Bison](https://sourceforge.net/projects/winflexbison/).
        - After downloading, rename the executables to flex.exe and bison.exe to ensure they can be found during compilation, and add the directory of these executables to the PATH environment variable.

    3. Install Boost Library
        - Download [Boost](https://www.boost.org/users/download/).
        - Compile Boost locally: Run `bootstrap.bat` and `b2.exe` in sequence.
        - Add the Boost installation directory to the PATH environment variable, e.g., `C:\Program Files (x86)\boost_1_78_0`.

    4. Install OpenSSL
        - Download and install [OpenSSL](http://slproweb.com/products/Win32OpenSSL.html).
        - Add the include directory under the installation directory to the PATH environment variable.

### 2.2 Compilation

Clone the source code from git:
```shell
git clone https://github.com/apache/iotdb.git
```

The default main branch is the master branch. If you want to use a specific release version, switch to that branch (e.g., version 1.3.2):
```shell
git checkout rc/1.3.2
```

Run Maven to compile in the IoTDB root directory:

- Mac or Linux with glibc version >= 2.32
    ```shell
    ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp
    ``` 

- Linux with glibc version >= 2.31
    ```shell
    ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp -Diotdb-tools-thrift.version=0.14.1.1-old-glibc-SNAPSHOT
    ```

- Linux with glibc version >= 2.17
    ```shell
    ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp -Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT
    ```

- Windows using Visual Studio 2022
    ```batch
    .\mvnw.cmd clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp
    ```

- Windows using Visual Studio 2019
    ```batch
    .\mvnw.cmd clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp -Dcmake.generator="Visual Studio 16 2019" -Diotdb-tools-thrift.version=0.14.1.1-msvc142-SNAPSHOT
    ```
    - If you haven't added the Boost library path to the PATH environment variable, you need to add the relevant parameters to the compile command, e.g., `-DboostIncludeDir="C:\Program Files (x86)\boost_1_78_0" -DboostLibraryDir="C:\Program Files (x86)\boost_1_78_0\stage\lib"`.

After successful compilation, the packaged library files will be located in `iotdb-client/client-cpp/target`, and you can find the compiled example program under `example/client-cpp-example/target`.

### 2.3 Compilation Q&A

Q: What are the requirements for the environment on Linux?

A:
- The known minimum version requirement for glibc (x86_64 version) is 2.17, and the minimum version for GCC is 5.5.
- The known minimum version requirement for glibc (ARM version) is 2.31, and the minimum version for GCC is 10.2.
- If the above requirements are not met, you can try compiling Thrift locally:
    - Download the code from https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift.
    - Run `./mvnw clean install`.
    - Go back to the IoTDB code directory and run `./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp`.

Q: How to resolve the `undefined reference to '_libc_single_thread'` error during Linux compilation?

A:
- This issue is caused by the precompiled Thrift dependencies requiring a higher version of glibc.
- You can try adding `-Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT` or `-Diotdb-tools-thrift.version=0.14.1.1-old-glibc-SNAPSHOT` to the Maven compile command.

Q: What if I need to compile using Visual Studio 2017 or earlier on Windows?

A:
- You can try compiling Thrift locally before compiling the client:
    - Download the code from https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift.
    - Run `.\mvnw.cmd clean install`.
    - Go back to the IoTDB code directory and run `.\mvnw.cmd clean package -pl example/client-cpp-example -am -DskipTests -P with-cpp -Dcmake.generator="Visual Studio 15 2017"`.

## 3. Usage

### 3.1 TableSession Class

All operations in the C++ client are performed through the TableSession class. Below are the method descriptions defined in the TableSession interface.

#### 3.1.1 Method List

1. `insert(Tablet& tablet, bool sorted = false)`: Inserts a Tablet object containing time series data into the database. The sorted parameter indicates whether the rows in the tablet are already sorted by time.
2. `executeNonQueryStatement(string& sql)`: Executes non-query SQL statements, such as DDL (Data Definition Language) or DML (Data Manipulation Language) commands.
3. `executeQueryStatement(string& sql)`: Executes query SQL statements and returns a SessionDataSet object containing the query results. The optional timeoutInMs parameter indicates the timeout return time.
   * Note: When retrieving rows of query results by calling `SessionDataSet::next()`, you must store the returned `std::shared_ptr<RowRecord>` object in a local scope variable (e.g.: `auto row = dataSet->next();`) to ensure the validity of the data lifecycle. If you access it directly via `.get()` or a raw pointer (e.g., `dataSet->next().get()`), the reference count of the smart pointer will drop to zero, the data will be released immediately, and subsequent access will lead to undefined behavior.
4. `open(bool enableRPCCompression = false)`: Opens the connection and determines whether to enable RPC compression (client state must match server state, disabled by default).
5. `close()`: Closes the connection.

#### 3.1.2 Interface Display

```cpp
class TableSession {
private:
    Session* session;
public:
    TableSession(Session* session) {
        this->session = session;
    }
    void insert(Tablet& tablet, bool sorted = false);
    void executeNonQueryStatement(const std::string& sql);
    unique_ptr<SessionDataSet> executeQueryStatement(const std::string& sql);
    unique_ptr<SessionDataSet> executeQueryStatement(const std::string& sql, int64_t timeoutInMs);
    string getDatabase(); //Get the currently selected database, can be replaced by executeNonQueryStatement
    void open(bool enableRPCCompression = false);
    void close();
};
```

### 3.2 TableSessionBuilder Class

The TableSessionBuilder class is a builder used to configure and create instances of the TableSession class. Through it, you can conveniently set connection parameters, query parameters, and other settings when creating instances.

#### 3.2.1 Usage Example

```cpp
//Set connection IP, port, username, password
//The order of settings is arbitrary, just ensure build() is called last, the created instance is connected by default through open()
session = (new TableSessionBuilder())
            ->host("127.0.0.1")
            ->rpcPort(6667)
            ->username("root")
            ->password("TimechoDB@2021") //before V2.0.6 it is root
            ->build();
```

#### 3.2.2 Configurable Parameter List

| **Parameter Name** | **Description** |              **Default Value**              |
| :---: | :---: |:-------------------------------------------:|
| host | Set the connected node IP |          "127.0.0.1" ("localhost")          |
| rpcPort | Set the connected node port |                    6667                     |
| username | Set the connection username |                   "root"                    |
| password | Set the connection password | "TimechoDB@2021" //before V2.0.6 it is root |
| zoneId | Set the ZoneId related to timezone |                     ""                      |
| fetchSize | Set the query result fetch size |                    10000                    |
| database | Set the target database name |                     ""                      |

## 4. Examples

The sample code of using these interfaces is in:

- `example/client-cpp-example/src/TableSessionExample.cpp`: [TableSessionExample](https://github.com/apache/iotdb/tree/rc/2.0.1/example/client-cpp-example/src/TableSessionExample.cpp)

If the compilation finishes successfully, the example project will be placed under `example/client-cpp-example/target`

## 5. FAQ

### 5.1 on Mac

If errors occur when compiling thrift source code, try to downgrade your xcode-commandline from 12 to 11.5

see https://stackoverflow.com/questions/63592445/ld-unsupported-tapi-file-type-tapi-tbd-in-yaml-file/65518087#65518087


### 5.2 on Windows

When Building Thrift and downloading packages via "wget", a possible annoying issue may occur with
error message looks like:
```shell
Failed to delete cached file C:\Users\Administrator\.m2\repository\.cache\download-maven-plugin\index.ser
```
Possible fixes:
- Try to delete the ".m2\repository\\.cache\" directory and try again.
- Add "\<skipCache>true\</skipCache>" configuration to the download-maven-plugin maven phase that complains this error.

