Merge branch 'develop' into feature/2.0tsdb
This commit is contained in:
commit
82a4fafda5
|
@ -115,6 +115,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QUERY_ID, 0, 255, "invalid query i
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_STREAM_ID, 0, 256, "invalid stream id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_STREAM_ID, 0, 256, "invalid stream id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONNECTION, 0, 257, "invalid connection")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONNECTION, 0, 257, "invalid connection")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_SDB_ERROR, 0, 258, "sdb error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_SDB_ERROR, 0, 258, "sdb error")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_TIMESTAMP_OUT_OF_RANGE, 0, 259, "timestamp is out of range")
|
||||||
|
|
||||||
// acct
|
// acct
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ACCT_ALREADY_EXIST, 0, 300, "accounts already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ACCT_ALREADY_EXIST, 0, 300, "accounts already exist")
|
||||||
|
|
|
@ -227,13 +227,13 @@ typedef struct {
|
||||||
int maxFGroups;
|
int maxFGroups;
|
||||||
int numOfFGroups;
|
int numOfFGroups;
|
||||||
|
|
||||||
SFileGroup fGroup[];
|
SFileGroup *fGroup;
|
||||||
} STsdbFileH;
|
} STsdbFileH;
|
||||||
|
|
||||||
#define TSDB_MIN_FILE_ID(fh) (fh)->fGroup[0].fileId
|
#define TSDB_MIN_FILE_ID(fh) (fh)->fGroup[0].fileId
|
||||||
#define TSDB_MAX_FILE_ID(fh) (fh)->fGroup[(fh)->numOfFGroups - 1].fileId
|
#define TSDB_MAX_FILE_ID(fh) (fh)->fGroup[(fh)->numOfFGroups - 1].fileId
|
||||||
|
|
||||||
STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles);
|
STsdbFileH *tsdbInitFileH(char *dataDir, STsdbCfg *pCfg);
|
||||||
void tsdbCloseFileH(STsdbFileH *pFileH);
|
void tsdbCloseFileH(STsdbFileH *pFileH);
|
||||||
int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader,
|
int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader,
|
||||||
int toClose);
|
int toClose);
|
||||||
|
@ -486,6 +486,9 @@ int tsdbMoveLastBlockIfNeccessary(SRWHelper *pHelper);
|
||||||
int tsdbWriteCompInfo(SRWHelper *pHelper);
|
int tsdbWriteCompInfo(SRWHelper *pHelper);
|
||||||
int tsdbWriteCompIdx(SRWHelper *pHelper);
|
int tsdbWriteCompIdx(SRWHelper *pHelper);
|
||||||
|
|
||||||
|
// --------- Other functions need to further organize
|
||||||
|
void tsdbFitRetention(STsdbRepo *pRepo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
const char *tsdbFileSuffix[] = {
|
const char *tsdbFileSuffix[] = {
|
||||||
".head", // TSDB_FILE_TYPE_HEAD
|
".head", // TSDB_FILE_TYPE_HEAD
|
||||||
|
@ -40,13 +41,19 @@ static int tsdbWriteFileHead(SFile *pFile);
|
||||||
static int tsdbWriteHeadFileIdx(SFile *pFile, int maxTables);
|
static int tsdbWriteHeadFileIdx(SFile *pFile, int maxTables);
|
||||||
static int tsdbOpenFGroup(STsdbFileH *pFileH, char *dataDir, int fid);
|
static int tsdbOpenFGroup(STsdbFileH *pFileH, char *dataDir, int fid);
|
||||||
|
|
||||||
STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles) {
|
STsdbFileH *tsdbInitFileH(char *dataDir, STsdbCfg *pCfg) {
|
||||||
STsdbFileH *pFileH = (STsdbFileH *)calloc(1, sizeof(STsdbFileH) + sizeof(SFileGroup) * maxFiles);
|
STsdbFileH *pFileH = (STsdbFileH *)calloc(1, sizeof(STsdbFileH));
|
||||||
if (pFileH == NULL) { // TODO: deal with ERROR here
|
if (pFileH == NULL) { // TODO: deal with ERROR here
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pFileH->maxFGroups = maxFiles;
|
pFileH->maxFGroups = pCfg->keep / pCfg->daysPerFile + 2;
|
||||||
|
|
||||||
|
pFileH->fGroup = (SFileGroup *)calloc(pFileH->maxFGroups, sizeof(SFileGroup));
|
||||||
|
if (pFileH->fGroup == NULL) {
|
||||||
|
free(pFileH);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
DIR *dir = opendir(dataDir);
|
DIR *dir = opendir(dataDir);
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
|
@ -69,7 +76,12 @@ STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles) {
|
||||||
return pFileH;
|
return pFileH;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbCloseFileH(STsdbFileH *pFileH) { free(pFileH); }
|
void tsdbCloseFileH(STsdbFileH *pFileH) {
|
||||||
|
if (pFileH) {
|
||||||
|
tfree(pFileH->fGroup);
|
||||||
|
free(pFileH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int tsdbInitFile(char *dataDir, int fid, const char *suffix, SFile *pFile) {
|
static int tsdbInitFile(char *dataDir, int fid, const char *suffix, SFile *pFile) {
|
||||||
tsdbGetFileName(dataDir, fid, suffix, pFile->fname);
|
tsdbGetFileName(dataDir, fid, suffix, pFile->fname);
|
||||||
|
@ -161,6 +173,18 @@ void tsdbInitFileGroupIter(STsdbFileH *pFileH, SFileGroupIter *pIter, int direct
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tsdbFitRetention(STsdbRepo *pRepo) {
|
||||||
|
STsdbFileH *pFileH = pRepo->tsdbFileH;
|
||||||
|
SFileGroup *pGroup = pFileH->fGroup;
|
||||||
|
|
||||||
|
int mfid =
|
||||||
|
tsdbGetKeyFileId(taosGetTimestamp(pRepo->config.precision), pRepo->config.daysPerFile, pRepo->config.precision);
|
||||||
|
|
||||||
|
while (pGroup[0].fileId < mfid) {
|
||||||
|
tsdbRemoveFileGroup(pFileH, pGroup[0].fileId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tsdbSeekFileGroupIter(SFileGroupIter *pIter, int fid) {
|
void tsdbSeekFileGroupIter(SFileGroupIter *pIter, int fid) {
|
||||||
if (pIter->numOfFGroups == 0) {
|
if (pIter->numOfFGroups == 0) {
|
||||||
assert(pIter->pFileGroup == NULL);
|
assert(pIter->pFileGroup == NULL);
|
||||||
|
@ -252,43 +276,6 @@ int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInf
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// int tsdbLoadCompIdx(SFileGroup *pGroup, void *buf, int maxTables) {
|
|
||||||
// SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
|
||||||
// if (lseek(pFile->fd, TSDB_FILE_HEAD_SIZE, SEEK_SET) < 0) return -1;
|
|
||||||
|
|
||||||
// if (read(pFile->fd, buf, sizeof(SCompIdx) * maxTables) < 0) return -1;
|
|
||||||
// // TODO: need to check the correctness
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int tsdbLoadCompBlocks(SFileGroup *pGroup, SCompIdx *pIdx, void *buf) {
|
|
||||||
// SFile *pFile = &(pGroup->files[TSDB_FILE_TYPE_HEAD]);
|
|
||||||
|
|
||||||
// if (lseek(pFile->fd, pIdx->offset, SEEK_SET) < 0) return -1;
|
|
||||||
|
|
||||||
// if (read(pFile->fd, buf, pIdx->len) < 0) return -1;
|
|
||||||
|
|
||||||
// // TODO: need to check the correctness
|
|
||||||
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int tsdbLoadCompCols(SFile *pFile, SCompBlock *pBlock, void *buf) {
|
|
||||||
// // assert(pBlock->numOfSubBlocks == 0 || pBlock->numOfSubBlocks == 1);
|
|
||||||
|
|
||||||
// if (lseek(pFile->fd, pBlock->offset, SEEK_SET) < 0) return -1;
|
|
||||||
// size_t size = sizeof(SCompData) + sizeof(SCompCol) * pBlock->numOfCols;
|
|
||||||
// if (read(pFile->fd, buf, size) < 0) return -1;
|
|
||||||
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int tsdbLoadColData(SFile *pFile, SCompCol *pCol, int64_t blockBaseOffset, void *buf) {
|
|
||||||
// if (lseek(pFile->fd, blockBaseOffset + pCol->offset, SEEK_SET) < 0) return -1;
|
|
||||||
// if (read(pFile->fd, buf, pCol->len) < 0) return -1;
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
static int compFGroupKey(const void *key, const void *fgroup) {
|
static int compFGroupKey(const void *key, const void *fgroup) {
|
||||||
int fid = *(int *)key;
|
int fid = *(int *)key;
|
||||||
SFileGroup *pFGroup = (SFileGroup *)fgroup;
|
SFileGroup *pFGroup = (SFileGroup *)fgroup;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
#include "tscompression.h"
|
#include "tscompression.h"
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
int tsdbDebugFlag = 135;
|
int tsdbDebugFlag = 135;
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ static int32_t tsdbCheckAndSetDefaultCfg(STsdbCfg *pCfg);
|
||||||
static int32_t tsdbSetRepoEnv(STsdbRepo *pRepo);
|
static int32_t tsdbSetRepoEnv(STsdbRepo *pRepo);
|
||||||
static int32_t tsdbDestroyRepoEnv(STsdbRepo *pRepo);
|
static int32_t tsdbDestroyRepoEnv(STsdbRepo *pRepo);
|
||||||
// static int tsdbOpenMetaFile(char *tsdbDir);
|
// static int tsdbOpenMetaFile(char *tsdbDir);
|
||||||
static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock);
|
static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock, TSKEY now);
|
||||||
static int32_t tsdbRestoreCfg(STsdbRepo *pRepo, STsdbCfg *pCfg);
|
static int32_t tsdbRestoreCfg(STsdbRepo *pRepo, STsdbCfg *pCfg);
|
||||||
static int32_t tsdbGetDataDirName(STsdbRepo *pRepo, char *fname);
|
static int32_t tsdbGetDataDirName(STsdbRepo *pRepo, char *fname);
|
||||||
static void * tsdbCommitData(void *arg);
|
static void * tsdbCommitData(void *arg);
|
||||||
|
@ -214,7 +215,7 @@ TsdbRepoT *tsdbOpenRepo(char *tsdbDir, STsdbAppH *pAppH) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbGetDataDirName(pRepo, dataDir);
|
tsdbGetDataDirName(pRepo, dataDir);
|
||||||
pRepo->tsdbFileH = tsdbInitFileH(dataDir, pRepo->config.maxTables);
|
pRepo->tsdbFileH = tsdbInitFileH(dataDir, &(pRepo->config));
|
||||||
if (pRepo->tsdbFileH == NULL) {
|
if (pRepo->tsdbFileH == NULL) {
|
||||||
tsdbFreeCache(pRepo->tsdbCache);
|
tsdbFreeCache(pRepo->tsdbCache);
|
||||||
tsdbFreeMeta(pRepo->tsdbMeta);
|
tsdbFreeMeta(pRepo->tsdbMeta);
|
||||||
|
@ -394,13 +395,16 @@ STableInfo *tsdbGetTableInfo(TsdbRepoT *pRepo, STableId tableId) {
|
||||||
// TODO: need to return the number of data inserted
|
// TODO: need to return the number of data inserted
|
||||||
int32_t tsdbInsertData(TsdbRepoT *repo, SSubmitMsg *pMsg) {
|
int32_t tsdbInsertData(TsdbRepoT *repo, SSubmitMsg *pMsg) {
|
||||||
SSubmitMsgIter msgIter;
|
SSubmitMsgIter msgIter;
|
||||||
|
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
||||||
|
|
||||||
tsdbInitSubmitMsgIter(pMsg, &msgIter);
|
tsdbInitSubmitMsgIter(pMsg, &msgIter);
|
||||||
SSubmitBlk *pBlock = NULL;
|
SSubmitBlk *pBlock = NULL;
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
TSKEY now = taosGetTimestamp(pRepo->config.precision);
|
||||||
|
|
||||||
while ((pBlock = tsdbGetSubmitMsgNext(&msgIter)) != NULL) {
|
while ((pBlock = tsdbGetSubmitMsgNext(&msgIter)) != NULL) {
|
||||||
if ((code = tsdbInsertDataToTable(repo, pBlock)) != TSDB_CODE_SUCCESS) {
|
if ((code = tsdbInsertDataToTable(repo, pBlock, now)) != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -787,21 +791,31 @@ static int32_t tdInsertRowToTable(STsdbRepo *pRepo, SDataRow row, STable *pTable
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock) {
|
static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock, TSKEY now) {
|
||||||
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
||||||
|
|
||||||
STableId tableId = {.uid = pBlock->uid, .tid = pBlock->tid};
|
STableId tableId = {.uid = pBlock->uid, .tid = pBlock->tid};
|
||||||
STable *pTable = tsdbIsValidTableToInsert(pRepo->tsdbMeta, tableId);
|
STable *pTable = tsdbIsValidTableToInsert(pRepo->tsdbMeta, tableId);
|
||||||
if (pTable == NULL) {
|
if (pTable == NULL) {
|
||||||
uError("failed to get table for insert, uid:%" PRIu64 ", tid:%d", tableId.uid, tableId.tid);
|
tsdbError("failed to get table for insert, uid:%" PRIu64 ", tid:%d", tableId.uid, tableId.tid);
|
||||||
return TSDB_CODE_INVALID_TABLE_ID;
|
return TSDB_CODE_INVALID_TABLE_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitBlkIter blkIter;
|
SSubmitBlkIter blkIter = {0};
|
||||||
SDataRow row;
|
SDataRow row = NULL;
|
||||||
|
|
||||||
|
TSKEY minKey = now - tsMsPerDay[pRepo->config.precision] * pRepo->config.keep;
|
||||||
|
TSKEY maxKey = now + tsMsPerDay[pRepo->config.precision] * pRepo->config.daysPerFile;
|
||||||
|
|
||||||
tsdbInitSubmitBlkIter(pBlock, &blkIter);
|
tsdbInitSubmitBlkIter(pBlock, &blkIter);
|
||||||
while ((row = tsdbGetSubmitBlkNext(&blkIter)) != NULL) {
|
while ((row = tsdbGetSubmitBlkNext(&blkIter)) != NULL) {
|
||||||
|
if (dataRowKey(row) < minKey || dataRowKey(row) > maxKey) {
|
||||||
|
tsdbError(
|
||||||
|
"tsdbId: %d, table tid: %d, talbe uid: %ld timestamp is out of range. now: %ld maxKey: %ld, minKey: %ld",
|
||||||
|
pRepo->config.tsdbId, pTable->tableId.tid, pTable->tableId.uid, now, minKey, maxKey);
|
||||||
|
return TSDB_CODE_TIMESTAMP_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
|
||||||
if (tdInsertRowToTable(pRepo, row, pTable) < 0) {
|
if (tdInsertRowToTable(pRepo, row, pTable) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -903,6 +917,9 @@ static void *tsdbCommitData(void *arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do retention actions
|
||||||
|
tsdbFitRetention(pRepo);
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
tdFreeDataCols(pDataCols);
|
tdFreeDataCols(pDataCols);
|
||||||
tsdbDestroyTableIters(iters, pCfg->maxTables);
|
tsdbDestroyTableIters(iters, pCfg->maxTables);
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef _TD_CODING_H_
|
||||||
|
#define _TD_CODING_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
|
const int TNUMBER = 1;
|
||||||
|
#define IS_LITTLE_ENDIAN() (*(char *)(&TNUMBER) != 0)
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosEncodeFixed16(void *buf, uint16_t value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(buf, &value, sizeof(value));
|
||||||
|
} else {
|
||||||
|
((char *)buf)[0] = value & 0xff;
|
||||||
|
((char *)buf)[1] = (value >> 8) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosEncodeFixed32(void *buf, uint32_t value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(buf, &value, sizeof(value));
|
||||||
|
} else {
|
||||||
|
((char *)buf)[0] = value & 0xff;
|
||||||
|
((char *)buf)[1] = (value >> 8) & 0xff;
|
||||||
|
((char *)buf)[2] = (value >> 16) & 0xff;
|
||||||
|
((char *)buf)[3] = (value >> 24) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosEncodeFixed64(void *buf, uint64_t value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(buf, &value, sizeof(value));
|
||||||
|
} else {
|
||||||
|
((char *)buf)[0] = value & 0xff;
|
||||||
|
((char *)buf)[1] = (value >> 8) & 0xff;
|
||||||
|
((char *)buf)[2] = (value >> 16) & 0xff;
|
||||||
|
((char *)buf)[3] = (value >> 24) & 0xff;
|
||||||
|
((char *)buf)[4] = (value >> 32) & 0xff;
|
||||||
|
((char *)buf)[5] = (value >> 40) & 0xff;
|
||||||
|
((char *)buf)[6] = (value >> 48) & 0xff;
|
||||||
|
((char *)buf)[7] = (value >> 56) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosDecodeFixed16(void *buf, uint16_t *value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(value, buf, sizeof(*value));
|
||||||
|
} else {
|
||||||
|
((char *)value)[1] = ((char *)buf)[0];
|
||||||
|
((char *)value)[0] = ((char *)buf)[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(*value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosDecodeFixed32(void *buf, uint32_t *value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(value, buf, sizeof(*value));
|
||||||
|
} else {
|
||||||
|
((char *)value)[3] = ((char *)buf)[0];
|
||||||
|
((char *)value)[2] = ((char *)buf)[1];
|
||||||
|
((char *)value)[1] = ((char *)buf)[2];
|
||||||
|
((char *)value)[0] = ((char *)buf)[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(*value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosDecodeFixed64(void *buf, uint64_t *value) {
|
||||||
|
if (IS_LITTLE_ENDIAN()) {
|
||||||
|
memcpy(value, buf, sizeof(*value));
|
||||||
|
} else {
|
||||||
|
((char *)value)[7] = ((char *)buf)[0];
|
||||||
|
((char *)value)[6] = ((char *)buf)[1];
|
||||||
|
((char *)value)[5] = ((char *)buf)[2];
|
||||||
|
((char *)value)[4] = ((char *)buf)[3];
|
||||||
|
((char *)value)[3] = ((char *)buf)[4];
|
||||||
|
((char *)value)[2] = ((char *)buf)[5];
|
||||||
|
((char *)value)[1] = ((char *)buf)[6];
|
||||||
|
((char *)value)[0] = ((char *)buf)[7];
|
||||||
|
}
|
||||||
|
|
||||||
|
return POINTER_DRIFT(buf, sizeof(*value));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
static FORCE_INLINE void *taosEncodeVariant16(void *buf, uint16_t value) {}
|
||||||
|
static FORCE_INLINE void *taosEncodeVariant32(void *buf, uint32_t value) {}
|
||||||
|
static FORCE_INLINE void *taosEncodeVariant64(void *buf, uint64_t value) {}
|
||||||
|
static FORCE_INLINE void *taosDecodeVariant16(void *buf, uint16_t *value) {}
|
||||||
|
static FORCE_INLINE void *taosDecodeVariant32(void *buf, uint32_t *value) {}
|
||||||
|
static FORCE_INLINE void *taosDecodeVariant64(void *buf, uint64_t *value) {}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -22,22 +22,37 @@ extern "C" {
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
//@return timestamp in second
|
//@return timestamp in second
|
||||||
int32_t taosGetTimestampSec();
|
int32_t taosGetTimestampSec();
|
||||||
|
|
||||||
//@return timestamp in millisecond
|
//@return timestamp in millisecond
|
||||||
int64_t taosGetTimestampMs();
|
static FORCE_INLINE int64_t taosGetTimestampMs() {
|
||||||
|
struct timeval systemTime;
|
||||||
|
gettimeofday(&systemTime, NULL);
|
||||||
|
return (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
//@return timestamp in microsecond
|
//@return timestamp in microsecond
|
||||||
int64_t taosGetTimestampUs();
|
static FORCE_INLINE int64_t taosGetTimestampUs() {
|
||||||
|
struct timeval systemTime;
|
||||||
|
gettimeofday(&systemTime, NULL);
|
||||||
|
return (int64_t)systemTime.tv_sec * 1000000L + (uint64_t)systemTime.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @return timestamp decided by global conf variable, tsTimePrecision
|
* @return timestamp decided by global conf variable, tsTimePrecision
|
||||||
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
||||||
* precision == TSDB_TIME_PRECISION_MILLI, it returns timestamp in millisecond.
|
* precision == TSDB_TIME_PRECISION_MILLI, it returns timestamp in millisecond.
|
||||||
*/
|
*/
|
||||||
int64_t taosGetTimestamp(int32_t precision);
|
static FORCE_INLINE int64_t taosGetTimestamp(int32_t precision) {
|
||||||
|
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
return taosGetTimestampUs();
|
||||||
|
} else {
|
||||||
|
return taosGetTimestampMs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t getTimestampInUsFromStr(char* token, int32_t tokenlen, int64_t* ts);
|
int32_t getTimestampInUsFromStr(char* token, int32_t tokenlen, int64_t* ts);
|
||||||
|
|
||||||
|
|
|
@ -121,30 +121,6 @@ static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec);
|
||||||
|
|
||||||
int32_t taosGetTimestampSec() { return (int32_t)time(NULL); }
|
int32_t taosGetTimestampSec() { return (int32_t)time(NULL); }
|
||||||
|
|
||||||
int64_t taosGetTimestampMs() {
|
|
||||||
struct timeval systemTime;
|
|
||||||
gettimeofday(&systemTime, NULL);
|
|
||||||
return (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t taosGetTimestampUs() {
|
|
||||||
struct timeval systemTime;
|
|
||||||
gettimeofday(&systemTime, NULL);
|
|
||||||
return (int64_t)systemTime.tv_sec * 1000000L + (uint64_t)systemTime.tv_usec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If tsTimePrecision == 1, taosGetTimestamp will return timestamp in microsecond.
|
|
||||||
* Otherwise, it will return timestamp in millisecond.
|
|
||||||
*/
|
|
||||||
int64_t taosGetTimestamp(int32_t precision) {
|
|
||||||
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
return taosGetTimestampUs();
|
|
||||||
} else {
|
|
||||||
return taosGetTimestampMs();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec) {
|
int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec) {
|
||||||
/* parse datatime string in with tz */
|
/* parse datatime string in with tz */
|
||||||
if (strnchr(timestr, 'T', len, false) != NULL) {
|
if (strnchr(timestr, 'T', len, false) != NULL) {
|
||||||
|
|
Loading…
Reference in New Issue