This is an automated email from the ASF dual-hosted git repository.
critas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iotdb-docs.git
The following commit(s) were added to refs/heads/main by this push:
new 2e284112 feat: add TableModel C++ API docs. (#638)
2e284112 is described below
commit 2e2841127f62e3de4b424184ed0a19ee89e68147
Author: xiangmy21 <[email protected]>
AuthorDate: Tue Mar 25 11:48:34 2025 +0800
feat: add TableModel C++ API docs. (#638)
* feat: add TableModel C++ API docs.
* feat: add TableModel C++ API docs.
---
src/.vuepress/sidebar/V2.0.x/en-Table.ts | 1 +
src/.vuepress/sidebar/V2.0.x/zh-Table.ts | 1 +
src/.vuepress/sidebar_timecho/V2.0.x/en-Table.ts | 1 +
src/.vuepress/sidebar_timecho/V2.0.x/zh-Table.ts | 1 +
.../Master/Table/API/Programming-Cpp-Native-API.md | 250 +++++++++++
.../latest-Table/API/Programming-Cpp-Native-API.md | 250 +++++++++++
.../Master/Table/API/Programming-Cpp-Native-API.md | 461 +++++++++++++++++++++
.../latest-Table/API/Programming-Cpp-Native-API.md | 461 +++++++++++++++++++++
8 files changed, 1426 insertions(+)
diff --git a/src/.vuepress/sidebar/V2.0.x/en-Table.ts
b/src/.vuepress/sidebar/V2.0.x/en-Table.ts
index 1e8e5716..0525331d 100644
--- a/src/.vuepress/sidebar/V2.0.x/en-Table.ts
+++ b/src/.vuepress/sidebar/V2.0.x/en-Table.ts
@@ -121,6 +121,7 @@ export const enSidebar = {
children: [
{ text: 'Java Native API', link: 'Programming-Java-Native-API_apache'
},
{ text: 'Python Native API', link: 'Programming-Python-Native-API' },
+ { text: 'C++ Native API', link: 'Programming-Cpp-Native-API' },
{ text: 'JDBC', link: 'Programming-JDBC_apache' },
{ text: 'RESTAPI V1 ', link: 'RestAPI-V1' },
],
diff --git a/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
b/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
index 789bd14f..d82b8605 100644
--- a/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
+++ b/src/.vuepress/sidebar/V2.0.x/zh-Table.ts
@@ -113,6 +113,7 @@ export const zhSidebar = {
children: [
{ text: 'Java原生接口', link: 'Programming-Java-Native-API_apache' },
{ text: 'Python原生接口', link: 'Programming-Python-Native-API' },
+ { text: 'C++原生接口', link: 'Programming-Cpp-Native-API' },
{ text: 'JDBC', link: 'Programming-JDBC_apache' },
{ text: 'RESTAPI V1 ', link: 'RestServiceV1' },
],
diff --git a/src/.vuepress/sidebar_timecho/V2.0.x/en-Table.ts
b/src/.vuepress/sidebar_timecho/V2.0.x/en-Table.ts
index 7a7d9715..86b3c435 100644
--- a/src/.vuepress/sidebar_timecho/V2.0.x/en-Table.ts
+++ b/src/.vuepress/sidebar_timecho/V2.0.x/en-Table.ts
@@ -126,6 +126,7 @@ export const enSidebar = {
children: [
{ text: 'Java Native API', link: 'Programming-Java-Native-API_timecho'
},
{ text: 'Python Native API', link: 'Programming-Python-Native-API' },
+ { text: 'C++ Native API', link: 'Programming-Cpp-Native-API' },
{ text: 'JDBC', link: 'Programming-JDBC_timecho' },
{ text: 'RESTAPI V1 ', link: 'RestAPI-V1' },
],
diff --git a/src/.vuepress/sidebar_timecho/V2.0.x/zh-Table.ts
b/src/.vuepress/sidebar_timecho/V2.0.x/zh-Table.ts
index 38628b0b..63aa0c86 100644
--- a/src/.vuepress/sidebar_timecho/V2.0.x/zh-Table.ts
+++ b/src/.vuepress/sidebar_timecho/V2.0.x/zh-Table.ts
@@ -117,6 +117,7 @@ export const zhSidebar = {
children: [
{ text: 'Java原生接口', link: 'Programming-Java-Native-API_timecho' },
{ text: 'Python原生接口', link: 'Programming-Python-Native-API' },
+ { text: 'C++原生接口', link: 'Programming-Cpp-Native-API' },
{ text: 'JDBC', link: 'Programming-JDBC_timecho' },
{ text: 'RESTAPI V1 ', link: 'RestServiceV1' },
],
diff --git a/src/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
b/src/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
new file mode 100644
index 00000000..a62bfc5a
--- /dev/null
+++ b/src/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
@@ -0,0 +1,250 @@
+<!--
+
+ 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.
+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("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 | "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.
+
diff --git a/src/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
b/src/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
new file mode 100644
index 00000000..a62bfc5a
--- /dev/null
+++ b/src/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
@@ -0,0 +1,250 @@
+<!--
+
+ 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.
+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("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 | "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.
+
diff --git a/src/zh/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
b/src/zh/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
new file mode 100644
index 00000000..12bc48ce
--- /dev/null
+++ b/src/zh/UserGuide/Master/Table/API/Programming-Cpp-Native-API.md
@@ -0,0 +1,461 @@
+<!--
+
+ 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++ 原生接口
+
+## 1. 依赖
+
+- Java 8+
+- Flex
+- Bison 2.7+
+- Boost 1.56+
+- OpenSSL 1.0+
+- GCC 5.5.0+
+
+
+## 2. 安装
+
+### 2.1 安装相关依赖
+
+- **MAC**
+ 1. 安装 Bison :
+
+ 使用下面 brew 命令安装 bison 版本:
+ ```shell
+ brew install bison
+ ```
+
+ 2. 安装 Boost :确保安装最新的 Boost 版本。
+
+ ```shell
+ brew install boost
+ ```
+
+ 3. 检查 OpenSSL :确保 openssl 库已安装,默认的 openssl
头文件路径为"/usr/local/opt/openssl/include"
+
+ 如果在编译过程中出现找不到 openssl 的错误,尝试添加`-Dopenssl.include.dir=""`
+
+
+- **Ubuntu 16.04+ 或其他 Debian 系列**
+
+ 使用以下命令安装所赖:
+
+ ```shell
+ sudo apt-get update
+ sudo apt-get install gcc g++ bison flex libboost-all-dev libssl-dev
+ ```
+
+
+- **CentOS 7.7+/Fedora/Rocky Linux 或其他 Red-hat 系列**
+
+ 使用 yum 命令安装依赖:
+
+ ```shell
+ sudo yum update
+ sudo yum install gcc gcc-c++ boost-devel bison flex openssl-devel
+ ```
+
+
+- **Windows**
+
+1. 构建编译环境
+ - 安装 MS Visual Studio(推荐安装 2019+ 版本):安装时需要勾选 Visual Studio C/C++ IDE and
compiler(supporting CMake, Clang, MinGW)
+ - 下载安装 [CMake](https://cmake.org/download/) 。
+
+2. 下载安装 Flex、Bison
+ - 下载 [Win_Flex_Bison](https://sourceforge.net/projects/winflexbison/)
+ - 下载后需要将可执行文件重命名为 flex.exe 和 bison.exe 以保证编译时能够被找到,添加可执行文件的目录到 PATH 环境变量中
+
+3. 安装 Boost 库
+ - 下载 [Boost](https://www.boost.org/users/download/)
+ - 本地编译 Boost :依次执行 bootstrap.bat 和 b2.exe
+ - 添加 Boost 安装目录到 PATH 环境变量中,例如 `C:\Program Files (x86)\boost_1_78_0`
+
+4. 安装 OpenSSL
+ - 下载安装 [OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
+ - 添加 OpenSSL 下的 include 目录到 PATH 环境变量中
+
+
+### 2.2 执行编译
+
+从 git 克隆源代码:
+```shell
+git clone https://github.com/apache/iotdb.git
+```
+
+默认的主分支是 master 分支,如果你想使用某个发布版本,请切换分支 (如 1.3.2 版本):
+```shell
+git checkout rc/1.3.2
+```
+
+在 IoTDB 根目录下执行 maven 编译:
+
+- Mac 或 glibc 版本 >= 2.32 的 Linux
+ ```shell
+ ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp
+ ```
+
+- glibc 版本 >= 2.31 的 Linux
+ ```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
+ ```
+
+- glibc 版本 >= 2.17 的 Linux
+ ```shell
+ ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp -Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT
+ ```
+
+- 使用 Visual Studio 2022 的 Windows
+ ```batch
+ .\mvnw.cmd clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp
+ ```
+
+- 使用 Visual Studio 2019 的 Windows
+ ```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
+ ```
+ - 如果没有将 Boost 库地址加入 PATH
环境变量,在编译命令中还需添加相关参数,例如:`-DboostIncludeDir="C:\Program Files (x86)\boost_1_78_0"
-DboostLibraryDir="C:\Program Files (x86)\boost_1_78_0\stage\lib"`
+
+编译成功后,打包好的库文件位于 `iotdb-client/client-cpp/target` 中,同时可以在
`example/client-cpp-example/target` 下找到编译好的示例程序。
+
+### 2.3 编译 Q&A
+
+Q:Linux 上的环境有哪些要求呢?
+
+A:
+- 已知依赖的 glibc (x86_64 版本) 最低版本要求为 2.17,GCC 最低版本为 5.5
+- 已知依赖的 glibc (ARM 版本) 最低版本要求为 2.31,GCC 最低版本为 10.2
+- 如果不满足上面的要求,可以尝试自己本地编译 Thrift
+ - 下载
https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift
这里的代码
+ - 执行 `./mvnw clean install`
+ - 回到 iotdb 代码目录执行 `./mvnw clean package -pl example/client-cpp-example -am
-DskipTests -P with-cpp`
+
+
+Q:Linux 编译报错`undefined reference to '_libc_sinle_thread'`如何处理?
+
+A:
+- 该问题是用于默认的预编译 Thrift 依赖了过高的 glibc 版本导致的
+- 可以尝试在编译的 maven 命令中增加
`-Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT` 或者
`-Diotdb-tools-thrift.version=0.14.1.1-old-glibc-SNAPSHOT`
+
+Q:如果在 Windows 上需要使用 Visual Studio 2017 或更早版本进行编译,要怎么做?
+
+A:
+- 可以尝试自己本地编译 Thrift 后再进行客户端的编译
+ - 下载
https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift
这里的代码
+ - 执行 `.\mvnw.cmd clean install`
+ - 回到 iotdb 代码目录执行 `.\mvnw.cmd clean package -pl example/client-cpp-example
-am -DskipTests -P with-cpp -Dcmake.generator="Visual Studio 15 2017"`
+
+Q: Windows 上使用 Visual Studio 进行编译时出现乱码,如何解决?
+
+A:
+- 该问题是由于项目整体使用 utf-8 编码,而编译用到的一些 windows 系统文件编码不是 utf-8(系统编码默认跟随地区,在中国为 GBK)
+- 可以在控制面板中更改系统区域设置,具体操作方法为:打开控制面板 -> 时钟和区域 -> 区域,切换到管理选项卡,在 "非Unicode程序的语言"
下,选择更改系统区域设置,勾选 `Beta版:使用Unicode UTF-8提供全球语言支持`
后重启电脑。(细节可能随windows版本有差异,可在网上寻找详细教程)
+- 注意,修改 windows 系统编码后可能会导致一些其他使用 GBK 编码的程序出现乱码,将系统区域改回后可复原,请自行斟酌。
+
+## 3. 使用方式
+
+### 3.1 TableSession 类
+
+C++ 客户端的操作均通过 TableSession 类进行,下面将给出 TableSession 接口中定义的方法说明。
+
+#### 3.1.1 方法列表
+
+1. `insert(Tablet& tablet, bool sorted =
false)`,将一个包含时间序列数据的Tablet对象插入到数据库中,sorted参数指明tablet中的行是否已按时间排序。
+2. `executeNonQueryStatement(string&
sql)`,执行非查询SQL语句,如DDL(数据定义语言)或DML(数据操作语言)命令。
+3. `executeQueryStatement(string&
sql)`,执行查询SQL语句,并返回包含查询结果的SessionDataSet对象,可选timeoutInMs参数指示超时返回时间。
+4. `open(bool enableRPCCompression =
false)`,开启连接,并决定是否启用RPC压缩(客户端状态须与服务端一致,默认不开启)。
+5. `close()`,关闭连接。
+
+### 3.1.2 接口展示
+
+```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(); //获取当前选择的database,可由executeNonQueryStatement代替
+ void open(bool enableRPCCompression = false);
+ void close();
+};
+```
+
+### 3.2 TableSessionBuilder 类
+
+TableSessionBuilder类是一个构建器,用于配置和创建TableSession类的实例,通过它可以在创建实例时方便地设置连接参数、查询参数等。
+
+#### 3.2.1 使用示例
+
+```cpp
+//设置连接的IP、端口、用户名、密码
+//设置的顺序任意,确保最后调用build()即可,创建的实例默认已进行open()连接操作
+session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->build();
+```
+
+#### 3.2.2 可设置的参数列表
+
+| **参数名** | **描述** | **默认值** |
+| :---: | :---: | :---: |
+| host | 设置连接的节点IP | "127.0.0.1" ("localhost") |
+| rpcPort | 设置连接的节点端口 | 6667 |
+| username | 设置连接的用户名 | "root" |
+| password | 设置连接密码 | "root" |
+| zoneId | 设置时区相关的ZoneId | "" |
+| fetchSize | 设置查询结果的获取大小 | 10000 |
+| database | 设置目标数据库名称 | "" |
+
+
+## 4. 示例代码
+
+示例工程源代码:
+
+- `example/client-cpp-example/src/TableModelSessionExample.cpp` :
[TableModelSessionExample](https://github.com/apache/iotdb/tree/rc/2.0.1/example/client-cpp-example/src/TableModelSessionExample.cpp)
+
+编译成功后,示例代码工程位于 `example/client-cpp-example/target`
+
+```cpp
+#include "TableSession.h"
+#include "TableSessionBuilder.h"
+
+using namespace std;
+
+TableSession *session;
+
+void insertRelationalTablet() {
+
+ vector<pair<string, TSDataType::TSDataType>> schemaList {
+ make_pair("region_id", TSDataType::TEXT),
+ make_pair("plant_id", TSDataType::TEXT),
+ make_pair("device_id", TSDataType::TEXT),
+ make_pair("model", TSDataType::TEXT),
+ make_pair("temperature", TSDataType::FLOAT),
+ make_pair("humidity", TSDataType::DOUBLE)
+ };
+
+ vector<ColumnCategory> columnTypes = {
+ ColumnCategory::TAG,
+ ColumnCategory::TAG,
+ ColumnCategory::TAG,
+ ColumnCategory::ATTRIBUTE,
+ ColumnCategory::FIELD,
+ ColumnCategory::FIELD
+ };
+
+ Tablet tablet("table1", schemaList, columnTypes, 100);
+
+ for (int row = 0; row < 100; row++) {
+ int rowIndex = tablet.rowSize++;
+ tablet.timestamps[rowIndex] = row;
+ tablet.addValue("region_id", rowIndex, "1");
+ tablet.addValue("plant_id", rowIndex, "5");
+ tablet.addValue("device_id", rowIndex, "3");
+ tablet.addValue("model", rowIndex, "A");
+ tablet.addValue("temperature", rowIndex, 37.6F);
+ tablet.addValue("humidity", rowIndex, 111.1);
+ if (tablet.rowSize == tablet.maxRowNumber) {
+ session->insert(tablet);
+ tablet.reset();
+ }
+ }
+
+ if (tablet.rowSize != 0) {
+ session->insert(tablet);
+ tablet.reset();
+ }
+}
+
+void Output(unique_ptr<SessionDataSet> &dataSet) {
+ for (const string &name: dataSet->getColumnNames()) {
+ cout << name << " ";
+ }
+ cout << endl;
+ while (dataSet->hasNext()) {
+ cout << dataSet->next()->toString();
+ // 可通过 RowRecord* row = dataSet->next();
+ // for(auto field: row.fields) field.intV/longV/stringV 来获取值
+ }
+ cout << endl;
+}
+
+void OutputWithType(unique_ptr<SessionDataSet> &dataSet) {
+ for (const string &name: dataSet->getColumnNames()) {
+ cout << name << " ";
+ }
+ cout << endl;
+ for (const string &type: dataSet->getColumnTypeList()) {
+ cout << type << " ";
+ }
+ cout << endl;
+ while (dataSet->hasNext()) {
+ cout << dataSet->next()->toString();
+ }
+ cout << endl;
+}
+
+int main() {
+ try {
+ session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->build();
+
+
+ cout << "[Create Database db1,db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS
db1");
+ session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS
db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Use db1 as database]\n" << endl;
+ try {
+ session->executeNonQueryStatement("USE db1");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Create Table table1,table2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("create table
db1.table1(region_id STRING TAG, plant_id STRING TAG, device_id STRING TAG,
model STRING ATTRIBUTE, temperature FLOAT FIELD, humidity DOUBLE FIELD) with
(TTL=3600000)");
+ session->executeNonQueryStatement("create table
db2.table2(region_id STRING TAG, plant_id STRING TAG, color STRING ATTRIBUTE,
temperature FLOAT FIELD, speed DOUBLE FIELD) with (TTL=6600000)");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show Tables]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show tables from specific database]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES FROM db1");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[InsertTablet]\n" << endl;
+ try {
+ insertRelationalTablet();
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Query Table Data]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SELECT * FROM table1"
+ " where region_id = '1' and plant_id in ('3', '5') and
device_id = '3'");
+ OutputWithType(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ session->close();
+
+ // specify database in constructor
+ session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->database("db1")
+ ->build();
+
+ cout << "[Show tables from current database(db1)]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Change database to db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("USE db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show tables from current database(db2)]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Drop Database db1,db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("DROP DATABASE db1");
+ session->executeNonQueryStatement("DROP DATABASE db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "session close\n" << endl;
+ session->close();
+
+ delete session;
+
+ cout << "finished!\n" << endl;
+ } catch (IoTDBConnectionException &e) {
+ cout << e.what() << endl;
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+ return 0;
+}
+```
+
+## 5. FAQ
+
+### 5.1 Thrift 编译相关问题
+
+1. MAC:本地 Maven 编译 Thrift 时如出现以下链接的问题,可以尝试将 xcode-commandline 版本从 12 降低到 11.5
+
https://stackoverflow.com/questions/63592445/ld-unsupported-tapi-file-type-tapi-tbd-in-yaml-file/65518087#65518087
+
+
+2. Windows:Maven 编译 Thrift 时需要使用 wget 下载远端文件,可能出现以下报错:
+ ```
+ Failed to delete cached file
C:\Users\Administrator\.m2\repository\.cache\download-maven-plugin\index.ser
+ ```
+
+ 解决方法:
+ - 尝试删除 ".m2\repository\\.cache\" 目录并重试。
+ - 在添加 pom 文件对应的 download-maven-plugin 中添加 "\<skipCache>true\</skipCache>"
diff --git a/src/zh/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
b/src/zh/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
new file mode 100644
index 00000000..12bc48ce
--- /dev/null
+++ b/src/zh/UserGuide/latest-Table/API/Programming-Cpp-Native-API.md
@@ -0,0 +1,461 @@
+<!--
+
+ 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++ 原生接口
+
+## 1. 依赖
+
+- Java 8+
+- Flex
+- Bison 2.7+
+- Boost 1.56+
+- OpenSSL 1.0+
+- GCC 5.5.0+
+
+
+## 2. 安装
+
+### 2.1 安装相关依赖
+
+- **MAC**
+ 1. 安装 Bison :
+
+ 使用下面 brew 命令安装 bison 版本:
+ ```shell
+ brew install bison
+ ```
+
+ 2. 安装 Boost :确保安装最新的 Boost 版本。
+
+ ```shell
+ brew install boost
+ ```
+
+ 3. 检查 OpenSSL :确保 openssl 库已安装,默认的 openssl
头文件路径为"/usr/local/opt/openssl/include"
+
+ 如果在编译过程中出现找不到 openssl 的错误,尝试添加`-Dopenssl.include.dir=""`
+
+
+- **Ubuntu 16.04+ 或其他 Debian 系列**
+
+ 使用以下命令安装所赖:
+
+ ```shell
+ sudo apt-get update
+ sudo apt-get install gcc g++ bison flex libboost-all-dev libssl-dev
+ ```
+
+
+- **CentOS 7.7+/Fedora/Rocky Linux 或其他 Red-hat 系列**
+
+ 使用 yum 命令安装依赖:
+
+ ```shell
+ sudo yum update
+ sudo yum install gcc gcc-c++ boost-devel bison flex openssl-devel
+ ```
+
+
+- **Windows**
+
+1. 构建编译环境
+ - 安装 MS Visual Studio(推荐安装 2019+ 版本):安装时需要勾选 Visual Studio C/C++ IDE and
compiler(supporting CMake, Clang, MinGW)
+ - 下载安装 [CMake](https://cmake.org/download/) 。
+
+2. 下载安装 Flex、Bison
+ - 下载 [Win_Flex_Bison](https://sourceforge.net/projects/winflexbison/)
+ - 下载后需要将可执行文件重命名为 flex.exe 和 bison.exe 以保证编译时能够被找到,添加可执行文件的目录到 PATH 环境变量中
+
+3. 安装 Boost 库
+ - 下载 [Boost](https://www.boost.org/users/download/)
+ - 本地编译 Boost :依次执行 bootstrap.bat 和 b2.exe
+ - 添加 Boost 安装目录到 PATH 环境变量中,例如 `C:\Program Files (x86)\boost_1_78_0`
+
+4. 安装 OpenSSL
+ - 下载安装 [OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
+ - 添加 OpenSSL 下的 include 目录到 PATH 环境变量中
+
+
+### 2.2 执行编译
+
+从 git 克隆源代码:
+```shell
+git clone https://github.com/apache/iotdb.git
+```
+
+默认的主分支是 master 分支,如果你想使用某个发布版本,请切换分支 (如 1.3.2 版本):
+```shell
+git checkout rc/1.3.2
+```
+
+在 IoTDB 根目录下执行 maven 编译:
+
+- Mac 或 glibc 版本 >= 2.32 的 Linux
+ ```shell
+ ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp
+ ```
+
+- glibc 版本 >= 2.31 的 Linux
+ ```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
+ ```
+
+- glibc 版本 >= 2.17 的 Linux
+ ```shell
+ ./mvnw clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp -Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT
+ ```
+
+- 使用 Visual Studio 2022 的 Windows
+ ```batch
+ .\mvnw.cmd clean package -pl example/client-cpp-example -am -DskipTests -P
with-cpp
+ ```
+
+- 使用 Visual Studio 2019 的 Windows
+ ```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
+ ```
+ - 如果没有将 Boost 库地址加入 PATH
环境变量,在编译命令中还需添加相关参数,例如:`-DboostIncludeDir="C:\Program Files (x86)\boost_1_78_0"
-DboostLibraryDir="C:\Program Files (x86)\boost_1_78_0\stage\lib"`
+
+编译成功后,打包好的库文件位于 `iotdb-client/client-cpp/target` 中,同时可以在
`example/client-cpp-example/target` 下找到编译好的示例程序。
+
+### 2.3 编译 Q&A
+
+Q:Linux 上的环境有哪些要求呢?
+
+A:
+- 已知依赖的 glibc (x86_64 版本) 最低版本要求为 2.17,GCC 最低版本为 5.5
+- 已知依赖的 glibc (ARM 版本) 最低版本要求为 2.31,GCC 最低版本为 10.2
+- 如果不满足上面的要求,可以尝试自己本地编译 Thrift
+ - 下载
https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift
这里的代码
+ - 执行 `./mvnw clean install`
+ - 回到 iotdb 代码目录执行 `./mvnw clean package -pl example/client-cpp-example -am
-DskipTests -P with-cpp`
+
+
+Q:Linux 编译报错`undefined reference to '_libc_sinle_thread'`如何处理?
+
+A:
+- 该问题是用于默认的预编译 Thrift 依赖了过高的 glibc 版本导致的
+- 可以尝试在编译的 maven 命令中增加
`-Diotdb-tools-thrift.version=0.14.1.1-glibc223-SNAPSHOT` 或者
`-Diotdb-tools-thrift.version=0.14.1.1-old-glibc-SNAPSHOT`
+
+Q:如果在 Windows 上需要使用 Visual Studio 2017 或更早版本进行编译,要怎么做?
+
+A:
+- 可以尝试自己本地编译 Thrift 后再进行客户端的编译
+ - 下载
https://github.com/apache/iotdb-bin-resources/tree/iotdb-tools-thrift-v0.14.1.0/iotdb-tools-thrift
这里的代码
+ - 执行 `.\mvnw.cmd clean install`
+ - 回到 iotdb 代码目录执行 `.\mvnw.cmd clean package -pl example/client-cpp-example
-am -DskipTests -P with-cpp -Dcmake.generator="Visual Studio 15 2017"`
+
+Q: Windows 上使用 Visual Studio 进行编译时出现乱码,如何解决?
+
+A:
+- 该问题是由于项目整体使用 utf-8 编码,而编译用到的一些 windows 系统文件编码不是 utf-8(系统编码默认跟随地区,在中国为 GBK)
+- 可以在控制面板中更改系统区域设置,具体操作方法为:打开控制面板 -> 时钟和区域 -> 区域,切换到管理选项卡,在 "非Unicode程序的语言"
下,选择更改系统区域设置,勾选 `Beta版:使用Unicode UTF-8提供全球语言支持`
后重启电脑。(细节可能随windows版本有差异,可在网上寻找详细教程)
+- 注意,修改 windows 系统编码后可能会导致一些其他使用 GBK 编码的程序出现乱码,将系统区域改回后可复原,请自行斟酌。
+
+## 3. 使用方式
+
+### 3.1 TableSession 类
+
+C++ 客户端的操作均通过 TableSession 类进行,下面将给出 TableSession 接口中定义的方法说明。
+
+#### 3.1.1 方法列表
+
+1. `insert(Tablet& tablet, bool sorted =
false)`,将一个包含时间序列数据的Tablet对象插入到数据库中,sorted参数指明tablet中的行是否已按时间排序。
+2. `executeNonQueryStatement(string&
sql)`,执行非查询SQL语句,如DDL(数据定义语言)或DML(数据操作语言)命令。
+3. `executeQueryStatement(string&
sql)`,执行查询SQL语句,并返回包含查询结果的SessionDataSet对象,可选timeoutInMs参数指示超时返回时间。
+4. `open(bool enableRPCCompression =
false)`,开启连接,并决定是否启用RPC压缩(客户端状态须与服务端一致,默认不开启)。
+5. `close()`,关闭连接。
+
+### 3.1.2 接口展示
+
+```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(); //获取当前选择的database,可由executeNonQueryStatement代替
+ void open(bool enableRPCCompression = false);
+ void close();
+};
+```
+
+### 3.2 TableSessionBuilder 类
+
+TableSessionBuilder类是一个构建器,用于配置和创建TableSession类的实例,通过它可以在创建实例时方便地设置连接参数、查询参数等。
+
+#### 3.2.1 使用示例
+
+```cpp
+//设置连接的IP、端口、用户名、密码
+//设置的顺序任意,确保最后调用build()即可,创建的实例默认已进行open()连接操作
+session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->build();
+```
+
+#### 3.2.2 可设置的参数列表
+
+| **参数名** | **描述** | **默认值** |
+| :---: | :---: | :---: |
+| host | 设置连接的节点IP | "127.0.0.1" ("localhost") |
+| rpcPort | 设置连接的节点端口 | 6667 |
+| username | 设置连接的用户名 | "root" |
+| password | 设置连接密码 | "root" |
+| zoneId | 设置时区相关的ZoneId | "" |
+| fetchSize | 设置查询结果的获取大小 | 10000 |
+| database | 设置目标数据库名称 | "" |
+
+
+## 4. 示例代码
+
+示例工程源代码:
+
+- `example/client-cpp-example/src/TableModelSessionExample.cpp` :
[TableModelSessionExample](https://github.com/apache/iotdb/tree/rc/2.0.1/example/client-cpp-example/src/TableModelSessionExample.cpp)
+
+编译成功后,示例代码工程位于 `example/client-cpp-example/target`
+
+```cpp
+#include "TableSession.h"
+#include "TableSessionBuilder.h"
+
+using namespace std;
+
+TableSession *session;
+
+void insertRelationalTablet() {
+
+ vector<pair<string, TSDataType::TSDataType>> schemaList {
+ make_pair("region_id", TSDataType::TEXT),
+ make_pair("plant_id", TSDataType::TEXT),
+ make_pair("device_id", TSDataType::TEXT),
+ make_pair("model", TSDataType::TEXT),
+ make_pair("temperature", TSDataType::FLOAT),
+ make_pair("humidity", TSDataType::DOUBLE)
+ };
+
+ vector<ColumnCategory> columnTypes = {
+ ColumnCategory::TAG,
+ ColumnCategory::TAG,
+ ColumnCategory::TAG,
+ ColumnCategory::ATTRIBUTE,
+ ColumnCategory::FIELD,
+ ColumnCategory::FIELD
+ };
+
+ Tablet tablet("table1", schemaList, columnTypes, 100);
+
+ for (int row = 0; row < 100; row++) {
+ int rowIndex = tablet.rowSize++;
+ tablet.timestamps[rowIndex] = row;
+ tablet.addValue("region_id", rowIndex, "1");
+ tablet.addValue("plant_id", rowIndex, "5");
+ tablet.addValue("device_id", rowIndex, "3");
+ tablet.addValue("model", rowIndex, "A");
+ tablet.addValue("temperature", rowIndex, 37.6F);
+ tablet.addValue("humidity", rowIndex, 111.1);
+ if (tablet.rowSize == tablet.maxRowNumber) {
+ session->insert(tablet);
+ tablet.reset();
+ }
+ }
+
+ if (tablet.rowSize != 0) {
+ session->insert(tablet);
+ tablet.reset();
+ }
+}
+
+void Output(unique_ptr<SessionDataSet> &dataSet) {
+ for (const string &name: dataSet->getColumnNames()) {
+ cout << name << " ";
+ }
+ cout << endl;
+ while (dataSet->hasNext()) {
+ cout << dataSet->next()->toString();
+ // 可通过 RowRecord* row = dataSet->next();
+ // for(auto field: row.fields) field.intV/longV/stringV 来获取值
+ }
+ cout << endl;
+}
+
+void OutputWithType(unique_ptr<SessionDataSet> &dataSet) {
+ for (const string &name: dataSet->getColumnNames()) {
+ cout << name << " ";
+ }
+ cout << endl;
+ for (const string &type: dataSet->getColumnTypeList()) {
+ cout << type << " ";
+ }
+ cout << endl;
+ while (dataSet->hasNext()) {
+ cout << dataSet->next()->toString();
+ }
+ cout << endl;
+}
+
+int main() {
+ try {
+ session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->build();
+
+
+ cout << "[Create Database db1,db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS
db1");
+ session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS
db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Use db1 as database]\n" << endl;
+ try {
+ session->executeNonQueryStatement("USE db1");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Create Table table1,table2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("create table
db1.table1(region_id STRING TAG, plant_id STRING TAG, device_id STRING TAG,
model STRING ATTRIBUTE, temperature FLOAT FIELD, humidity DOUBLE FIELD) with
(TTL=3600000)");
+ session->executeNonQueryStatement("create table
db2.table2(region_id STRING TAG, plant_id STRING TAG, color STRING ATTRIBUTE,
temperature FLOAT FIELD, speed DOUBLE FIELD) with (TTL=6600000)");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show Tables]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show tables from specific database]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES FROM db1");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[InsertTablet]\n" << endl;
+ try {
+ insertRelationalTablet();
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Query Table Data]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SELECT * FROM table1"
+ " where region_id = '1' and plant_id in ('3', '5') and
device_id = '3'");
+ OutputWithType(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ session->close();
+
+ // specify database in constructor
+ session = (new TableSessionBuilder())
+ ->host("127.0.0.1")
+ ->rpcPort(6667)
+ ->username("root")
+ ->password("root")
+ ->database("db1")
+ ->build();
+
+ cout << "[Show tables from current database(db1)]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Change database to db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("USE db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Show tables from current database(db2)]\n" << endl;
+ try {
+ unique_ptr<SessionDataSet> dataSet =
session->executeQueryStatement("SHOW TABLES");
+ Output(dataSet);
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "[Drop Database db1,db2]\n" << endl;
+ try {
+ session->executeNonQueryStatement("DROP DATABASE db1");
+ session->executeNonQueryStatement("DROP DATABASE db2");
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+
+ cout << "session close\n" << endl;
+ session->close();
+
+ delete session;
+
+ cout << "finished!\n" << endl;
+ } catch (IoTDBConnectionException &e) {
+ cout << e.what() << endl;
+ } catch (IoTDBException &e) {
+ cout << e.what() << endl;
+ }
+ return 0;
+}
+```
+
+## 5. FAQ
+
+### 5.1 Thrift 编译相关问题
+
+1. MAC:本地 Maven 编译 Thrift 时如出现以下链接的问题,可以尝试将 xcode-commandline 版本从 12 降低到 11.5
+
https://stackoverflow.com/questions/63592445/ld-unsupported-tapi-file-type-tapi-tbd-in-yaml-file/65518087#65518087
+
+
+2. Windows:Maven 编译 Thrift 时需要使用 wget 下载远端文件,可能出现以下报错:
+ ```
+ Failed to delete cached file
C:\Users\Administrator\.m2\repository\.cache\download-maven-plugin\index.ser
+ ```
+
+ 解决方法:
+ - 尝试删除 ".m2\repository\\.cache\" 目录并重试。
+ - 在添加 pom 文件对应的 download-maven-plugin 中添加 "\<skipCache>true\</skipCache>"