blob: 510fbb01a5719e9273d49cc1b5f0bd16199784b8 [file]
/**
* 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.
*/
#ifndef IOTDB_SESSION_C_H
#define IOTDB_SESSION_C_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ============================================================
* Error Handling
* ============================================================ */
typedef int64_t TsStatus;
#define TS_OK 0
#define TS_ERR_CONNECTION -1
#define TS_ERR_EXECUTION -2
#define TS_ERR_INVALID_PARAM -3
#define TS_ERR_NULL_PTR -4
#define TS_ERR_UNKNOWN -99
/**
* Returns the error message from the last failed C API call on the current
* thread. The returned pointer is valid until the next C API call on the same
* thread.
*/
const char *ts_get_last_error(void);
/* ============================================================
* Opaque Handle Types
* ============================================================ */
typedef struct CSession_ CSession;
typedef struct CTablet_ CTablet;
typedef struct CSessionDataSet_ CSessionDataSet;
typedef struct CRowRecord_ CRowRecord;
/* ============================================================
* Enums (values match C++ TSDataType / TSEncoding / CompressionType)
* ============================================================ */
typedef enum {
TS_TYPE_BOOLEAN = 0,
TS_TYPE_INT32 = 1,
TS_TYPE_INT64 = 2,
TS_TYPE_FLOAT = 3,
TS_TYPE_DOUBLE = 4,
TS_TYPE_TEXT = 5,
TS_TYPE_TIMESTAMP = 8,
TS_TYPE_DATE = 9,
TS_TYPE_BLOB = 10,
TS_TYPE_STRING = 11,
/** Not a server type; used for invalid arguments / error paths in the C API.
*/
TS_TYPE_INVALID = 255
} TSDataType_C;
typedef enum {
TS_ENCODING_PLAIN = 0,
TS_ENCODING_DICTIONARY = 1,
TS_ENCODING_RLE = 2,
TS_ENCODING_DIFF = 3,
TS_ENCODING_TS_2DIFF = 4,
TS_ENCODING_BITMAP = 5,
TS_ENCODING_GORILLA_V1 = 6,
TS_ENCODING_REGULAR = 7,
TS_ENCODING_GORILLA = 8,
TS_ENCODING_ZIGZAG = 9,
TS_ENCODING_FREQ = 10
} TSEncoding_C;
typedef enum {
TS_COMPRESSION_UNCOMPRESSED = 0,
TS_COMPRESSION_SNAPPY = 1,
TS_COMPRESSION_GZIP = 2,
TS_COMPRESSION_LZO = 3,
TS_COMPRESSION_SDT = 4,
TS_COMPRESSION_PAA = 5,
TS_COMPRESSION_PLA = 6,
TS_COMPRESSION_LZ4 = 7,
TS_COMPRESSION_ZSTD = 8,
TS_COMPRESSION_LZMA2 = 9
} TSCompressionType_C;
/* ============================================================
* Session Lifecycle — Tree Model
* ============================================================ */
CSession *ts_session_new(const char *host, int rpcPort, const char *username,
const char *password);
CSession *ts_session_new_with_zone(const char *host, int rpcPort,
const char *username, const char *password,
const char *zoneId, int fetchSize);
CSession *ts_session_new_multi_node(const char *const *nodeUrls, int urlCount,
const char *username, const char *password);
void ts_session_destroy(CSession *session);
TsStatus ts_session_open(CSession *session);
TsStatus ts_session_open_with_compression(CSession *session,
bool enableRPCCompression);
TsStatus ts_session_close(CSession *session);
/* ============================================================
* Timezone
* ============================================================ */
TsStatus ts_session_set_timezone(CSession *session, const char *zoneId);
TsStatus ts_session_get_timezone(CSession *session, char *buf, int bufLen);
/* ============================================================
* Database Management (Tree Model)
* ============================================================ */
TsStatus ts_session_create_database(CSession *session, const char *database);
TsStatus ts_session_delete_database(CSession *session, const char *database);
TsStatus ts_session_delete_databases(CSession *session,
const char *const *databases, int count);
/* ============================================================
* Timeseries Management (Tree Model)
* ============================================================ */
TsStatus ts_session_create_timeseries(CSession *session, const char *path,
TSDataType_C dataType,
TSEncoding_C encoding,
TSCompressionType_C compressor);
TsStatus ts_session_create_timeseries_ex(
CSession *session, const char *path, TSDataType_C dataType,
TSEncoding_C encoding, TSCompressionType_C compressor, int propsCount,
const char *const *propKeys, const char *const *propValues, int tagsCount,
const char *const *tagKeys, const char *const *tagValues, int attrsCount,
const char *const *attrKeys, const char *const *attrValues,
const char *measurementAlias);
TsStatus ts_session_create_multi_timeseries(
CSession *session, int count, const char *const *paths,
const TSDataType_C *dataTypes, const TSEncoding_C *encodings,
const TSCompressionType_C *compressors);
TsStatus ts_session_create_aligned_timeseries(
CSession *session, const char *deviceId, int count,
const char *const *measurements, const TSDataType_C *dataTypes,
const TSEncoding_C *encodings, const TSCompressionType_C *compressors);
TsStatus ts_session_check_timeseries_exists(CSession *session, const char *path,
bool *exists);
TsStatus ts_session_delete_timeseries(CSession *session, const char *path);
TsStatus ts_session_delete_timeseries_batch(CSession *session,
const char *const *paths,
int count);
/* ============================================================
* Tablet Operations
* ============================================================ */
CTablet *ts_tablet_new(const char *deviceId, int columnCount,
const char *const *columnNames,
const TSDataType_C *dataTypes, int maxRowNumber);
void ts_tablet_destroy(CTablet *tablet);
void ts_tablet_reset(CTablet *tablet);
int ts_tablet_get_row_count(CTablet *tablet);
TsStatus ts_tablet_set_row_count(CTablet *tablet, int rowCount);
TsStatus ts_tablet_add_timestamp(CTablet *tablet, int rowIndex,
int64_t timestamp);
TsStatus ts_tablet_add_value_bool(CTablet *tablet, int colIndex, int rowIndex,
bool value);
TsStatus ts_tablet_add_value_int32(CTablet *tablet, int colIndex, int rowIndex,
int32_t value);
TsStatus ts_tablet_add_value_int64(CTablet *tablet, int colIndex, int rowIndex,
int64_t value);
TsStatus ts_tablet_add_value_float(CTablet *tablet, int colIndex, int rowIndex,
float value);
TsStatus ts_tablet_add_value_double(CTablet *tablet, int colIndex, int rowIndex,
double value);
TsStatus ts_tablet_add_value_string(CTablet *tablet, int colIndex, int rowIndex,
const char *value);
/* ============================================================
* Data Insertion — Tree Model (Record)
* ============================================================ */
TsStatus ts_session_insert_record_str(CSession *session, const char *deviceId,
int64_t time, int count,
const char *const *measurements,
const char *const *values);
TsStatus ts_session_insert_record(CSession *session, const char *deviceId,
int64_t time, int count,
const char *const *measurements,
const TSDataType_C *types,
const void *const *values);
TsStatus ts_session_insert_aligned_record_str(CSession *session,
const char *deviceId,
int64_t time, int count,
const char *const *measurements,
const char *const *values);
TsStatus ts_session_insert_aligned_record(CSession *session,
const char *deviceId, int64_t time,
int count,
const char *const *measurements,
const TSDataType_C *types,
const void *const *values);
/* Batch insert — multiple devices (string values) */
TsStatus ts_session_insert_records_str(
CSession *session, int deviceCount, const char *const *deviceIds,
const int64_t *times, const int *measurementCounts,
const char *const *const *measurementsList,
const char *const *const *valuesList);
TsStatus ts_session_insert_aligned_records_str(
CSession *session, int deviceCount, const char *const *deviceIds,
const int64_t *times, const int *measurementCounts,
const char *const *const *measurementsList,
const char *const *const *valuesList);
/* Batch insert — multiple devices (typed values) */
TsStatus ts_session_insert_records(CSession *session, int deviceCount,
const char *const *deviceIds,
const int64_t *times,
const int *measurementCounts,
const char *const *const *measurementsList,
const TSDataType_C *const *typesList,
const void *const *const *valuesList);
TsStatus ts_session_insert_aligned_records(
CSession *session, int deviceCount, const char *const *deviceIds,
const int64_t *times, const int *measurementCounts,
const char *const *const *measurementsList,
const TSDataType_C *const *typesList, const void *const *const *valuesList);
/* Batch insert — single device (typed values) */
TsStatus ts_session_insert_records_of_one_device(
CSession *session, const char *deviceId, int rowCount, const int64_t *times,
const int *measurementCounts, const char *const *const *measurementsList,
const TSDataType_C *const *typesList, const void *const *const *valuesList,
bool sorted);
TsStatus ts_session_insert_aligned_records_of_one_device(
CSession *session, const char *deviceId, int rowCount, const int64_t *times,
const int *measurementCounts, const char *const *const *measurementsList,
const TSDataType_C *const *typesList, const void *const *const *valuesList,
bool sorted);
/* ============================================================
* Data Insertion — Tree Model (Tablet)
* ============================================================ */
TsStatus ts_session_insert_tablet(CSession *session, CTablet *tablet,
bool sorted);
TsStatus ts_session_insert_aligned_tablet(CSession *session, CTablet *tablet,
bool sorted);
TsStatus ts_session_insert_tablets(CSession *session, int tabletCount,
const char *const *deviceIds,
CTablet **tablets, bool sorted);
TsStatus ts_session_insert_aligned_tablets(CSession *session, int tabletCount,
const char *const *deviceIds,
CTablet **tablets, bool sorted);
/* ============================================================
* Query — Tree Model
* ============================================================ */
TsStatus ts_session_execute_query(CSession *session, const char *sql,
CSessionDataSet **dataSet);
TsStatus ts_session_execute_query_with_timeout(CSession *session,
const char *sql,
int64_t timeoutInMs,
CSessionDataSet **dataSet);
TsStatus ts_session_execute_non_query(CSession *session, const char *sql);
TsStatus ts_session_execute_raw_data_query(CSession *session, int pathCount,
const char *const *paths,
int64_t startTime, int64_t endTime,
CSessionDataSet **dataSet);
TsStatus ts_session_execute_last_data_query(CSession *session, int pathCount,
const char *const *paths,
CSessionDataSet **dataSet);
TsStatus ts_session_execute_last_data_query_with_time(
CSession *session, int pathCount, const char *const *paths,
int64_t lastTime, CSessionDataSet **dataSet);
/* ============================================================
* SessionDataSet & RowRecord — Result Iteration
* ============================================================ */
void ts_dataset_destroy(CSessionDataSet *dataSet);
/** On failure (null handle, exception), see ts_get_last_error(). */
bool ts_dataset_has_next(CSessionDataSet *dataSet);
/** On failure (null handle, exception), see ts_get_last_error(); nullptr may
* also mean end of rows. */
CRowRecord *ts_dataset_next(CSessionDataSet *dataSet);
int ts_dataset_get_column_count(CSessionDataSet *dataSet);
const char *ts_dataset_get_column_name(CSessionDataSet *dataSet, int index);
const char *ts_dataset_get_column_type(CSessionDataSet *dataSet, int index);
void ts_dataset_set_fetch_size(CSessionDataSet *dataSet, int fetchSize);
void ts_row_record_destroy(CRowRecord *record);
int64_t ts_row_record_get_timestamp(CRowRecord *record);
int ts_row_record_get_field_count(CRowRecord *record);
bool ts_row_record_is_null(CRowRecord *record, int index);
bool ts_row_record_get_bool(CRowRecord *record, int index);
int32_t ts_row_record_get_int32(CRowRecord *record, int index);
int64_t ts_row_record_get_int64(CRowRecord *record, int index);
float ts_row_record_get_float(CRowRecord *record, int index);
double ts_row_record_get_double(CRowRecord *record, int index);
const char *ts_row_record_get_string(CRowRecord *record, int index);
/** Returns TS_TYPE_INVALID if record is null or index is out of range. */
TSDataType_C ts_row_record_get_data_type(CRowRecord *record, int index);
/* ============================================================
* Data Deletion (Tree Model)
* ============================================================ */
TsStatus ts_session_delete_data(CSession *session, const char *path,
int64_t endTime);
TsStatus ts_session_delete_data_batch(CSession *session, int pathCount,
const char *const *paths,
int64_t endTime);
TsStatus ts_session_delete_data_range(CSession *session, int pathCount,
const char *const *paths,
int64_t startTime, int64_t endTime);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* IOTDB_SESSION_C_H */