commit
fb6fa6adc5
|
@ -13,8 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TDENGINE_OS_H
|
#ifndef _TD_OS_H_
|
||||||
#define TDENGINE_OS_H
|
#define _TD_OS_H_
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -82,4 +82,4 @@ void osInit();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /*_TD_OS_H_*/
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
#ifndef _TD_OS_FILE_H_
|
#ifndef _TD_OS_FILE_H_
|
||||||
#define _TD_OS_FILE_H_
|
#define _TD_OS_FILE_H_
|
||||||
|
|
||||||
|
#include "osSocket.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "osSocket.h"
|
|
||||||
|
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define open OPEN_FUNC_TAOS_FORBID
|
#define open OPEN_FUNC_TAOS_FORBID
|
||||||
#define fopen FOPEN_FUNC_TAOS_FORBID
|
#define fopen FOPEN_FUNC_TAOS_FORBID
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define tfree(x) \
|
#define tfree(x) \
|
||||||
do { \
|
do { \
|
||||||
if (x) { \
|
if (x) { \
|
||||||
free((void *)(x)); \
|
free((void *)(x)); \
|
||||||
(x) = 0; \
|
(x) = 0; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
#ifndef _TD_OS_SEMPHONE_H_
|
#ifndef _TD_OS_SEMPHONE_H_
|
||||||
#define _TD_OS_SEMPHONE_H_
|
#define _TD_OS_SEMPHONE_H_
|
||||||
|
|
||||||
|
#include <semaphore.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <semaphore.h>
|
|
||||||
|
|
||||||
#if defined (_TD_DARWIN_64)
|
#if defined (_TD_DARWIN_64)
|
||||||
typedef struct tsem_s *tsem_t;
|
typedef struct tsem_s *tsem_t;
|
||||||
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
||||||
|
|
|
@ -16,10 +16,6 @@
|
||||||
#ifndef _TD_OS_SOCKET_H_
|
#ifndef _TD_OS_SOCKET_H_
|
||||||
#define _TD_OS_SOCKET_H_
|
#define _TD_OS_SOCKET_H_
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
#include "winsock2.h"
|
#include "winsock2.h"
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
|
@ -30,6 +26,10 @@ extern "C" {
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TAOS_EPOLL_WAIT_TIME 500
|
#define TAOS_EPOLL_WAIT_TIME 500
|
||||||
typedef int32_t SOCKET;
|
typedef int32_t SOCKET;
|
||||||
typedef SOCKET EpollFd;
|
typedef SOCKET EpollFd;
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
#ifndef _TD_OS_SYSINFO_H_
|
#ifndef _TD_OS_SYSINFO_H_
|
||||||
#define _TD_OS_SYSINFO_H_
|
#define _TD_OS_SYSINFO_H_
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t total;
|
int64_t total;
|
||||||
int64_t used;
|
int64_t used;
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
#ifndef _TD_OS_THREAD_H_
|
#ifndef _TD_OS_THREAD_H_
|
||||||
#define _TD_OS_THREAD_H_
|
#define _TD_OS_THREAD_H_
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "tdataformat.h"
|
#include "tdataformat.h"
|
||||||
#include "tcoding.h"
|
#include "tcoding.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
|
||||||
static void dataColSetNEleNull(SDataCol *pCol, int nEle);
|
static void dataColSetNEleNull(SDataCol *pCol, int nEle);
|
||||||
|
@ -25,7 +25,7 @@ static void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, i
|
||||||
#endif
|
#endif
|
||||||
int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
||||||
int spaceNeeded = pCol->bytes * maxPoints;
|
int spaceNeeded = pCol->bytes * maxPoints;
|
||||||
if(IS_VAR_DATA_TYPE(pCol->type)) {
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
spaceNeeded += sizeof(VarDataOffsetT) * maxPoints;
|
spaceNeeded += sizeof(VarDataOffsetT) * maxPoints;
|
||||||
}
|
}
|
||||||
#ifdef TD_SUPPORT_BITMAP
|
#ifdef TD_SUPPORT_BITMAP
|
||||||
|
@ -36,11 +36,10 @@ int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
||||||
spaceNeeded += TYPE_BYTES[pCol->type];
|
spaceNeeded += TYPE_BYTES[pCol->type];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(pCol->spaceSize < spaceNeeded) {
|
if (pCol->spaceSize < spaceNeeded) {
|
||||||
void* ptr = realloc(pCol->pData, spaceNeeded);
|
void *ptr = realloc(pCol->pData, spaceNeeded);
|
||||||
if(ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
uDebug("malloc failure, size:%" PRId64 " failed, reason:%s", (int64_t)spaceNeeded,
|
uDebug("malloc failure, size:%" PRId64 " failed, reason:%s", (int64_t)spaceNeeded, strerror(errno));
|
||||||
strerror(errno));
|
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
pCol->pData = ptr;
|
pCol->pData = ptr;
|
||||||
|
@ -66,8 +65,7 @@ int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
||||||
* Duplicate the schema and return a new object
|
* Duplicate the schema and return a new object
|
||||||
*/
|
*/
|
||||||
STSchema *tdDupSchema(const STSchema *pSchema) {
|
STSchema *tdDupSchema(const STSchema *pSchema) {
|
||||||
|
int tlen = sizeof(STSchema) + sizeof(STColumn) * schemaNCols(pSchema);
|
||||||
int tlen = sizeof(STSchema) + sizeof(STColumn) * schemaNCols(pSchema);
|
|
||||||
STSchema *tSchema = (STSchema *)malloc(tlen);
|
STSchema *tSchema = (STSchema *)malloc(tlen);
|
||||||
if (tSchema == NULL) return NULL;
|
if (tSchema == NULL) return NULL;
|
||||||
|
|
||||||
|
@ -98,8 +96,8 @@ int tdEncodeSchema(void **buf, STSchema *pSchema) {
|
||||||
* Decode a schema from a binary.
|
* Decode a schema from a binary.
|
||||||
*/
|
*/
|
||||||
void *tdDecodeSchema(void *buf, STSchema **pRSchema) {
|
void *tdDecodeSchema(void *buf, STSchema **pRSchema) {
|
||||||
int version = 0;
|
int version = 0;
|
||||||
int numOfCols = 0;
|
int numOfCols = 0;
|
||||||
STSchemaBuilder schemaBuilder;
|
STSchemaBuilder schemaBuilder;
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &version);
|
buf = taosDecodeFixedI32(buf, &version);
|
||||||
|
@ -155,7 +153,7 @@ int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int16_t colId, int1
|
||||||
|
|
||||||
if (pBuilder->nCols >= pBuilder->tCols) {
|
if (pBuilder->nCols >= pBuilder->tCols) {
|
||||||
pBuilder->tCols *= 2;
|
pBuilder->tCols *= 2;
|
||||||
STColumn* columns = (STColumn *)realloc(pBuilder->columns, sizeof(STColumn) * pBuilder->tCols);
|
STColumn *columns = (STColumn *)realloc(pBuilder->columns, sizeof(STColumn) * pBuilder->tCols);
|
||||||
if (columns == NULL) return -1;
|
if (columns == NULL) return -1;
|
||||||
pBuilder->columns = columns;
|
pBuilder->columns = columns;
|
||||||
}
|
}
|
||||||
|
@ -166,7 +164,7 @@ int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int16_t colId, int1
|
||||||
if (pBuilder->nCols == 0) {
|
if (pBuilder->nCols == 0) {
|
||||||
colSetOffset(pCol, 0);
|
colSetOffset(pCol, 0);
|
||||||
} else {
|
} else {
|
||||||
STColumn *pTCol = &(pBuilder->columns[pBuilder->nCols-1]);
|
STColumn *pTCol = &(pBuilder->columns[pBuilder->nCols - 1]);
|
||||||
colSetOffset(pCol, pTCol->offset + TYPE_BYTES[pTCol->type]);
|
colSetOffset(pCol, pTCol->offset + TYPE_BYTES[pTCol->type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +256,7 @@ void dataColInit(SDataCol *pDataCol, STColumn *pCol, int maxPoints) {
|
||||||
pDataCol->type = colType(pCol);
|
pDataCol->type = colType(pCol);
|
||||||
pDataCol->colId = colColId(pCol);
|
pDataCol->colId = colColId(pCol);
|
||||||
pDataCol->bytes = colBytes(pCol);
|
pDataCol->bytes = colBytes(pCol);
|
||||||
pDataCol->offset = colOffset(pCol) + 0; //TD_DATA_ROW_HEAD_SIZE;
|
pDataCol->offset = colOffset(pCol) + 0; // TD_DATA_ROW_HEAD_SIZE;
|
||||||
|
|
||||||
pDataCol->len = 0;
|
pDataCol->len = 0;
|
||||||
}
|
}
|
||||||
|
@ -272,7 +270,7 @@ int dataColAppendVal(SDataCol *pCol, const void *value, int numOfRows, int maxPo
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tdAllocMemForCol(pCol, maxPoints) < 0) return -1;
|
if (tdAllocMemForCol(pCol, maxPoints) < 0) return -1;
|
||||||
if (numOfRows > 0) {
|
if (numOfRows > 0) {
|
||||||
// Find the first not null value, fill all previouse values as NULL
|
// Find the first not null value, fill all previouse values as NULL
|
||||||
dataColSetNEleNull(pCol, numOfRows);
|
dataColSetNEleNull(pCol, numOfRows);
|
||||||
|
@ -303,7 +301,7 @@ static FORCE_INLINE const void *tdGetColDataOfRowUnsafe(SDataCol *pCol, int row)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isNEleNull(SDataCol *pCol, int nEle) {
|
bool isNEleNull(SDataCol *pCol, int nEle) {
|
||||||
if(isAllRowsNull(pCol)) return true;
|
if (isAllRowsNull(pCol)) return true;
|
||||||
for (int i = 0; i < nEle; i++) {
|
for (int i = 0; i < nEle; i++) {
|
||||||
if (!isNull(tdGetColDataOfRowUnsafe(pCol, i), pCol->type)) return false;
|
if (!isNull(tdGetColDataOfRowUnsafe(pCol, i), pCol->type)) return false;
|
||||||
}
|
}
|
||||||
|
@ -370,7 +368,7 @@ SDataCols *tdNewDataCols(int maxCols, int maxRows) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < maxCols; i++) {
|
for (i = 0; i < maxCols; i++) {
|
||||||
pCols->cols[i].spaceSize = 0;
|
pCols->cols[i].spaceSize = 0;
|
||||||
pCols->cols[i].len = 0;
|
pCols->cols[i].len = 0;
|
||||||
pCols->cols[i].pData = NULL;
|
pCols->cols[i].pData = NULL;
|
||||||
|
@ -386,10 +384,10 @@ int tdInitDataCols(SDataCols *pCols, STSchema *pSchema) {
|
||||||
int oldMaxCols = pCols->maxCols;
|
int oldMaxCols = pCols->maxCols;
|
||||||
if (schemaNCols(pSchema) > oldMaxCols) {
|
if (schemaNCols(pSchema) > oldMaxCols) {
|
||||||
pCols->maxCols = schemaNCols(pSchema);
|
pCols->maxCols = schemaNCols(pSchema);
|
||||||
void* ptr = (SDataCol *)realloc(pCols->cols, sizeof(SDataCol) * pCols->maxCols);
|
void *ptr = (SDataCol *)realloc(pCols->cols, sizeof(SDataCol) * pCols->maxCols);
|
||||||
if (ptr == NULL) return -1;
|
if (ptr == NULL) return -1;
|
||||||
pCols->cols = ptr;
|
pCols->cols = ptr;
|
||||||
for(i = oldMaxCols; i < pCols->maxCols; i++) {
|
for (i = oldMaxCols; i < pCols->maxCols; i++) {
|
||||||
pCols->cols[i].pData = NULL;
|
pCols->cols[i].pData = NULL;
|
||||||
pCols->cols[i].dataOff = NULL;
|
pCols->cols[i].dataOff = NULL;
|
||||||
pCols->cols[i].spaceSize = 0;
|
pCols->cols[i].spaceSize = 0;
|
||||||
|
@ -402,16 +400,16 @@ int tdInitDataCols(SDataCols *pCols, STSchema *pSchema) {
|
||||||
for (i = 0; i < schemaNCols(pSchema); i++) {
|
for (i = 0; i < schemaNCols(pSchema); i++) {
|
||||||
dataColInit(pCols->cols + i, schemaColAt(pSchema, i), pCols->maxPoints);
|
dataColInit(pCols->cols + i, schemaColAt(pSchema, i), pCols->maxPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataCols *tdFreeDataCols(SDataCols *pCols) {
|
SDataCols *tdFreeDataCols(SDataCols *pCols) {
|
||||||
int i;
|
int i;
|
||||||
if (pCols) {
|
if (pCols) {
|
||||||
if(pCols->cols) {
|
if (pCols->cols) {
|
||||||
int maxCols = pCols->maxCols;
|
int maxCols = pCols->maxCols;
|
||||||
for(i = 0; i < maxCols; i++) {
|
for (i = 0; i < maxCols; i++) {
|
||||||
SDataCol *pCol = &pCols->cols[i];
|
SDataCol *pCol = &pCols->cols[i];
|
||||||
tfree(pCol->pData);
|
tfree(pCol->pData);
|
||||||
}
|
}
|
||||||
|
@ -439,7 +437,7 @@ SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
|
|
||||||
if (keepData) {
|
if (keepData) {
|
||||||
if (pDataCols->cols[i].len > 0) {
|
if (pDataCols->cols[i].len > 0) {
|
||||||
if(tdAllocMemForCol(&pRet->cols[i], pRet->maxPoints) < 0) {
|
if (tdAllocMemForCol(&pRet->cols[i], pRet->maxPoints) < 0) {
|
||||||
tdFreeDataCols(pRet);
|
tdFreeDataCols(pRet);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -647,9 +645,9 @@ SKVRow tdKVRowDup(SKVRow row) {
|
||||||
return trow;
|
return trow;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int compareColIdx(const void* a, const void* b) {
|
static int compareColIdx(const void *a, const void *b) {
|
||||||
const SColIdx* x = (const SColIdx*)a;
|
const SColIdx *x = (const SColIdx *)a;
|
||||||
const SColIdx* y = (const SColIdx*)b;
|
const SColIdx *y = (const SColIdx *)b;
|
||||||
if (x->colId > y->colId) {
|
if (x->colId > y->colId) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -659,15 +657,13 @@ static int compareColIdx(const void* a, const void* b) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdSortKVRowByColIdx(SKVRow row) {
|
void tdSortKVRowByColIdx(SKVRow row) { qsort(kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), compareColIdx); }
|
||||||
qsort(kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), compareColIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value) {
|
int tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value) {
|
||||||
SColIdx *pColIdx = NULL;
|
SColIdx *pColIdx = NULL;
|
||||||
SKVRow row = *orow;
|
SKVRow row = *orow;
|
||||||
SKVRow nrow = NULL;
|
SKVRow nrow = NULL;
|
||||||
void * ptr = taosbsearch(&colId, kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), comparTagId, TD_GE);
|
void *ptr = taosbsearch(&colId, kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), comparTagId, TD_GE);
|
||||||
|
|
||||||
if (ptr == NULL || ((SColIdx *)ptr)->colId > colId) { // need to add a column value to the row
|
if (ptr == NULL || ((SColIdx *)ptr)->colId > colId) { // need to add a column value to the row
|
||||||
int diff = IS_VAR_DATA_TYPE(type) ? varDataTLen(value) : TYPE_BYTES[type];
|
int diff = IS_VAR_DATA_TYPE(type) ? varDataTLen(value) : TYPE_BYTES[type];
|
||||||
|
@ -699,7 +695,7 @@ int tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value) {
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
void *pOldVal = kvRowColVal(row, (SColIdx *)ptr);
|
void *pOldVal = kvRowColVal(row, (SColIdx *)ptr);
|
||||||
|
|
||||||
if (varDataTLen(value) == varDataTLen(pOldVal)) { // just update the column value in place
|
if (varDataTLen(value) == varDataTLen(pOldVal)) { // just update the column value in place
|
||||||
memcpy(pOldVal, value, varDataTLen(value));
|
memcpy(pOldVal, value, varDataTLen(value));
|
||||||
} else { // need to reallocate the memory
|
} else { // need to reallocate the memory
|
||||||
int16_t nlen = kvRowLen(row) + (varDataTLen(value) - varDataTLen(pOldVal));
|
int16_t nlen = kvRowLen(row) + (varDataTLen(value) - varDataTLen(pOldVal));
|
||||||
|
|
|
@ -43,50 +43,46 @@
|
||||||
* An encoding of midnight at the end of the day as 24:00:00 - ie. midnight
|
* An encoding of midnight at the end of the day as 24:00:00 - ie. midnight
|
||||||
* tomorrow - (allowable under ISO 8601) is supported.
|
* tomorrow - (allowable under ISO 8601) is supported.
|
||||||
*/
|
*/
|
||||||
static int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
|
static int64_t user_mktime64(const uint32_t year0, const uint32_t mon0, const uint32_t day, const uint32_t hour,
|
||||||
const unsigned int day, const unsigned int hour,
|
const uint32_t min, const uint32_t sec, int64_t time_zone) {
|
||||||
const unsigned int min, const unsigned int sec, int64_t time_zone)
|
uint32_t mon = mon0, year = year0;
|
||||||
{
|
|
||||||
unsigned int mon = mon0, year = year0;
|
|
||||||
|
|
||||||
/* 1..12 -> 11,12,1..10 */
|
/* 1..12 -> 11,12,1..10 */
|
||||||
if (0 >= (int) (mon -= 2)) {
|
if (0 >= (int32_t)(mon -= 2)) {
|
||||||
mon += 12; /* Puts Feb last since it has leap day */
|
mon += 12; /* Puts Feb last since it has leap day */
|
||||||
year -= 1;
|
year -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//int64_t res = (((((int64_t) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
|
// int64_t res = (((((int64_t) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
|
||||||
// year*365 - 719499)*24 + hour)*60 + min)*60 + sec);
|
// year*365 - 719499)*24 + hour)*60 + min)*60 + sec);
|
||||||
int64_t res;
|
int64_t res;
|
||||||
res = 367*((int64_t)mon)/12;
|
res = 367 * ((int64_t)mon) / 12;
|
||||||
res += year/4 - year/100 + year/400 + day + ((int64_t)year)*365 - 719499;
|
res += year / 4 - year / 100 + year / 400 + day + ((int64_t)year) * 365 - 719499;
|
||||||
res = res*24;
|
res = res * 24;
|
||||||
res = ((res + hour) * 60 + min) * 60 + sec;
|
res = ((res + hour) * 60 + min) * 60 + sec;
|
||||||
|
|
||||||
return (res + time_zone);
|
return (res + time_zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==== mktime() kernel code =================//
|
// ==== mktime() kernel code =================//
|
||||||
static int64_t m_deltaUtc = 0;
|
static int64_t m_deltaUtc = 0;
|
||||||
void deltaToUtcInitOnce() {
|
void deltaToUtcInitOnce() {
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
|
|
||||||
(void)strptime("1970-01-01 00:00:00", (const char *)("%Y-%m-%d %H:%M:%S"), &tm);
|
(void)strptime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm);
|
||||||
m_deltaUtc = (int64_t)mktime(&tm);
|
m_deltaUtc = (int64_t)mktime(&tm);
|
||||||
//printf("====delta:%lld\n\n", seconds);
|
// printf("====delta:%lld\n\n", seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t parseFraction(char* str, char** end, int32_t timePrec);
|
static int64_t parseFraction(char* str, char** end, int32_t timePrec);
|
||||||
static int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim);
|
static int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim);
|
||||||
static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec);
|
static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec);
|
||||||
static int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec);
|
static int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec);
|
||||||
static char* forwardToTimeStringEnd(char* str);
|
static char* forwardToTimeStringEnd(char* str);
|
||||||
static bool checkTzPresent(const char *str, int32_t len);
|
static bool checkTzPresent(const char* str, int32_t len);
|
||||||
|
|
||||||
static int32_t (*parseLocaltimeFp[]) (char* timestr, int64_t* time, int32_t timePrec) = {
|
static int32_t (*parseLocaltimeFp[])(char* timestr, int64_t* time, int32_t timePrec) = {parseLocaltime,
|
||||||
parseLocaltime,
|
parseLocaltimeDst};
|
||||||
parseLocaltimeDst
|
|
||||||
};
|
|
||||||
|
|
||||||
int32_t taosParseTime(const char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t day_light) {
|
int32_t taosParseTime(const char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t day_light) {
|
||||||
/* parse datatime string in with tz */
|
/* parse datatime string in with tz */
|
||||||
|
@ -103,9 +99,9 @@ bool checkTzPresent(const char* str, int32_t len) {
|
||||||
char* seg = forwardToTimeStringEnd((char*)str);
|
char* seg = forwardToTimeStringEnd((char*)str);
|
||||||
int32_t seg_len = len - (int32_t)(seg - str);
|
int32_t seg_len = len - (int32_t)(seg - str);
|
||||||
|
|
||||||
char *c = &seg[seg_len - 1];
|
char* c = &seg[seg_len - 1];
|
||||||
for (int i = 0; i < seg_len; ++i) {
|
for (int32_t i = 0; i < seg_len; ++i) {
|
||||||
if (*c == 'Z' || *c == 'z' || *c == '+' || *c == '-') {
|
if (*c == 'Z' || *c == 'z' || *c == '+' || *c == '-') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
c--;
|
c--;
|
||||||
|
@ -199,13 +195,12 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) {
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//return error if there're illegal charaters after min(2 Digits)
|
// return error if there're illegal charaters after min(2 Digits)
|
||||||
char *minStr = &str[i];
|
char* minStr = &str[i];
|
||||||
if (minStr[1] != '\0' && minStr[2] != '\0') {
|
if (minStr[1] != '\0' && minStr[2] != '\0') {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int64_t minute = strnatoi(&str[i], 2);
|
int64_t minute = strnatoi(&str[i], 2);
|
||||||
if (minute > 59) {
|
if (minute > 59) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -233,9 +228,8 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) {
|
||||||
* 2013-04-12T15:52:01.123+0800
|
* 2013-04-12T15:52:01.123+0800
|
||||||
*/
|
*/
|
||||||
int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim) {
|
int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim) {
|
||||||
|
int64_t factor =
|
||||||
int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
|
(timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 : (timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
||||||
(timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
|
||||||
int64_t tzOffset = 0;
|
int64_t tzOffset = 0;
|
||||||
|
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
|
@ -255,8 +249,8 @@ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, ch
|
||||||
|
|
||||||
/* mktime will be affected by TZ, set by using taos_options */
|
/* mktime will be affected by TZ, set by using taos_options */
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 0);
|
int64_t seconds = user_mktime64(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 0);
|
||||||
//int64_t seconds = gmtime(&tm);
|
// int64_t seconds = gmtime(&tm);
|
||||||
#else
|
#else
|
||||||
int64_t seconds = timegm(&tm);
|
int64_t seconds = timegm(&tm);
|
||||||
#endif
|
#endif
|
||||||
|
@ -320,8 +314,9 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int64_t seconds = user_mktime64(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, timezone);
|
int64_t seconds =
|
||||||
|
user_mktime64(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, timezone);
|
||||||
|
|
||||||
int64_t fraction = 0;
|
int64_t fraction = 0;
|
||||||
|
|
||||||
if (*str == '.') {
|
if (*str == '.') {
|
||||||
|
@ -331,8 +326,8 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
|
int64_t factor =
|
||||||
(timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
(timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 : (timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
||||||
*time = factor * seconds + fraction;
|
*time = factor * seconds + fraction;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -350,7 +345,7 @@ int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
|
|
||||||
/* mktime will be affected by TZ, set by using taos_options */
|
/* mktime will be affected by TZ, set by using taos_options */
|
||||||
int64_t seconds = mktime(&tm);
|
int64_t seconds = mktime(&tm);
|
||||||
|
|
||||||
int64_t fraction = 0;
|
int64_t fraction = 0;
|
||||||
|
|
||||||
if (*str == '.') {
|
if (*str == '.') {
|
||||||
|
@ -360,27 +355,22 @@ int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t factor = (timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 :
|
int64_t factor =
|
||||||
(timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
(timePrec == TSDB_TIME_PRECISION_MILLI) ? 1000 : (timePrec == TSDB_TIME_PRECISION_MICRO ? 1000000 : 1000000000);
|
||||||
*time = factor * seconds + fraction;
|
*time = factor * seconds + fraction;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision) {
|
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision) {
|
||||||
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI ||
|
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI || fromPrecision == TSDB_TIME_PRECISION_MICRO ||
|
||||||
fromPrecision == TSDB_TIME_PRECISION_MICRO ||
|
|
||||||
fromPrecision == TSDB_TIME_PRECISION_NANO);
|
fromPrecision == TSDB_TIME_PRECISION_NANO);
|
||||||
assert(toPrecision == TSDB_TIME_PRECISION_MILLI ||
|
assert(toPrecision == TSDB_TIME_PRECISION_MILLI || toPrecision == TSDB_TIME_PRECISION_MICRO ||
|
||||||
toPrecision == TSDB_TIME_PRECISION_MICRO ||
|
|
||||||
toPrecision == TSDB_TIME_PRECISION_NANO);
|
toPrecision == TSDB_TIME_PRECISION_NANO);
|
||||||
static double factors[3][3] = { {1., 1000., 1000000.},
|
static double factors[3][3] = {{1., 1000., 1000000.}, {1.0 / 1000, 1., 1000.}, {1.0 / 1000000, 1.0 / 1000, 1.}};
|
||||||
{1.0 / 1000, 1., 1000.},
|
|
||||||
{1.0 / 1000000, 1.0 / 1000, 1.} };
|
|
||||||
return (int64_t)((double)time * factors[fromPrecision][toPrecision]);
|
return (int64_t)((double)time * factors[fromPrecision][toPrecision]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) {
|
static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) {
|
||||||
|
|
||||||
switch (unit) {
|
switch (unit) {
|
||||||
case 's':
|
case 's':
|
||||||
(*result) = convertTimePrecision(val * MILLISECOND_PER_SECOND, TSDB_TIME_PRECISION_MILLI, timePrecision);
|
(*result) = convertTimePrecision(val * MILLISECOND_PER_SECOND, TSDB_TIME_PRECISION_MILLI, timePrecision);
|
||||||
|
@ -427,7 +417,8 @@ static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t time
|
||||||
* d - Days (24 hours)
|
* d - Days (24 hours)
|
||||||
* w - Weeks (7 days)
|
* w - Weeks (7 days)
|
||||||
*/
|
*/
|
||||||
int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* duration, char* unit, int32_t timePrecision) {
|
int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* duration, char* unit,
|
||||||
|
int32_t timePrecision) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
char* endPtr = NULL;
|
char* endPtr = NULL;
|
||||||
|
|
||||||
|
@ -474,9 +465,9 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
|
||||||
localtime_r(&tt, &tm);
|
localtime_r(&tt, &tm);
|
||||||
int mon = tm.tm_year * 12 + tm.tm_mon + (int)duration;
|
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)duration;
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
|
|
||||||
|
@ -497,13 +488,13 @@ int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char
|
||||||
ekey /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
ekey /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t t = (time_t)skey;
|
time_t t = (time_t)skey;
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
int smon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
t = (time_t)ekey;
|
t = (time_t)ekey;
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
int emon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
|
|
||||||
if (unit == 'y') {
|
if (unit == 'y') {
|
||||||
interval *= 12;
|
interval *= 12;
|
||||||
|
@ -522,7 +513,7 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
if (pInterval->slidingUnit == 'n' || pInterval->slidingUnit == 'y') {
|
if (pInterval->slidingUnit == 'n' || pInterval->slidingUnit == 'y') {
|
||||||
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)start;
|
time_t tt = (time_t)start;
|
||||||
localtime_r(&tt, &tm);
|
localtime_r(&tt, &tm);
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
|
@ -531,10 +522,10 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
|
|
||||||
if (pInterval->slidingUnit == 'y') {
|
if (pInterval->slidingUnit == 'y') {
|
||||||
tm.tm_mon = 0;
|
tm.tm_mon = 0;
|
||||||
tm.tm_year = (int)(tm.tm_year / pInterval->sliding * pInterval->sliding);
|
tm.tm_year = (int32_t)(tm.tm_year / pInterval->sliding * pInterval->sliding);
|
||||||
} else {
|
} else {
|
||||||
int mon = tm.tm_year * 12 + tm.tm_mon;
|
int32_t mon = tm.tm_year * 12 + tm.tm_mon;
|
||||||
mon = (int)(mon / pInterval->sliding * pInterval->sliding);
|
mon = (int32_t)(mon / pInterval->sliding * pInterval->sliding);
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
}
|
}
|
||||||
|
@ -547,17 +538,17 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
start = (delta / pInterval->sliding + factor) * pInterval->sliding;
|
start = (delta / pInterval->sliding + factor) * pInterval->sliding;
|
||||||
|
|
||||||
if (pInterval->intervalUnit == 'd' || pInterval->intervalUnit == 'w') {
|
if (pInterval->intervalUnit == 'd' || pInterval->intervalUnit == 'w') {
|
||||||
/*
|
/*
|
||||||
* here we revised the start time of day according to the local time zone,
|
* here we revised the start time of day according to the local time zone,
|
||||||
* but in case of DST, the start time of one day need to be dynamically decided.
|
* but in case of DST, the start time of one day need to be dynamically decided.
|
||||||
*/
|
*/
|
||||||
// todo refactor to extract function that is available for Linux/Windows/Mac platform
|
// todo refactor to extract function that is available for Linux/Windows/Mac platform
|
||||||
#if defined(WINDOWS) && _MSC_VER >= 1900
|
#if defined(WINDOWS) && _MSC_VER >= 1900
|
||||||
// see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
|
// see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
|
||||||
int64_t timezone = _timezone;
|
int64_t timezone = _timezone;
|
||||||
int32_t daylight = _daylight;
|
int32_t daylight = _daylight;
|
||||||
char** tzname = _tzname;
|
char** tzname = _tzname;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
start += (int64_t)(timezone * TSDB_TICK_PER_SECOND(precision));
|
start += (int64_t)(timezone * TSDB_TICK_PER_SECOND(precision));
|
||||||
}
|
}
|
||||||
|
@ -568,7 +559,7 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
||||||
end = start + pInterval->interval - 1;
|
end = start + pInterval->interval - 1;
|
||||||
|
|
||||||
while(end < t && ((start + pInterval->sliding) <= INT64_MAX)) { // move forward to the correct time window
|
while (end < t && ((start + pInterval->sliding) <= INT64_MAX)) { // move forward to the correct time window
|
||||||
start += pInterval->sliding;
|
start += pInterval->sliding;
|
||||||
|
|
||||||
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
||||||
|
@ -601,8 +592,8 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
// and the parameter can also be a variable.
|
// and the parameter can also be a variable.
|
||||||
const char* fmtts(int64_t ts) {
|
const char* fmtts(int64_t ts) {
|
||||||
static char buf[96];
|
static char buf[96];
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
if (ts > -62135625943 && ts < 32503651200) {
|
if (ts > -62135625943 && ts < 32503651200) {
|
||||||
time_t t = (time_t)ts;
|
time_t t = (time_t)ts;
|
||||||
|
@ -619,7 +610,7 @@ const char* fmtts(int64_t ts) {
|
||||||
buf[pos++] = ' ';
|
buf[pos++] = ' ';
|
||||||
}
|
}
|
||||||
pos += strftime(buf + pos, sizeof(buf), "ms=%Y-%m-%d %H:%M:%S", &tm);
|
pos += strftime(buf + pos, sizeof(buf), "ms=%Y-%m-%d %H:%M:%S", &tm);
|
||||||
pos += sprintf(buf + pos, ".%03d", (int)(ts % 1000));
|
pos += sprintf(buf + pos, ".%03d", (int32_t)(ts % 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -631,7 +622,7 @@ const char* fmtts(int64_t ts) {
|
||||||
buf[pos++] = ' ';
|
buf[pos++] = ' ';
|
||||||
}
|
}
|
||||||
pos += strftime(buf + pos, sizeof(buf), "us=%Y-%m-%d %H:%M:%S", &tm);
|
pos += strftime(buf + pos, sizeof(buf), "us=%Y-%m-%d %H:%M:%S", &tm);
|
||||||
pos += sprintf(buf + pos, ".%06d", (int)(ts % 1000000));
|
pos += sprintf(buf + pos, ".%06d", (int32_t)(ts % 1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue