make compile
This commit is contained in:
parent
700cd74105
commit
1b6c7a5923
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* 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_TCOMPARE_H_
|
||||||
|
#define _TD_TCOMPARE_H_
|
||||||
|
|
||||||
|
#include "compare.h"
|
||||||
|
#include "ttypes.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int32_t compareStrPatternComp(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight);
|
||||||
|
__compar_fn_t getComparFunc(int32_t type, int32_t optr);
|
||||||
|
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order);
|
||||||
|
int32_t doCompare(const char* a, const char* b, int32_t type, size_t size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_TCOMPARE_H_*/
|
|
@ -6,10 +6,10 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// ----------------- For variable data types such as TSDB_DATA_TYPE_BINARY and TSDB_DATA_TYPE_NCHAR
|
// ----------------- For variable data types such as TSDB_DATA_TYPE_BINARY and TSDB_DATA_TYPE_NCHAR
|
||||||
typedef int32_t VarDataOffsetT;
|
typedef int32_t VarDataOffsetT;
|
||||||
typedef int16_t VarDataLenT; // maxVarDataLen: 32767
|
|
||||||
typedef uint16_t TDRowLenT; // not including overhead: 0 ~ 65535
|
typedef uint16_t TDRowLenT; // not including overhead: 0 ~ 65535
|
||||||
typedef uint32_t TDRowTLenT; // total length, including overhead
|
typedef uint32_t TDRowTLenT; // total length, including overhead
|
||||||
|
|
||||||
|
@ -30,11 +30,7 @@ typedef struct {
|
||||||
} SNCharNullT;
|
} SNCharNullT;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#define VARSTR_HEADER_SIZE sizeof(VarDataLenT)
|
|
||||||
|
|
||||||
#define varDataLen(v) ((VarDataLenT *)(v))[0]
|
|
||||||
#define varDataTLen(v) (sizeof(VarDataLenT) + varDataLen(v))
|
#define varDataTLen(v) (sizeof(VarDataLenT) + varDataLen(v))
|
||||||
#define varDataVal(v) ((void *)((char *)v + VARSTR_HEADER_SIZE))
|
|
||||||
#define varDataCopy(dst, v) memcpy((dst), (void*) (v), varDataTLen(v))
|
#define varDataCopy(dst, v) memcpy((dst), (void*) (v), varDataTLen(v))
|
||||||
#define varDataLenByData(v) (*(VarDataLenT *)(((char*)(v)) - VARSTR_HEADER_SIZE))
|
#define varDataLenByData(v) (*(VarDataLenT *)(((char*)(v)) - VARSTR_HEADER_SIZE))
|
||||||
#define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT) (_len))
|
#define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT) (_len))
|
||||||
|
|
|
@ -46,11 +46,6 @@ int patternMatch(const char *pattern, const char *str, size_t size, const SPatte
|
||||||
|
|
||||||
int WCSPatternMatch(const wchar_t *pattern, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo);
|
int WCSPatternMatch(const wchar_t *pattern, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo);
|
||||||
|
|
||||||
int32_t doCompare(const char* a, const char* b, int32_t type, size_t size);
|
|
||||||
|
|
||||||
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order);
|
|
||||||
|
|
||||||
__compar_fn_t getComparFunc(int32_t type, int32_t optr);
|
|
||||||
|
|
||||||
int32_t taosArrayCompareString(const void* a, const void* b);
|
int32_t taosArrayCompareString(const void* a, const void* b);
|
||||||
|
|
||||||
|
@ -82,12 +77,22 @@ int32_t compareDoubleVal(const void *pLeft, const void *pRight);
|
||||||
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight);
|
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight);
|
||||||
|
|
||||||
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight);
|
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight);
|
||||||
int32_t compareStrPatternComp(const void* pLeft, const void* pRight);
|
|
||||||
int32_t compareStrRegexComp(const void* pLeft, const void* pRight);
|
int32_t compareStrRegexComp(const void* pLeft, const void* pRight);
|
||||||
int32_t compareStrRegexCompMatch(const void* pLeft, const void* pRight);
|
int32_t compareStrRegexCompMatch(const void* pLeft, const void* pRight);
|
||||||
int32_t compareStrRegexCompNMatch(const void* pLeft, const void* pRight);
|
int32_t compareStrRegexCompNMatch(const void* pLeft, const void* pRight);
|
||||||
int32_t compareFindItemInSet(const void *pLeft, const void* pRight);
|
int32_t compareFindItemInSet(const void *pLeft, const void* pRight);
|
||||||
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight);
|
int32_t compareInt8ValDesc(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareInt32ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareInt64ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareFloatValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareDoubleValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareUint8ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareUint16ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareUint32ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareUint64ValDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareLenPrefixedStrDesc(const void* pLeft, const void* pRight);
|
||||||
|
int32_t compareLenPrefixedWStrDesc(const void* pLeft, const void* pRight);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -110,33 +110,6 @@ do { \
|
||||||
(src) = (void *)((char *)src + sizeof(type));\
|
(src) = (void *)((char *)src + sizeof(type));\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define GET_INT8_VAL(x) (*(int8_t *)(x))
|
|
||||||
#define GET_INT16_VAL(x) (*(int16_t *)(x))
|
|
||||||
#define GET_INT32_VAL(x) (*(int32_t *)(x))
|
|
||||||
#define GET_INT64_VAL(x) (*(int64_t *)(x))
|
|
||||||
#define GET_UINT8_VAL(x) (*(uint8_t*) (x))
|
|
||||||
#define GET_UINT16_VAL(x) (*(uint16_t *)(x))
|
|
||||||
#define GET_UINT32_VAL(x) (*(uint32_t *)(x))
|
|
||||||
#define GET_UINT64_VAL(x) (*(uint64_t *)(x))
|
|
||||||
|
|
||||||
#ifdef _TD_ARM_32
|
|
||||||
float taos_align_get_float(const char* pBuf);
|
|
||||||
double taos_align_get_double(const char* pBuf);
|
|
||||||
|
|
||||||
#define GET_FLOAT_VAL(x) taos_align_get_float(x)
|
|
||||||
#define GET_DOUBLE_VAL(x) taos_align_get_double(x)
|
|
||||||
#define SET_FLOAT_VAL(x, y) { float z = (float)(y); (*(int32_t*) x = *(int32_t*)(&z)); }
|
|
||||||
#define SET_DOUBLE_VAL(x, y) { double z = (double)(y); (*(int64_t*) x = *(int64_t*)(&z)); }
|
|
||||||
#define SET_FLOAT_PTR(x, y) { (*(int32_t*) x = *(int32_t*)y); }
|
|
||||||
#define SET_DOUBLE_PTR(x, y) { (*(int64_t*) x = *(int64_t*)y); }
|
|
||||||
#else
|
|
||||||
#define GET_FLOAT_VAL(x) (*(float *)(x))
|
|
||||||
#define GET_DOUBLE_VAL(x) (*(double *)(x))
|
|
||||||
#define SET_FLOAT_VAL(x, y) { (*(float *)(x)) = (float)(y); }
|
|
||||||
#define SET_DOUBLE_VAL(x, y) { (*(double *)(x)) = (double)(y); }
|
|
||||||
#define SET_FLOAT_PTR(x, y) { (*(float *)(x)) = (*(float *)(y)); }
|
|
||||||
#define SET_DOUBLE_PTR(x, y) { (*(double *)(x)) = (*(double *)(y)); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: check if below is necessary
|
// TODO: check if below is necessary
|
||||||
#define TSDB_RELATION_INVALID 0
|
#define TSDB_RELATION_INVALID 0
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* 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_TYPES_H_
|
||||||
|
#define _TD_TYPES_H_
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GET_INT8_VAL(x) (*(int8_t *)(x))
|
||||||
|
#define GET_INT16_VAL(x) (*(int16_t *)(x))
|
||||||
|
#define GET_INT32_VAL(x) (*(int32_t *)(x))
|
||||||
|
#define GET_INT64_VAL(x) (*(int64_t *)(x))
|
||||||
|
#define GET_UINT8_VAL(x) (*(uint8_t*) (x))
|
||||||
|
#define GET_UINT16_VAL(x) (*(uint16_t *)(x))
|
||||||
|
#define GET_UINT32_VAL(x) (*(uint32_t *)(x))
|
||||||
|
#define GET_UINT64_VAL(x) (*(uint64_t *)(x))
|
||||||
|
|
||||||
|
static FORCE_INLINE float taos_align_get_float(const char *pBuf) {
|
||||||
|
#if __STDC_VERSION__ >= 201112L
|
||||||
|
static_assert(sizeof(float) == sizeof(uint32_t), "sizeof(float) must equal to sizeof(uint32_t)");
|
||||||
|
#else
|
||||||
|
assert(sizeof(float) == sizeof(uint32_t));
|
||||||
|
#endif
|
||||||
|
float fv = 0;
|
||||||
|
memcpy(&fv, pBuf, sizeof(fv)); // in ARM, return *((const float*)(pBuf)) may cause problem
|
||||||
|
return fv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE double taos_align_get_double(const char *pBuf) {
|
||||||
|
#if __STDC_VERSION__ >= 201112L
|
||||||
|
static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) must equal to sizeof(uint64_t)");
|
||||||
|
#else
|
||||||
|
assert(sizeof(double) == sizeof(uint64_t));
|
||||||
|
#endif
|
||||||
|
double dv = 0;
|
||||||
|
memcpy(&dv, pBuf, sizeof(dv)); // in ARM, return *((const double*)(pBuf)) may cause problem
|
||||||
|
return dv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// #ifdef _TD_ARM_32
|
||||||
|
// float taos_align_get_float(const char* pBuf);
|
||||||
|
// double taos_align_get_double(const char* pBuf);
|
||||||
|
|
||||||
|
// #define GET_FLOAT_VAL(x) taos_align_get_float(x)
|
||||||
|
// #define GET_DOUBLE_VAL(x) taos_align_get_double(x)
|
||||||
|
// #define SET_FLOAT_VAL(x, y) { float z = (float)(y); (*(int32_t*) x = *(int32_t*)(&z)); }
|
||||||
|
// #define SET_DOUBLE_VAL(x, y) { double z = (double)(y); (*(int64_t*) x = *(int64_t*)(&z)); }
|
||||||
|
// #define SET_FLOAT_PTR(x, y) { (*(int32_t*) x = *(int32_t*)y); }
|
||||||
|
// #define SET_DOUBLE_PTR(x, y) { (*(int64_t*) x = *(int64_t*)y); }
|
||||||
|
// #else
|
||||||
|
#define GET_FLOAT_VAL(x) (*(float *)(x))
|
||||||
|
#define GET_DOUBLE_VAL(x) (*(double *)(x))
|
||||||
|
#define SET_FLOAT_VAL(x, y) { (*(float *)(x)) = (float)(y); }
|
||||||
|
#define SET_DOUBLE_VAL(x, y) { (*(double *)(x)) = (double)(y); }
|
||||||
|
#define SET_FLOAT_PTR(x, y) { (*(float *)(x)) = (*(float *)(y)); }
|
||||||
|
#define SET_DOUBLE_PTR(x, y) { (*(double *)(x)) = (*(double *)(y)); }
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
typedef int16_t VarDataLenT; // maxVarDataLen: 32767
|
||||||
|
#define VARSTR_HEADER_SIZE sizeof(VarDataLenT)
|
||||||
|
|
||||||
|
#define varDataLen(v) ((VarDataLenT *)(v))[0]
|
||||||
|
#define varDataVal(v) ((void *)((char *)v + VARSTR_HEADER_SIZE))
|
||||||
|
|
||||||
|
typedef int32_t VarDataOffsetT;
|
||||||
|
typedef int16_t VarDataLenT; // maxVarDataLen: 32767
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_TYPES_H_*/
|
|
@ -12,334 +12,8 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#define _BSD_SOURCE
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#define _XOPEN_SOURCE
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "ulog.h"
|
|
||||||
#include "thash.h"
|
|
||||||
#include "regex.h"
|
|
||||||
#include "ttypes.h"
|
|
||||||
|
|
||||||
int32_t setCompareBytes1(const void *pLeft, const void *pRight) {
|
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t setCompareBytes2(const void *pLeft, const void *pRight) {
|
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 2) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t setCompareBytes4(const void *pLeft, const void *pRight) {
|
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 4) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t setCompareBytes8(const void *pLeft, const void *pRight) {
|
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 8) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt8Val(const void *pLeft, const void *pRight) {
|
|
||||||
int8_t left = GET_INT8_VAL(pLeft), right = GET_INT8_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt8ValDesc(const void *pLeft, const void *pRight) {
|
|
||||||
return compareInt8Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt16Val(const void *pLeft, const void *pRight) {
|
|
||||||
int16_t left = GET_INT16_VAL(pLeft), right = GET_INT16_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt16ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareInt16Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt32Val(const void *pLeft, const void *pRight) {
|
|
||||||
int32_t left = GET_INT32_VAL(pLeft), right = GET_INT32_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt32ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareInt32Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt64Val(const void *pLeft, const void *pRight) {
|
|
||||||
int64_t left = GET_INT64_VAL(pLeft), right = GET_INT64_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareInt64ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareInt64Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
|
|
||||||
uint32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint32ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareUint32Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint64Val(const void *pLeft, const void *pRight) {
|
|
||||||
uint64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint64ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareUint64Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint16Val(const void *pLeft, const void *pRight) {
|
|
||||||
uint16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint16ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareUint16Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint8Val(const void* pLeft, const void* pRight) {
|
|
||||||
uint8_t left = GET_UINT8_VAL(pLeft), right = GET_UINT8_VAL(pRight);
|
|
||||||
if (left > right) return 1;
|
|
||||||
if (left < right) return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareUint8ValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareUint8Val(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
|
||||||
float p1 = GET_FLOAT_VAL(pLeft);
|
|
||||||
float p2 = GET_FLOAT_VAL(pRight);
|
|
||||||
|
|
||||||
if (isnan(p1) && isnan(p2)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isnan(p1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isnan(p2)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (FLT_EQUAL(p1, p2)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareFloatValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareFloatVal(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
|
||||||
double p1 = GET_DOUBLE_VAL(pLeft);
|
|
||||||
double p2 = GET_DOUBLE_VAL(pRight);
|
|
||||||
|
|
||||||
if (isnan(p1) && isnan(p2)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isnan(p1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isnan(p2)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (FLT_EQUAL(p1, p2)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareDoubleValDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareDoubleVal(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) {
|
|
||||||
int32_t len1 = varDataLen(pLeft);
|
|
||||||
int32_t len2 = varDataLen(pRight);
|
|
||||||
|
|
||||||
if (len1 != len2) {
|
|
||||||
return len1 > len2? 1:-1;
|
|
||||||
} else {
|
|
||||||
int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), len1);
|
|
||||||
if (ret == 0) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return ret > 0 ? 1:-1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareLenPrefixedStrDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareLenPrefixedStr(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
|
|
||||||
int32_t len1 = varDataLen(pLeft);
|
|
||||||
int32_t len2 = varDataLen(pRight);
|
|
||||||
|
|
||||||
if (len1 != len2) {
|
|
||||||
return len1 > len2? 1:-1;
|
|
||||||
} else {
|
|
||||||
int32_t ret = memcmp((wchar_t*) pLeft, (wchar_t*) pRight, len1);
|
|
||||||
if (ret == 0) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return ret > 0 ? 1 : -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareLenPrefixedWStrDesc(const void* pLeft, const void* pRight) {
|
|
||||||
return compareLenPrefixedWStr(pRight, pLeft);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare two strings
|
|
||||||
* TSDB_MATCH: Match
|
|
||||||
* TSDB_NOMATCH: No match
|
|
||||||
* TSDB_NOWILDCARDMATCH: No match in spite of having * or % wildcards.
|
|
||||||
* Like matching rules:
|
|
||||||
* '%': Matches zero or more characters
|
|
||||||
* '_': Matches one character
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int patternMatch(const char *patterStr, const char *str, size_t size, const SPatternCompareInfo *pInfo) {
|
|
||||||
char c, c1;
|
|
||||||
|
|
||||||
int32_t i = 0;
|
|
||||||
int32_t j = 0;
|
|
||||||
int32_t o = 0;
|
|
||||||
int32_t m = 0;
|
|
||||||
|
|
||||||
while ((c = patterStr[i++]) != 0) {
|
|
||||||
if (c == pInfo->matchAll) { /* Match "*" */
|
|
||||||
|
|
||||||
while ((c = patterStr[i++]) == pInfo->matchAll || c == pInfo->matchOne) {
|
|
||||||
if (c == pInfo->matchOne) {
|
|
||||||
if (j > size || str[j++] == 0) {
|
|
||||||
// empty string, return not match
|
|
||||||
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
||||||
} else {
|
|
||||||
++o;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == 0) {
|
|
||||||
return TSDB_PATTERN_MATCH; /* "*" at the end of the pattern matches */
|
|
||||||
}
|
|
||||||
|
|
||||||
char next[3] = {toupper(c), tolower(c), 0};
|
|
||||||
m = o;
|
|
||||||
while (1) {
|
|
||||||
size_t n = strcspn(str + m, next);
|
|
||||||
str += m + n;
|
|
||||||
|
|
||||||
if (str[0] == 0 || (n >= size)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ret = patternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
|
||||||
if (ret != TSDB_PATTERN_NOMATCH) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
m = 0;
|
|
||||||
}
|
|
||||||
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
c1 = str[j++];
|
|
||||||
++o;
|
|
||||||
|
|
||||||
if (j <= size) {
|
|
||||||
if (c == '\\' && patterStr[i] == '_' && c1 == '_') { i++; continue; }
|
|
||||||
if (c == c1 || tolower(c) == tolower(c1) || (c == pInfo->matchOne && c1 != 0)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_PATTERN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo) {
|
|
||||||
wchar_t c, c1;
|
|
||||||
wchar_t matchOne = L'_'; // "_"
|
|
||||||
wchar_t matchAll = L'%'; // "%"
|
|
||||||
|
|
||||||
int32_t i = 0;
|
|
||||||
int32_t j = 0;
|
|
||||||
|
|
||||||
while ((c = patterStr[i++]) != 0) {
|
|
||||||
if (c == matchAll) { /* Match "%" */
|
|
||||||
|
|
||||||
while ((c = patterStr[i++]) == matchAll || c == matchOne) {
|
|
||||||
if (c == matchOne && (j >= size || str[j++] == 0)) {
|
|
||||||
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c == 0) {
|
|
||||||
return TSDB_PATTERN_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
wchar_t accept[3] = {towupper(c), towlower(c), 0};
|
|
||||||
while (1) {
|
|
||||||
size_t n = wcscspn(str, accept);
|
|
||||||
|
|
||||||
str += n;
|
|
||||||
if (str[0] == 0 || (n >= size)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ret = WCSPatternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
|
||||||
if (ret != TSDB_PATTERN_NOMATCH) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
c1 = str[j++];
|
|
||||||
|
|
||||||
if (j <= size) {
|
|
||||||
if (c == c1 || towlower(c) == towlower(c1) || (c == matchOne && c1 != 0)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_PATTERN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
||||||
SPatternCompareInfo pInfo = {'%', '_'};
|
SPatternCompareInfo pInfo = {'%', '_'};
|
||||||
|
@ -359,62 +33,6 @@ int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
||||||
return (ret == TSDB_PATTERN_MATCH) ? 0 : 1;
|
return (ret == TSDB_PATTERN_MATCH) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t compareStrRegexCompMatch(const void* pLeft, const void* pRight) {
|
|
||||||
return compareStrRegexComp(pLeft, pRight);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareStrRegexCompNMatch(const void* pLeft, const void* pRight) {
|
|
||||||
return compareStrRegexComp(pLeft, pRight) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareStrRegexComp(const void* pLeft, const void* pRight) {
|
|
||||||
size_t sz = varDataLen(pRight);
|
|
||||||
char *pattern = malloc(sz + 1);
|
|
||||||
memcpy(pattern, varDataVal(pRight), varDataLen(pRight));
|
|
||||||
pattern[sz] = 0;
|
|
||||||
|
|
||||||
sz = varDataLen(pLeft);
|
|
||||||
char *str = malloc(sz + 1);
|
|
||||||
memcpy(str, varDataVal(pLeft), sz);
|
|
||||||
str[sz] = 0;
|
|
||||||
|
|
||||||
int errCode = 0;
|
|
||||||
regex_t regex;
|
|
||||||
char msgbuf[256] = {0};
|
|
||||||
|
|
||||||
int cflags = REG_EXTENDED;
|
|
||||||
if ((errCode = regcomp(®ex, pattern, cflags)) != 0) {
|
|
||||||
regerror(errCode, ®ex, msgbuf, sizeof(msgbuf));
|
|
||||||
uError("Failed to compile regex pattern %s. reason %s", pattern, msgbuf);
|
|
||||||
regfree(®ex);
|
|
||||||
free(str);
|
|
||||||
free(pattern);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
errCode = regexec(®ex, str, 0, NULL, 0);
|
|
||||||
if (errCode != 0 && errCode != REG_NOMATCH) {
|
|
||||||
regerror(errCode, ®ex, msgbuf, sizeof(msgbuf));
|
|
||||||
uDebug("Failed to match %s with pattern %s, reason %s", str, pattern, msgbuf)
|
|
||||||
}
|
|
||||||
int32_t result = (errCode == 0) ? 0 : 1;
|
|
||||||
regfree(®ex);
|
|
||||||
free(str);
|
|
||||||
free(pattern);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t taosArrayCompareString(const void* a, const void* b) {
|
|
||||||
const char* x = *(const char**)a;
|
|
||||||
const char* y = *(const char**)b;
|
|
||||||
|
|
||||||
return compareLenPrefixedStr(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareFindItemInSet(const void *pLeft, const void* pRight) {
|
|
||||||
return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
|
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
|
||||||
SPatternCompareInfo pInfo = {'%', '_'};
|
SPatternCompareInfo pInfo = {'%', '_'};
|
||||||
|
|
||||||
|
@ -600,4 +218,4 @@ int32_t doCompare(const char* f1, const char* f2, int32_t type, size_t size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,4 +8,5 @@ add_executable(taosd ${TAOSD_SRC})
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
taosd
|
taosd
|
||||||
PUBLIC dnode
|
PUBLIC dnode
|
||||||
|
PUBLIC util
|
||||||
)
|
)
|
|
@ -11,6 +11,6 @@ target_link_libraries(
|
||||||
)
|
)
|
||||||
target_link_libraries(meta PUBLIC rocksdb)
|
target_link_libraries(meta PUBLIC rocksdb)
|
||||||
|
|
||||||
# if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
# add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
# endif(${BUILD_TEST})
|
endif(${BUILD_TEST})
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
aux_source_directory(src UTIL_SRC)
|
aux_source_directory(src UTIL_SRC)
|
||||||
add_library(util ${UTIL_SRC})
|
add_library(util STATIC ${UTIL_SRC})
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
util
|
util
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/util"
|
PUBLIC "${CMAKE_SOURCE_DIR}/include/util"
|
||||||
|
|
|
@ -0,0 +1,398 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
#define _BSD_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#define _XOPEN_SOURCE
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "compare.h"
|
||||||
|
#include "ulog.h"
|
||||||
|
#include "thash.h"
|
||||||
|
#include "regex.h"
|
||||||
|
|
||||||
|
int32_t setCompareBytes1(const void *pLeft, const void *pRight) {
|
||||||
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t setCompareBytes2(const void *pLeft, const void *pRight) {
|
||||||
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 2) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t setCompareBytes4(const void *pLeft, const void *pRight) {
|
||||||
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 4) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t setCompareBytes8(const void *pLeft, const void *pRight) {
|
||||||
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 8) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Val(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT8_VAL(pLeft), right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8ValDesc(const void *pLeft, const void *pRight) {
|
||||||
|
return compareInt8Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Val(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT16_VAL(pLeft), right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareInt16Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Val(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft), right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareInt32Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Val(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft), right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareInt64Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareUint32Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Val(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareUint64Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Val(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareUint16Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Val(const void* pLeft, const void* pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft), right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8ValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareUint8Val(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
||||||
|
float p1 = GET_FLOAT_VAL(pLeft);
|
||||||
|
float p2 = GET_FLOAT_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(p1) && isnan(p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p2)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (FLT_EQUAL(p1, p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareFloatVal(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
||||||
|
double p1 = GET_DOUBLE_VAL(pLeft);
|
||||||
|
double p2 = GET_DOUBLE_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(p1) && isnan(p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(p2)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (FLT_EQUAL(p1, p2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleValDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareDoubleVal(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t len1 = varDataLen(pLeft);
|
||||||
|
int32_t len2 = varDataLen(pRight);
|
||||||
|
|
||||||
|
if (len1 != len2) {
|
||||||
|
return len1 > len2? 1:-1;
|
||||||
|
} else {
|
||||||
|
int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), len1);
|
||||||
|
if (ret == 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return ret > 0 ? 1:-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareLenPrefixedStrDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareLenPrefixedStr(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t len1 = varDataLen(pLeft);
|
||||||
|
int32_t len2 = varDataLen(pRight);
|
||||||
|
|
||||||
|
if (len1 != len2) {
|
||||||
|
return len1 > len2? 1:-1;
|
||||||
|
} else {
|
||||||
|
int32_t ret = memcmp((wchar_t*) pLeft, (wchar_t*) pRight, len1);
|
||||||
|
if (ret == 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return ret > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareLenPrefixedWStrDesc(const void* pLeft, const void* pRight) {
|
||||||
|
return compareLenPrefixedWStr(pRight, pLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare two strings
|
||||||
|
* TSDB_MATCH: Match
|
||||||
|
* TSDB_NOMATCH: No match
|
||||||
|
* TSDB_NOWILDCARDMATCH: No match in spite of having * or % wildcards.
|
||||||
|
* Like matching rules:
|
||||||
|
* '%': Matches zero or more characters
|
||||||
|
* '_': Matches one character
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int patternMatch(const char *patterStr, const char *str, size_t size, const SPatternCompareInfo *pInfo) {
|
||||||
|
char c, c1;
|
||||||
|
|
||||||
|
int32_t i = 0;
|
||||||
|
int32_t j = 0;
|
||||||
|
int32_t o = 0;
|
||||||
|
int32_t m = 0;
|
||||||
|
|
||||||
|
while ((c = patterStr[i++]) != 0) {
|
||||||
|
if (c == pInfo->matchAll) { /* Match "*" */
|
||||||
|
|
||||||
|
while ((c = patterStr[i++]) == pInfo->matchAll || c == pInfo->matchOne) {
|
||||||
|
if (c == pInfo->matchOne) {
|
||||||
|
if (j > size || str[j++] == 0) {
|
||||||
|
// empty string, return not match
|
||||||
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
||||||
|
} else {
|
||||||
|
++o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == 0) {
|
||||||
|
return TSDB_PATTERN_MATCH; /* "*" at the end of the pattern matches */
|
||||||
|
}
|
||||||
|
|
||||||
|
char next[3] = {toupper(c), tolower(c), 0};
|
||||||
|
m = o;
|
||||||
|
while (1) {
|
||||||
|
size_t n = strcspn(str + m, next);
|
||||||
|
str += m + n;
|
||||||
|
|
||||||
|
if (str[0] == 0 || (n >= size)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ret = patternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
||||||
|
if (ret != TSDB_PATTERN_NOMATCH) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
m = 0;
|
||||||
|
}
|
||||||
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
c1 = str[j++];
|
||||||
|
++o;
|
||||||
|
|
||||||
|
if (j <= size) {
|
||||||
|
if (c == '\\' && patterStr[i] == '_' && c1 == '_') { i++; continue; }
|
||||||
|
if (c == c1 || tolower(c) == tolower(c1) || (c == pInfo->matchOne && c1 != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_PATTERN_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo) {
|
||||||
|
wchar_t c, c1;
|
||||||
|
wchar_t matchOne = L'_'; // "_"
|
||||||
|
wchar_t matchAll = L'%'; // "%"
|
||||||
|
|
||||||
|
int32_t i = 0;
|
||||||
|
int32_t j = 0;
|
||||||
|
|
||||||
|
while ((c = patterStr[i++]) != 0) {
|
||||||
|
if (c == matchAll) { /* Match "%" */
|
||||||
|
|
||||||
|
while ((c = patterStr[i++]) == matchAll || c == matchOne) {
|
||||||
|
if (c == matchOne && (j >= size || str[j++] == 0)) {
|
||||||
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c == 0) {
|
||||||
|
return TSDB_PATTERN_MATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
wchar_t accept[3] = {towupper(c), towlower(c), 0};
|
||||||
|
while (1) {
|
||||||
|
size_t n = wcscspn(str, accept);
|
||||||
|
|
||||||
|
str += n;
|
||||||
|
if (str[0] == 0 || (n >= size)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ret = WCSPatternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
||||||
|
if (ret != TSDB_PATTERN_NOMATCH) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
c1 = str[j++];
|
||||||
|
|
||||||
|
if (j <= size) {
|
||||||
|
if (c == c1 || towlower(c) == towlower(c1) || (c == matchOne && c1 != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_PATTERN_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareStrRegexCompMatch(const void* pLeft, const void* pRight) {
|
||||||
|
return compareStrRegexComp(pLeft, pRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareStrRegexCompNMatch(const void* pLeft, const void* pRight) {
|
||||||
|
return compareStrRegexComp(pLeft, pRight) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareStrRegexComp(const void* pLeft, const void* pRight) {
|
||||||
|
size_t sz = varDataLen(pRight);
|
||||||
|
char *pattern = malloc(sz + 1);
|
||||||
|
memcpy(pattern, varDataVal(pRight), varDataLen(pRight));
|
||||||
|
pattern[sz] = 0;
|
||||||
|
|
||||||
|
sz = varDataLen(pLeft);
|
||||||
|
char *str = malloc(sz + 1);
|
||||||
|
memcpy(str, varDataVal(pLeft), sz);
|
||||||
|
str[sz] = 0;
|
||||||
|
|
||||||
|
int errCode = 0;
|
||||||
|
regex_t regex;
|
||||||
|
char msgbuf[256] = {0};
|
||||||
|
|
||||||
|
int cflags = REG_EXTENDED;
|
||||||
|
if ((errCode = regcomp(®ex, pattern, cflags)) != 0) {
|
||||||
|
regerror(errCode, ®ex, msgbuf, sizeof(msgbuf));
|
||||||
|
uError("Failed to compile regex pattern %s. reason %s", pattern, msgbuf);
|
||||||
|
regfree(®ex);
|
||||||
|
free(str);
|
||||||
|
free(pattern);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
errCode = regexec(®ex, str, 0, NULL, 0);
|
||||||
|
if (errCode != 0 && errCode != REG_NOMATCH) {
|
||||||
|
regerror(errCode, ®ex, msgbuf, sizeof(msgbuf));
|
||||||
|
uDebug("Failed to match %s with pattern %s, reason %s", str, pattern, msgbuf)
|
||||||
|
}
|
||||||
|
int32_t result = (errCode == 0) ? 0 : 1;
|
||||||
|
regfree(®ex);
|
||||||
|
free(str);
|
||||||
|
free(pattern);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosArrayCompareString(const void* a, const void* b) {
|
||||||
|
const char* x = *(const char**)a;
|
||||||
|
const char* y = *(const char**)b;
|
||||||
|
|
||||||
|
return compareLenPrefixedStr(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFindItemInSet(const void *pLeft, const void* pRight) {
|
||||||
|
return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0;
|
||||||
|
}
|
|
@ -15,8 +15,9 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "tcompare.h"
|
#include "compare.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
#define ROTL32(x, r) ((x) << (r) | (x) >> (32u - (r)))
|
#define ROTL32(x, r) ((x) << (r) | (x) >> (32u - (r)))
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
*/
|
*/
|
||||||
#include "tskiplist.h"
|
#include "tskiplist.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tcompare.h"
|
#include "compare.h"
|
||||||
#include "ulog.h"
|
#include "ulog.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
||||||
|
|
|
@ -450,24 +450,3 @@ char *taosIpStr(uint32_t ipInt) {
|
||||||
return ipStr;
|
return ipStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE float taos_align_get_float(const char* pBuf) {
|
|
||||||
#if __STDC_VERSION__ >= 201112L
|
|
||||||
static_assert(sizeof(float) == sizeof(uint32_t), "sizeof(float) must equal to sizeof(uint32_t)");
|
|
||||||
#else
|
|
||||||
assert(sizeof(float) == sizeof(uint32_t));
|
|
||||||
#endif
|
|
||||||
float fv = 0;
|
|
||||||
memcpy(&fv, pBuf, sizeof(fv)); // in ARM, return *((const float*)(pBuf)) may cause problem
|
|
||||||
return fv;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE double taos_align_get_double(const char* pBuf) {
|
|
||||||
#if __STDC_VERSION__ >= 201112L
|
|
||||||
static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) must equal to sizeof(uint64_t)");
|
|
||||||
#else
|
|
||||||
assert(sizeof(double) == sizeof(uint64_t));
|
|
||||||
#endif
|
|
||||||
double dv = 0;
|
|
||||||
memcpy(&dv, pBuf, sizeof(dv)); // in ARM, return *((const double*)(pBuf)) may cause problem
|
|
||||||
return dv;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue