blob: 859a8209a1181d2a5c79acd8e2b7f935f7c1bb86 [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.
*/
#include "Common.h"
#include <cstring>
#include <ctime>
#include <typeinfo>
LogLevelType LOG_LEVEL = LEVEL_WARN;
std::string extractExceptionMessage(const std::exception& exception) {
const char* what = exception.what();
if (what != nullptr) {
std::string message(what);
if (!message.empty() && message != "std::exception") {
return message;
}
}
return std::string("Unhandled exception type: ") + typeid(exception).name();
}
std::string extractExceptionMessage(const std::exception_ptr& exceptionPtr) {
if (exceptionPtr == nullptr) {
return "Unknown exception";
}
try {
std::rethrow_exception(exceptionPtr);
} catch (const std::exception& exception) {
return extractExceptionMessage(exception);
} catch (...) {
return "Unknown non-std exception";
}
}
std::string getTimePrecision(int32_t timeFactor) {
if (timeFactor >= 1000000)
return "us";
if (timeFactor >= 1000)
return "ms";
return "s";
}
std::string formatDatetime(const std::string& format, const std::string& precision,
int64_t timestamp, const std::string& zoneId) {
std::time_t time = static_cast<std::time_t>(timestamp);
std::tm* tm = std::localtime(&time);
char buffer[80];
strftime(buffer, sizeof(buffer), format.c_str(), tm);
return std::string(buffer);
}
std::tm convertToTimestamp(int64_t value, int32_t timeFactor) {
std::time_t time = static_cast<std::time_t>(value / timeFactor);
return *std::localtime(&time);
}
TSDataType::TSDataType getDataTypeByStr(const std::string& typeStr) {
if (typeStr == "BOOLEAN")
return TSDataType::BOOLEAN;
if (typeStr == "INT32")
return TSDataType::INT32;
if (typeStr == "INT64")
return TSDataType::INT64;
if (typeStr == "FLOAT")
return TSDataType::FLOAT;
if (typeStr == "DOUBLE")
return TSDataType::DOUBLE;
if (typeStr == "TEXT")
return TSDataType::TEXT;
if (typeStr == "TIMESTAMP")
return TSDataType::TIMESTAMP;
if (typeStr == "DATE")
return TSDataType::DATE;
if (typeStr == "BLOB")
return TSDataType::BLOB;
if (typeStr == "STRING")
return TSDataType::STRING;
if (typeStr == "OBJECT")
return TSDataType::OBJECT;
return TSDataType::UNKNOWN;
}
std::tm int32ToDate(int32_t value) {
std::time_t time = static_cast<std::time_t>(value) * 86400;
return *std::localtime(&time);
}
MyStringBuffer::MyStringBuffer() : pos(0) {
checkBigEndian();
}
MyStringBuffer::MyStringBuffer(const std::string& str) : str(str), pos(0) {
checkBigEndian();
}
void MyStringBuffer::reserve(size_t n) {
str.reserve(n);
}
void MyStringBuffer::clear() {
str.clear();
pos = 0;
}
bool MyStringBuffer::hasRemaining() {
return pos < str.size();
}
int MyStringBuffer::getInt() {
return *(int*)getOrderedByte(4);
}
IoTDBDate MyStringBuffer::getDate() {
return parseIntToDate(getInt());
}
int64_t MyStringBuffer::getInt64() {
#ifdef ARCH32
const char* buf_addr = getOrderedByte(8);
if (reinterpret_cast<uint32_t>(buf_addr) % 4 == 0) {
return *(int64_t*)buf_addr;
} else {
char tmp_buf[8];
memcpy(tmp_buf, buf_addr, 8);
return *(int64_t*)tmp_buf;
}
#else
return *(int64_t*)getOrderedByte(8);
#endif
}
float MyStringBuffer::getFloat() {
return *(float*)getOrderedByte(4);
}
double MyStringBuffer::getDouble() {
#ifdef ARCH32
const char* buf_addr = getOrderedByte(8);
if (reinterpret_cast<uint32_t>(buf_addr) % 4 == 0) {
return *(double*)buf_addr;
} else {
char tmp_buf[8];
memcpy(tmp_buf, buf_addr, 8);
return *(double*)tmp_buf;
}
#else
return *(double*)getOrderedByte(8);
#endif
}
char MyStringBuffer::getChar() {
if (pos >= str.size()) {
throw IoTDBException("MyStringBuffer::getChar: read past end (pos=" + std::to_string(pos) +
", size=" + std::to_string(str.size()) + ")");
}
return str[pos++];
}
bool MyStringBuffer::getBool() {
return getChar() == 1;
}
std::string MyStringBuffer::getString() {
const int lenInt = getInt();
if (lenInt < 0) {
throw IoTDBException("MyStringBuffer::getString: negative length");
}
const size_t len = static_cast<size_t>(lenInt);
if (pos > str.size() || len > str.size() - pos) {
throw IoTDBException(
"MyStringBuffer::getString: length exceeds buffer (pos=" + std::to_string(pos) +
", len=" + std::to_string(len) + ", size=" + std::to_string(str.size()) + ")");
}
const size_t tmpPos = pos;
pos += len;
return str.substr(tmpPos, len);
}
void MyStringBuffer::putInt(int ins) {
putOrderedByte((char*)&ins, 4);
}
void MyStringBuffer::putDate(IoTDBDate date) {
putInt(parseDateExpressionToInt(date));
}
void MyStringBuffer::putInt64(int64_t ins) {
putOrderedByte((char*)&ins, 8);
}
void MyStringBuffer::putFloat(float ins) {
putOrderedByte((char*)&ins, 4);
}
void MyStringBuffer::putDouble(double ins) {
putOrderedByte((char*)&ins, 8);
}
void MyStringBuffer::putChar(char ins) {
str += ins;
}
void MyStringBuffer::putBool(bool ins) {
char tmp = ins ? 1 : 0;
str += tmp;
}
void MyStringBuffer::putString(const std::string& ins) {
putInt((int)(ins.size()));
str += ins;
}
void MyStringBuffer::concat(const std::string& ins) {
str.append(ins);
}
void MyStringBuffer::checkBigEndian() {
static int chk = 0x0201;
isBigEndian = (0x01 != *(char*)(&chk));
}
const char* MyStringBuffer::getOrderedByte(size_t len) {
if (pos > str.size() || len > str.size() - pos) {
throw IoTDBException(
"MyStringBuffer::getOrderedByte: read past end (pos=" + std::to_string(pos) +
", len=" + std::to_string(len) + ", size=" + std::to_string(str.size()) + ")");
}
const char* p = nullptr;
if (isBigEndian) {
p = str.c_str() + pos;
} else {
const char* tmp = str.c_str();
for (size_t i = pos; i < pos + len; i++) {
numericBuf[pos + len - 1 - i] = tmp[i];
}
p = numericBuf;
}
pos += len;
return p;
}
void MyStringBuffer::putOrderedByte(char* buf, int len) {
if (isBigEndian) {
str.append(buf, len);
} else {
for (int i = len - 1; i > -1; i--) {
str += buf[i];
}
}
}
BitMap::BitMap(size_t size) {
resize(size);
}
void BitMap::resize(size_t size) {
this->size = size;
this->bits.resize((size >> 3) + 1);
reset();
}
bool BitMap::mark(size_t position) {
if (position >= size)
return false;
bits[position >> 3] |= (char)1 << (position % 8);
return true;
}
bool BitMap::unmark(size_t position) {
if (position >= size)
return false;
bits[position >> 3] &= ~((char)1 << (position % 8));
return true;
}
void BitMap::markAll() {
std::fill(bits.begin(), bits.end(), (char)0XFF);
}
void BitMap::reset() {
std::fill(bits.begin(), bits.end(), (char)0);
}
bool BitMap::isMarked(size_t position) const {
if (position >= size)
return false;
return (bits[position >> 3] & ((char)1 << (position % 8))) != 0;
}
bool BitMap::isAllUnmarked() const {
size_t j;
for (j = 0; j < size >> 3; j++) {
if (bits[j] != (char)0) {
return false;
}
}
for (j = 0; j < size % 8; j++) {
if ((bits[size >> 3] & ((char)1 << j)) != 0) {
return false;
}
}
return true;
}
bool BitMap::isAllMarked() const {
size_t j;
for (j = 0; j < size >> 3; j++) {
if (bits[j] != (char)0XFF) {
return false;
}
}
for (j = 0; j < size % 8; j++) {
if ((bits[size >> 3] & ((char)1 << j)) == 0) {
return false;
}
}
return true;
}
const std::vector<char>& BitMap::getByteArray() const {
return this->bits;
}
size_t BitMap::getSize() const {
return this->size;
}