| /** |
| * 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_COMMON_H |
| #define IOTDB_COMMON_H |
| |
| #include <string> |
| #include <vector> |
| #include <exception> |
| |
| #include <thrift/protocol/TBinaryProtocol.h> |
| #include <thrift/protocol/TCompactProtocol.h> |
| #include <thrift/transport/TSocket.h> |
| #include <thrift/transport/TTransportException.h> |
| #include <thrift/transport/TBufferTransports.h> |
| #include <boost/date_time/gregorian/gregorian.hpp> |
| #include <cstdint> |
| #include <boost/optional/optional.hpp> |
| |
| #include "client_types.h" |
| #include "common_types.h" |
| |
| using namespace std; |
| |
| using ::apache::thrift::protocol::TBinaryProtocol; |
| using ::apache::thrift::protocol::TCompactProtocol; |
| using ::apache::thrift::transport::TSocket; |
| using ::apache::thrift::transport::TTransport; |
| using ::apache::thrift::transport::TTransportException; |
| using ::apache::thrift::transport::TBufferedTransport; |
| using ::apache::thrift::transport::TFramedTransport; |
| using ::apache::thrift::TException; |
| |
| using namespace std; |
| |
| constexpr int32_t EMPTY_DATE_INT = 10000101; |
| |
| int32_t parseDateExpressionToInt(const boost::gregorian::date& date); |
| boost::gregorian::date parseIntToDate(int32_t dateInt); |
| |
| std::string getTimePrecision(int32_t timeFactor); |
| |
| std::string formatDatetime(const std::string& format, const std::string& precision, |
| int64_t timestamp, const std::string& zoneId); |
| |
| std::tm convertToTimestamp(int64_t value, int32_t timeFactor); |
| std::tm int32ToDate(int32_t value); |
| |
| namespace Version { |
| enum Version { |
| V_0_12, V_0_13, V_1_0 |
| }; |
| } |
| |
| namespace CompressionType { |
| enum CompressionType { |
| UNCOMPRESSED = (char)0, |
| SNAPPY = (char)1, |
| GZIP = (char)2, |
| LZO = (char)3, |
| SDT = (char)4, |
| PAA = (char)5, |
| PLA = (char)6, |
| LZ4 = (char)7, |
| ZSTD = (char)8, |
| LZMA2 = (char)9, |
| }; |
| } |
| |
| namespace TSDataType { |
| enum TSDataType { |
| BOOLEAN = (char)0, |
| INT32 = (char)1, |
| INT64 = (char)2, |
| FLOAT = (char)3, |
| DOUBLE = (char)4, |
| TEXT = (char)5, |
| VECTOR = (char)6, |
| UNKNOWN = (char)7, |
| TIMESTAMP = (char)8, |
| DATE = (char)9, |
| BLOB = (char)10, |
| STRING = (char)11 |
| }; |
| } |
| |
| TSDataType::TSDataType getDataTypeByStr(const std::string& typeStr); |
| |
| namespace TSEncoding { |
| enum TSEncoding { |
| PLAIN = (char)0, |
| DICTIONARY = (char)1, |
| RLE = (char)2, |
| DIFF = (char)3, |
| TS_2DIFF = (char)4, |
| BITMAP = (char)5, |
| GORILLA_V1 = (char)6, |
| REGULAR = (char)7, |
| GORILLA = (char)8, |
| ZIGZAG = (char)9, |
| FREQ = (char)10, |
| INVALID_ENCODING = (char)255 |
| }; |
| } |
| |
| namespace TSStatusCode { |
| enum TSStatusCode { |
| SUCCESS_STATUS = 200, |
| |
| // System level |
| INCOMPATIBLE_VERSION = 201, |
| CONFIGURATION_ERROR = 202, |
| START_UP_ERROR = 203, |
| SHUT_DOWN_ERROR = 204, |
| |
| // General Error |
| UNSUPPORTED_OPERATION = 300, |
| EXECUTE_STATEMENT_ERROR = 301, |
| MULTIPLE_ERROR = 302, |
| ILLEGAL_PARAMETER = 303, |
| OVERLAP_WITH_EXISTING_TASK = 304, |
| INTERNAL_SERVER_ERROR = 305, |
| |
| // Client, |
| REDIRECTION_RECOMMEND = 400, |
| |
| // Schema Engine |
| DATABASE_NOT_EXIST = 500, |
| DATABASE_ALREADY_EXISTS = 501, |
| SERIES_OVERFLOW = 502, |
| TIMESERIES_ALREADY_EXIST = 503, |
| TIMESERIES_IN_BLACK_LIST = 504, |
| ALIAS_ALREADY_EXIST = 505, |
| PATH_ALREADY_EXIST = 506, |
| METADATA_ERROR = 507, |
| PATH_NOT_EXIST = 508, |
| ILLEGAL_PATH = 509, |
| CREATE_TEMPLATE_ERROR = 510, |
| DUPLICATED_TEMPLATE = 511, |
| UNDEFINED_TEMPLATE = 512, |
| TEMPLATE_NOT_SET = 513, |
| DIFFERENT_TEMPLATE = 514, |
| TEMPLATE_IS_IN_USE = 515, |
| TEMPLATE_INCOMPATIBLE = 516, |
| SEGMENT_NOT_FOUND = 517, |
| PAGE_OUT_OF_SPACE = 518, |
| RECORD_DUPLICATED = 519, |
| SEGMENT_OUT_OF_SPACE = 520, |
| PBTREE_FILE_NOT_EXISTS = 521, |
| OVERSIZE_RECORD = 522, |
| PBTREE_FILE_REDO_LOG_BROKEN = 523, |
| TEMPLATE_NOT_ACTIVATED = 524, |
| |
| // Storage Engine |
| SYSTEM_READ_ONLY = 600, |
| STORAGE_ENGINE_ERROR = 601, |
| STORAGE_ENGINE_NOT_READY = 602, |
| |
| // Query Engine |
| PLAN_FAILED_NETWORK_PARTITION = 721 |
| }; |
| } |
| |
| class Field { |
| public: |
| TSDataType::TSDataType dataType = TSDataType::UNKNOWN; |
| boost::optional<bool> boolV; |
| boost::optional<int> intV; |
| boost::optional<boost::gregorian::date> dateV; |
| boost::optional<int64_t> longV; |
| boost::optional<float> floatV; |
| boost::optional<double> doubleV; |
| boost::optional<std::string> stringV; |
| |
| explicit Field(TSDataType::TSDataType a) { |
| dataType = a; |
| } |
| |
| Field() = default; |
| }; |
| |
| enum class ColumnCategory { |
| TAG, |
| FIELD, |
| ATTRIBUTE |
| }; |
| |
| class MyStringBuffer { |
| public: |
| MyStringBuffer(); |
| explicit MyStringBuffer(const std::string& str); |
| |
| void reserve(size_t n); |
| void clear(); |
| bool hasRemaining(); |
| int getInt(); |
| boost::gregorian::date getDate(); |
| int64_t getInt64(); |
| float getFloat(); |
| double getDouble(); |
| char getChar(); |
| bool getBool(); |
| std::string getString(); |
| |
| void putInt(int ins); |
| void putDate(boost::gregorian::date date); |
| void putInt64(int64_t ins); |
| void putFloat(float ins); |
| void putDouble(double ins); |
| void putChar(char ins); |
| void putBool(bool ins); |
| void putString(const std::string& ins); |
| void concat(const std::string& ins); |
| |
| public: |
| std::string str; |
| size_t pos; |
| |
| private: |
| void checkBigEndian(); |
| const char* getOrderedByte(size_t len); |
| void putOrderedByte(char* buf, int len); |
| |
| private: |
| bool isBigEndian{}; |
| char numericBuf[8]{}; //only be used by int, long, float, double etc. |
| }; |
| |
| class BitMap { |
| public: |
| explicit BitMap(size_t size = 0); |
| void resize(size_t size); |
| bool mark(size_t position); |
| bool unmark(size_t position); |
| void markAll(); |
| void reset(); |
| bool isMarked(size_t position) const; |
| bool isAllUnmarked() const; |
| bool isAllMarked() const; |
| const std::vector<char>& getByteArray() const; |
| size_t getSize() const; |
| |
| private: |
| size_t size; |
| std::vector<char> bits; |
| }; |
| |
| class IoTDBException : public std::exception { |
| public: |
| IoTDBException() = default; |
| |
| explicit IoTDBException(const std::string& m) : message(m) { |
| } |
| |
| explicit IoTDBException(const char* m) : message(m) { |
| } |
| |
| virtual const char* what() const noexcept override { |
| return message.c_str(); |
| } |
| |
| private: |
| std::string message; |
| }; |
| |
| class DateTimeParseException : public IoTDBException { |
| private: |
| std::string parsedString; |
| int errorIndex; |
| |
| public: |
| explicit DateTimeParseException(const std::string& message, |
| std::string parsedData, |
| int errorIndex) |
| : IoTDBException(message), |
| parsedString(std::move(parsedData)), |
| errorIndex(errorIndex) { |
| } |
| |
| explicit DateTimeParseException(const std::string& message, |
| std::string parsedData, |
| int errorIndex, |
| const std::exception& cause) |
| : IoTDBException(message + " [Caused by: " + cause.what() + "]"), |
| parsedString(std::move(parsedData)), |
| errorIndex(errorIndex) { |
| } |
| |
| const std::string& getParsedString() const noexcept { |
| return parsedString; |
| } |
| |
| int getErrorIndex() const noexcept { |
| return errorIndex; |
| } |
| |
| const char* what() const noexcept override { |
| static std::string fullMsg; |
| fullMsg = std::string(IoTDBException::what()) + |
| "\nParsed data: " + parsedString + |
| "\nError index: " + std::to_string(errorIndex); |
| return fullMsg.c_str(); |
| } |
| }; |
| |
| class IoTDBConnectionException : public IoTDBException { |
| public: |
| IoTDBConnectionException() { |
| } |
| |
| explicit IoTDBConnectionException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit IoTDBConnectionException(const std::string& m) : IoTDBException(m) { |
| } |
| }; |
| |
| class ExecutionException : public IoTDBException { |
| public: |
| ExecutionException() { |
| } |
| |
| explicit ExecutionException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit ExecutionException(const std::string& m) : IoTDBException(m) { |
| } |
| |
| explicit ExecutionException(const std::string& m, const TSStatus& tsStatus) : IoTDBException(m), status(tsStatus) { |
| } |
| |
| TSStatus status; |
| }; |
| |
| class BatchExecutionException : public IoTDBException { |
| public: |
| BatchExecutionException() { |
| } |
| |
| explicit BatchExecutionException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit BatchExecutionException(const std::string& m) : IoTDBException(m) { |
| } |
| |
| explicit BatchExecutionException(const std::vector<TSStatus>& statusList) : statusList(statusList) { |
| } |
| |
| BatchExecutionException(const std::string& m, const std::vector<TSStatus>& statusList) : IoTDBException(m), |
| statusList(statusList) { |
| } |
| |
| std::vector<TSStatus> statusList; |
| }; |
| |
| class RedirectException : public IoTDBException { |
| public: |
| RedirectException() { |
| } |
| |
| explicit RedirectException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit RedirectException(const std::string& m) : IoTDBException(m) { |
| } |
| |
| RedirectException(const std::string& m, const TEndPoint& endPoint) : IoTDBException(m), endPoint(endPoint) { |
| } |
| |
| RedirectException(const std::string& m, const map<string, TEndPoint>& deviceEndPointMap) : IoTDBException(m), |
| deviceEndPointMap(deviceEndPointMap) { |
| } |
| |
| RedirectException(const std::string& m, const vector<TEndPoint>& endPointList) : IoTDBException(m), |
| endPointList(endPointList) { |
| } |
| |
| TEndPoint endPoint; |
| map<string, TEndPoint> deviceEndPointMap; |
| vector<TEndPoint> endPointList; |
| }; |
| |
| class UnSupportedDataTypeException : public IoTDBException { |
| public: |
| UnSupportedDataTypeException() { |
| } |
| |
| explicit UnSupportedDataTypeException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit UnSupportedDataTypeException(const std::string& m) : IoTDBException("UnSupported dataType: " + m) { |
| } |
| }; |
| |
| class SchemaNotFoundException : public IoTDBException { |
| public: |
| SchemaNotFoundException() { |
| } |
| |
| explicit SchemaNotFoundException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit SchemaNotFoundException(const std::string& m) : IoTDBException(m) { |
| } |
| }; |
| |
| class StatementExecutionException : public IoTDBException { |
| public: |
| StatementExecutionException() { |
| } |
| |
| explicit StatementExecutionException(const char* m) : IoTDBException(m) { |
| } |
| |
| explicit StatementExecutionException(const std::string& m) : IoTDBException(m) { |
| } |
| }; |
| |
| enum LogLevelType { |
| LEVEL_DEBUG = 0, |
| LEVEL_INFO, |
| LEVEL_WARN, |
| LEVEL_ERROR |
| }; |
| |
| extern LogLevelType LOG_LEVEL; |
| |
| #define log_debug(fmt,...) do {if(LOG_LEVEL <= LEVEL_DEBUG) {string s=string("[DEBUG] %s:%d (%s) - ") + fmt + "\n"; printf(s.c_str(), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);}} while(0) |
| #define log_info(fmt,...) do {if(LOG_LEVEL <= LEVEL_INFO) {string s=string("[INFO] %s:%d (%s) - ") + fmt + "\n"; printf(s.c_str(), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);}} while(0) |
| #define log_warn(fmt,...) do {if(LOG_LEVEL <= LEVEL_WARN) {string s=string("[WARN] %s:%d (%s) - ") + fmt + "\n"; printf(s.c_str(), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);}} while(0) |
| #define log_error(fmt,...) do {if(LOG_LEVEL <= LEVEL_ERROR) {string s=string("[ERROR] %s:%d (%s) - ") + fmt + "\n"; printf(s.c_str(), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);}} while(0) |
| |
| class RpcUtils { |
| public: |
| std::shared_ptr<TSStatus> SUCCESS_STATUS; |
| |
| RpcUtils() { |
| SUCCESS_STATUS = std::make_shared<TSStatus>(); |
| SUCCESS_STATUS->__set_code(TSStatusCode::SUCCESS_STATUS); |
| } |
| |
| static void verifySuccess(const TSStatus& status); |
| |
| static void verifySuccessWithRedirection(const TSStatus& status); |
| |
| static void verifySuccessWithRedirectionForMultiDevices(const TSStatus& status, vector<string> devices); |
| |
| static void verifySuccess(const std::vector<TSStatus>& statuses); |
| |
| static TSStatus getStatus(TSStatusCode::TSStatusCode tsStatusCode); |
| |
| static TSStatus getStatus(int code, const std::string& message); |
| |
| static std::shared_ptr<TSExecuteStatementResp> getTSExecuteStatementResp(TSStatusCode::TSStatusCode tsStatusCode); |
| |
| static std::shared_ptr<TSExecuteStatementResp> |
| getTSExecuteStatementResp(TSStatusCode::TSStatusCode tsStatusCode, const std::string& message); |
| |
| static std::shared_ptr<TSExecuteStatementResp> getTSExecuteStatementResp(const TSStatus& status); |
| |
| static std::shared_ptr<TSFetchResultsResp> getTSFetchResultsResp(TSStatusCode::TSStatusCode tsStatusCode); |
| |
| static std::shared_ptr<TSFetchResultsResp> |
| getTSFetchResultsResp(TSStatusCode::TSStatusCode tsStatusCode, const std::string& appendMessage); |
| |
| static std::shared_ptr<TSFetchResultsResp> getTSFetchResultsResp(const TSStatus& status); |
| }; |
| |
| class UrlUtils { |
| private: |
| static const std::string PORT_SEPARATOR; |
| static const std::string ABB_COLON; |
| |
| UrlUtils() = delete; |
| ~UrlUtils() = delete; |
| |
| public: |
| /** |
| * Parse TEndPoint from a given TEndPointUrl |
| * example:[D80:0000:0000:0000:ABAA:0000:00C2:0002]:22227 |
| * |
| * @param endPointUrl ip:port |
| * @return TEndPoint with default values if parse error |
| */ |
| static TEndPoint parseTEndPointIpv4AndIpv6Url(const std::string& endPointUrl); |
| }; |
| |
| #endif |