diff --git a/include/common/tglobal.h b/include/common/tglobal.h
index 5e245f376126f0fcae4e75e67a1e25019b332c60..bb704f153644b5d469e429de753cf550dcd709d3 100644
--- a/include/common/tglobal.h
+++ b/include/common/tglobal.h
@@ -23,11 +23,9 @@ extern "C" {
#include "tdef.h"
// common
-extern int8_t tsDaylight;
extern int32_t tsCompressMsgSize;
extern int32_t tsCompressColData;
extern int32_t tsMaxNumOfDistinctResults;
-extern char tsTempDir[];
extern int tsCompatibleModel; // 2.0 compatible model
extern int8_t tsEnableSlaveQuery;
extern int8_t tsEnableAdjustMaster;
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index ae3586e7356ccea9c00bf79b1794687e65080209..9ab78f3c9603011296c7ef450ba0d792dbc19043 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -656,9 +656,9 @@ int32_t tDeserializeSRetrieveFuncRsp(void* buf, int32_t bufLen, SRetrieveFuncRsp
typedef struct {
int32_t statusInterval;
int64_t checkTime; // 1970-01-01 00:00:00.000
- char timezone[TSDB_TIMEZONE_LEN]; // tsTimezone
- char locale[TSDB_LOCALE_LEN]; // tsLocale
- char charset[TSDB_LOCALE_LEN]; // tsCharset
+ char timezone[TD_TIMEZONE_LEN]; // tsTimezone
+ char locale[TD_LOCALE_LEN]; // tsLocale
+ char charset[TD_LOCALE_LEN]; // tsCharset
} SClusterCfg;
typedef struct {
diff --git a/include/dnode/mgmt/dnode.h b/include/dnode/mgmt/dnode.h
index 5d6c869b4d8a66463590fa0762da3658adc2a41e..d630fd0b1acf8beedce951d533a18440b49bed11 100644
--- a/include/dnode/mgmt/dnode.h
+++ b/include/dnode/mgmt/dnode.h
@@ -34,9 +34,9 @@ typedef struct {
bool printAuth;
int32_t rpcTimer;
int32_t rpcMaxTime;
- char timezone[TSDB_TIMEZONE_LEN];
- char locale[TSDB_LOCALE_LEN];
- char charset[TSDB_LOCALE_LEN];
+ char timezone[TD_TIMEZONE_LEN];
+ char locale[TD_LOCALE_LEN];
+ char charset[TD_LOCALE_LEN];
char buildinfo[64];
char gitinfo[48];
} SDnodeEnvCfg;
diff --git a/include/libs/config/config.h b/include/libs/config/config.h
index 3c9ec1e3bfab5a06d08c7e8cc72a8216ee282232..594c2586484cbbce46836bc4e7aae6a198a24fd0 100644
--- a/include/libs/config/config.h
+++ b/include/libs/config/config.h
@@ -80,6 +80,7 @@ int32_t cfgGetSize(SConfig *pCfg);
SConfigItem *cfgIterate(SConfig *pCfg, SConfigItem *pIter);
void cfgCancelIterate(SConfig *pCfg, SConfigItem *pIter);
SConfigItem *cfgGetItem(SConfig *pCfg, const char *name);
+int32_t cfgSetItem(SConfig *pCfg, const char *name, const char *value, ECfgSrcType stype);
int32_t cfgAddBool(SConfig *pCfg, const char *name, bool defaultVal);
int32_t cfgAddInt32(SConfig *pCfg, const char *name, int32_t defaultVal, int64_t minval, int64_t maxval);
diff --git a/include/os/os.h b/include/os/os.h
index 023d2b04705074abcec4c1dc927211bf63512112..d96f7efb51dd0ca36d307308ba005d4fd7f628b6 100644
--- a/include/os/os.h
+++ b/include/os/os.h
@@ -59,6 +59,7 @@ extern "C" {
#include "osEndian.h"
#include "osEnv.h"
#include "osFile.h"
+#include "osLocale.h"
#include "osLz4.h"
#include "osMath.h"
#include "osMemory.h"
@@ -73,6 +74,7 @@ extern "C" {
#include "osThread.h"
#include "osTime.h"
#include "osTimer.h"
+#include "osTimezone.h"
void osInit();
diff --git a/include/os/osDir.h b/include/os/osDir.h
index 01ec24f23569e577ead33d9b3400078881b37e97..e328c420638eb1d146abe97f8abf6bacb6286377 100644
--- a/include/os/osDir.h
+++ b/include/os/osDir.h
@@ -23,7 +23,7 @@ extern "C" {
void taosRemoveDir(const char *dirname);
int32_t taosDirExist(char *dirname);
int32_t taosMkDir(const char *dirname);
-void taosRemoveOldFiles(char *dirname, int32_t keepDays);
+void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
int32_t taosRealPath(char *dirname, int32_t maxlen);
diff --git a/include/os/osEnv.h b/include/os/osEnv.h
index 2745520ae3544ef3db6148dd5a646f53a8327d80..29898953e6667056e653562950d36514c4a60d42 100644
--- a/include/os/osEnv.h
+++ b/include/os/osEnv.h
@@ -16,28 +16,37 @@
#ifndef _TD_OS_ENV_H_
#define _TD_OS_ENV_H_
+#include "osSysinfo.h"
+
#ifdef __cplusplus
extern "C" {
#endif
-extern char tsOsName[];
+typedef struct SOsEnv SOsEnv;
-extern char tsDataDir[];
-extern char tsLogDir[];
-extern char tsTempDir[];
extern char configDir[];
-extern struct SDiskSpace tsLogSpace;
-extern struct SDiskSpace tsTempSpace;
-extern struct SDiskSpace tsDataSpace;
-
-void taosUpdateLogSpace();
-void taosUpdateTempSpace();
-void taosUpdateDataSpace();
-bool taosLogSpaceAvailable();
-bool taosTmpSpaceAvailable();
-bool taosDataSpaceAvailable();
-void taosUpdateAllSpace();
+void osInit();
+void osUpdate();
+
+bool osLogSpaceAvailable();
+int8_t osDaylight();
+
+const char *osLogDir();
+const char *osTempDir();
+const char *osDataDir();
+const char *osName();
+const char *osTimezone();
+const char *osLocale();
+const char *osCharset();
+
+void osSetLogDir(const char *logDir);
+void osSetTempDir(const char *tempDir);
+void osSetDataDir(const char *dataDir);
+void osSetLogReservedSpace(float sizeInGB);
+void osSetTempReservedSpace(float sizeInGB);
+void osSetDataReservedSpace(float sizeInGB);
+void osSetTimezone(const char *timezone);
#ifdef __cplusplus
}
diff --git a/include/common/ttimezone.h b/include/os/osLocale.h
similarity index 70%
rename from include/common/ttimezone.h
rename to include/os/osLocale.h
index cc50a29d57a2f1a308b8b236fc7bb80122adb387..6e313eb8cde14e67f56a9e8334239ca714b88afd 100644
--- a/include/common/ttimezone.h
+++ b/include/os/osLocale.h
@@ -13,17 +13,22 @@
* along with this program. If not, see .
*/
-#ifndef _TD_COMMON_TIMEZONE_H_
-#define _TD_COMMON_TIMEZONE_H_
+#ifndef _TD_OS_LOCALE_H_
+#define _TD_OS_LOCALE_H_
+
+#include "os.h"
+#include "osString.h"
#ifdef __cplusplus
extern "C" {
#endif
-void tsSetTimeZone();
+char *taosCharsetReplace(char *charsetstr);
+void taosGetSystemLocale(char *outLocale, char *outCharset);
+void taosSetSystemLocale(const char *inLocale, const char *inCharSet);
#ifdef __cplusplus
}
#endif
-#endif /*_TD_COMMON_TIMEZONE_H_*/
+#endif /*_TD_OS_LOCALE_H_*/
diff --git a/include/os/osString.h b/include/os/osString.h
index 582411d4440e7b1539c4b926413c7ed9751dfe62..88160dd69e419450d1ec481a83a28065df99186d 100644
--- a/include/os/osString.h
+++ b/include/os/osString.h
@@ -45,7 +45,6 @@ int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs);
bool taosMbsToUcs4(const char *mbs, size_t mbs_len, char *ucs4, int32_t ucs4_max_len, int32_t *len);
int32_t tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int32_t bytes, int8_t ncharSize);
bool taosValidateEncodec(const char *encodec);
-char * taosCharsetReplace(char *charsetstr);
#ifdef __cplusplus
}
diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h
index 6ab2a104dfb3bc7e81a03e446e64506fdcca6a30..64362603fea44648d159b1b2e3491c245066672f 100644
--- a/include/os/osSysinfo.h
+++ b/include/os/osSysinfo.h
@@ -21,9 +21,10 @@ extern "C" {
#endif
#include "os.h"
-
-#define TSDB_LOCALE_LEN 64
-#define TSDB_TIMEZONE_LEN 96
+
+#define TD_LOCALE_LEN 64
+#define TD_CHARSET_LEN 64
+#define TD_TIMEZONE_LEN 96
typedef struct {
int64_t total;
@@ -41,9 +42,6 @@ extern int64_t tsOpenMax;
extern int64_t tsStreamMax;
extern int32_t tsNumOfCores;
extern int32_t tsTotalMemoryMB;
-extern char tsTimezone[];
-extern char tsLocale[];
-extern char tsCharset[]; // default encode string
diff --git a/include/common/tlocale.h b/include/os/osTimezone.h
similarity index 75%
rename from include/common/tlocale.h
rename to include/os/osTimezone.h
index d809c75d67983fb6ac844a656a361876ea7d3504..ff015ef0b1221eeba361818f5e010bd7f43fb0fd 100644
--- a/include/common/tlocale.h
+++ b/include/os/osTimezone.h
@@ -13,17 +13,18 @@
* along with this program. If not, see .
*/
-#ifndef _TD_COMMON_LOCALE_H_
-#define _TD_COMMON_LOCALE_H_
+#ifndef _TD_OS_TIMEZONE_H_
+#define _TD_OS_TIMEZONE_H_
#ifdef __cplusplus
extern "C" {
#endif
-void tsSetLocale();
+void taosGetSystemTimezone(char *outTimezone);
+void taosSetSystemTimezone(const char *inTimezone, char *outTimezone, int8_t *outDaylight);
#ifdef __cplusplus
}
-#endif /*_TD_COMMON_LOCALE_H_*/
-
#endif
+
+#endif /*_TD_OS_TIMEZONE_H_*/
diff --git a/source/client/src/clientCfg.c b/source/client/src/clientCfg.c
index 826626fd778361f3f5660c1c9680d04837ff5a26..d1dafbed5c9a3fd0726a813711cef4da598dbb11 100644
--- a/source/client/src/clientCfg.c
+++ b/source/client/src/clientCfg.c
@@ -67,7 +67,7 @@ static int32_t tscAddLogCfg(SConfig *pCfg) {
}
static int32_t tscSetLogCfg(SConfig *pCfg) {
- tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX);
+ osSetLogDir(cfgGetItem(pCfg, "logDir")->str);
tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval;
tsNumOfLogLines = cfgGetItem(pCfg, "numOfLogLines")->i32;
tsLogKeepDays = cfgGetItem(pCfg, "logKeepDays")->i32;
@@ -146,7 +146,7 @@ static int32_t tscAddCfg(SConfig *pCfg) {
// if (cfgAddString(pCfg, "gitinfo", gitinfo) != 0) return -1;
// if (cfgAddString(pCfg, "version", version) != 0) return -1;
- // if (cfgAddDir(pCfg, "dataDir", tsDataDir) != 0) return -1;
+ // if (cfgAddDir(pCfg, "dataDir", osDataDir()) != 0) return -1;
if (cfgAddTimezone(pCfg, "timezone", "") != 0) return -1;
if (cfgAddLocale(pCfg, "locale", "") != 0) return -1;
if (cfgAddCharset(pCfg, "charset", "") != 0) return -1;
diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c
index 1ab05f53f3193895c5c56147e401a89c8856652e..f07048efbc0ed151ca63dbe782626d7078105a37 100644
--- a/source/client/src/clientEnv.c
+++ b/source/client/src/clientEnv.c
@@ -25,7 +25,6 @@
#include "tref.h"
#include "trpc.h"
#include "ttime.h"
-#include "ttimezone.h"
#define TSC_VAR_NOT_RELEASE 1
#define TSC_VAR_RELEASED 0
@@ -300,7 +299,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
assert(cfg != NULL);
size_t len = strlen(str);
- if (len == 0 || len > TSDB_LOCALE_LEN) {
+ if (len == 0 || len > TD_LOCALE_LEN) {
tscInfo("Invalid locale:%s, use default", str);
return -1;
}
@@ -318,7 +317,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
return -1;
}
- tstrncpy(tsLocale, defaultLocale, TSDB_LOCALE_LEN);
+ tstrncpy(tsLocale, defaultLocale, TD_LOCALE_LEN);
}
// set the user specified locale
@@ -332,7 +331,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
tscInfo("failed to set locale:%s, current locale:%s", str, tsLocale);
}
- tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
+ tstrncpy(tsLocale, locale, TD_LOCALE_LEN);
char *charset = strrchr(tsLocale, sep);
if (charset != NULL) {
@@ -347,7 +346,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
tscInfo("charset changed from %s to %s", tsCharset, charset);
}
- tstrncpy(tsCharset, charset, TSDB_LOCALE_LEN);
+ tstrncpy(tsCharset, charset, TD_LOCALE_LEN);
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
} else {
@@ -371,7 +370,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
assert(cfg != NULL);
size_t len = strlen(str);
- if (len == 0 || len > TSDB_LOCALE_LEN) {
+ if (len == 0 || len > TD_LOCALE_LEN) {
tscInfo("failed to set charset:%s", str);
return -1;
}
@@ -384,7 +383,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
tscInfo("charset changed from %s to %s", tsCharset, str);
}
- tstrncpy(tsCharset, str, TSDB_LOCALE_LEN);
+ tstrncpy(tsCharset, str, TD_LOCALE_LEN);
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
} else {
tscInfo("charset:%s not valid", str);
@@ -402,7 +401,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) {
assert(cfg != NULL);
if (cfg->cfgStatus <= TAOS_CFG_CSTATUS_OPTION) {
- tstrncpy(tsTimezone, str, TSDB_TIMEZONE_LEN);
+ tstrncpy(tsTimezone, str, TD_TIMEZONE_LEN);
tsSetTimeZone();
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
tscDebug("timezone set:%s, input:%s by taos_options", tsTimezone, str);
diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c
index ce8be66e826f2fe85f86a191834f90e500a0b369..b4c9efd77d6a93ea755cfa0902e54eb6a38561e9 100644
--- a/source/common/src/tglobal.c
+++ b/source/common/src/tglobal.c
@@ -21,15 +21,12 @@
#include "tcompare.h"
#include "tep.h"
#include "tglobal.h"
-#include "tlocale.h"
#include "tlog.h"
-#include "ttimezone.h"
#include "tutil.h"
#include "ulog.h"
// common
-int8_t tsDaylight = 0;
int32_t tsMaxBinaryDisplayWidth = 30;
int8_t tsEnableSlaveQuery = 1;
int8_t tsEnableAdjustMaster = 1;
@@ -235,7 +232,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "dataDir";
- cfg.ptr = tsDataDir;
+ cfg.ptr = osDataDir();
cfg.valType = TAOS_CFG_VTYPE_DATA_DIRCTORY;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
cfg.minValue = 0;
@@ -419,7 +416,7 @@ static void doInitGlobalConfig(void) {
taosAddConfigOption(cfg);
cfg.option = "tempDir";
- cfg.ptr = tsTempDir;
+ cfg.ptr = osTempDir();
cfg.valType = TAOS_CFG_VTYPE_STRING;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_CLIENT;
cfg.minValue = 0;
diff --git a/source/common/src/tlocale.c b/source/common/src/tlocale.c
deleted file mode 100644
index 1f2b9cd4b15cd7b633847d392d5cf570b834279a..0000000000000000000000000000000000000000
--- a/source/common/src/tlocale.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * 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 .
- */
-
-#define _DEFAULT_SOURCE
-#include "os.h"
-#include "ulog.h"
-#include "tglobal.h"
-#include "tutil.h"
-
-/**
- * In some Linux systems, setLocale(LC_CTYPE, "") may return NULL, in which case the launch of
- * both the TDengine Server and the Client may be interrupted.
- *
- * In case that the setLocale failed to be executed, the right charset needs to be set.
- */
-void tsSetLocale() {
- char *locale = setlocale(LC_CTYPE, tsLocale);
-
- // default locale or user specified locale is not valid, abort launch
- if (locale == NULL) {
- uError("Invalid locale:%s, please set the valid locale in config file", tsLocale);
- }
-
- if (strlen(tsCharset) == 0) {
- uError("failed to get charset, please set the valid charset in config file");
- exit(-1);
- }
-
- if (!taosValidateEncodec(tsCharset)) {
- uError("Invalid charset:%s, please set the valid charset in config file", tsCharset);
- exit(-1);
- }
-}
\ No newline at end of file
diff --git a/source/common/src/ttszip.c b/source/common/src/ttszip.c
index 6d57992c35bab4b8cea04888f1cf78ab9417bcb2..3265ea55476025e14357e0c7b021d93416faf763 100644
--- a/source/common/src/ttszip.c
+++ b/source/common/src/ttszip.c
@@ -23,7 +23,7 @@ STSBuf* tsBufCreate(bool autoDelete, int32_t order) {
pTSBuf->autoDelete = autoDelete;
- taosGetTmpfilePath(tsTempDir, "join", pTSBuf->path);
+ taosGetTmpfilePath(osTempDir(), "join", pTSBuf->path);
pTSBuf->f = fopen(pTSBuf->path, "wb+");
if (pTSBuf->f == NULL) {
free(pTSBuf);
diff --git a/source/dnode/mgmt/daemon/src/dmnCfg.c b/source/dnode/mgmt/daemon/src/dmnCfg.c
index 52aa22a53323a944b2074d44000c7f164c8c4b15..65c3e67d974940448eb9f7d40bca432e6543d79a 100644
--- a/source/dnode/mgmt/daemon/src/dmnCfg.c
+++ b/source/dnode/mgmt/daemon/src/dmnCfg.c
@@ -15,8 +15,6 @@
#define _DEFAULT_SOURCE
#include "dmnInt.h"
-#include "tlocale.h"
-#include "ttimezone.h"
static int32_t dmnAddEpCfg(SConfig *pCfg) {
char defaultFqdn[TSDB_FQDN_LEN] = {0};
@@ -40,18 +38,18 @@ static int32_t dmnAddEpCfg(SConfig *pCfg) {
}
static int32_t dmnAddDirCfg(SConfig *pCfg) {
- if (cfgAddDir(pCfg, "dataDir", tsDataDir) != 0) return -1;
- if (cfgAddDir(pCfg, "tempDir", tsTempDir) != 0) return -1;
+ if (cfgAddDir(pCfg, "dataDir", osDataDir()) != 0) return -1;
+ if (cfgAddDir(pCfg, "tempDir", osTempDir()) != 0) return -1;
if (cfgAddFloat(pCfg, "minimalDataDirGB", 2.0f, 0.001f, 10000000) != 0) return -1;
if (cfgAddFloat(pCfg, "minimalTempDirGB", 1.0f, 0.001f, 10000000) != 0) return -1;
return 0;
}
static int32_t dmnCheckDirCfg(SConfig *pCfg) {
- tstrncpy(tsDataDir, cfgGetItem(pCfg, "dataDir")->str, PATH_MAX);
- tstrncpy(tsTempDir, cfgGetItem(pCfg, "tempDir")->str, PATH_MAX);
- tsDataSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
- tsTempSpace.reserved = cfgGetItem(pCfg, "minimalTempDirGB")->fval;
+ osSetDataDir(cfgGetItem(pCfg, "dataDir")->str);
+ osSetTempDir(cfgGetItem(pCfg, "tempDir")->str);
+ osSetTempReservedSpace(cfgGetItem(pCfg, "minimalDataDirGB")->fval);
+ osSetDataReservedSpace(cfgGetItem(pCfg, "minimalTempDirGB")->fval);
return 0;
}
@@ -86,18 +84,25 @@ static int32_t dmnAddDnodeCfg(SConfig *pCfg) {
return 0;
}
+static void dmnSetDnodeCfg(SConfig *pCfg) {
+ SConfigItem *pItem = cfgGetItem(pCfg, "timezone");
+ osSetTimezone(pItem->str);
+ uDebug("timezone format changed from %s to %s", pItem->str, osTimezone());
+ cfgSetItem(pCfg, "timezone", osTimezone(), pItem->stype);
+}
+
static int32_t dmnCheckCfg(SConfig *pCfg) {
bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
taosSetCoreDump(enableCore);
+ dmnSetDnodeCfg(pCfg);
+
if (dmnCheckDirCfg(pCfg) != 0) {
return -1;
}
taosGetSystemInfo();
- tsSetTimeZone();
- tsSetLocale();
if (tsNumOfCores <= 0) {
tsNumOfCores = 1;
diff --git a/source/dnode/mgmt/daemon/src/dmnLog.c b/source/dnode/mgmt/daemon/src/dmnLog.c
index 22a7d7b080a99d0d7773431b4a880187ede74811..147357c845fd675843f4f8fcb3b25c9b76f03614 100644
--- a/source/dnode/mgmt/daemon/src/dmnLog.c
+++ b/source/dnode/mgmt/daemon/src/dmnLog.c
@@ -17,7 +17,7 @@
#include "dmnInt.h"
int32_t dmnAddLogCfg(SConfig *pCfg) {
- if (cfgAddDir(pCfg, "logDir", "/var/log/taos") != 0) return -1;
+ if (cfgAddDir(pCfg, "logDir", osLogDir()) != 0) return -1;
if (cfgAddFloat(pCfg, "minimalLogDirGB", 1.0f, 0.001f, 10000000) != 0) return -1;
if (cfgAddBool(pCfg, "asyncLog", 1) != 0) return -1;
if (cfgAddInt32(pCfg, "numOfLogLines", 10000000, 1000, 2000000000) != 0) return -1;
@@ -41,8 +41,8 @@ int32_t dmnAddLogCfg(SConfig *pCfg) {
}
int32_t dmnSetLogCfg(SConfig *pCfg) {
- tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX);
- tsLogSpace.reserved = cfgGetItem(pCfg, "minimalLogDirGB")->fval;
+ osSetLogDir(cfgGetItem(pCfg, "logDir")->str);
+ osSetLogReservedSpace(cfgGetItem(pCfg, "minimalLogDirGB")->fval);
tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval;
tsNumOfLogLines = cfgGetItem(pCfg, "numOfLogLines")->i32;
tsLogKeepDays = cfgGetItem(pCfg, "logKeepDays")->i32;
diff --git a/source/dnode/mgmt/daemon/src/dmnMain.c b/source/dnode/mgmt/daemon/src/dmnMain.c
index 1f1d2d8d052ac4257c3a307929d66933a2843a3b..62f0db5fc52f982870153c8708ae15ef5f3cfb32 100644
--- a/source/dnode/mgmt/daemon/src/dmnMain.c
+++ b/source/dnode/mgmt/daemon/src/dmnMain.c
@@ -97,6 +97,8 @@ int32_t dmnRunDnode(SConfig *pCfg) {
}
int main(int argc, char const *argv[]) {
+ osInit();
+
if (dmnParseOption(argc, argv) != 0) {
return -1;
}
diff --git a/source/dnode/mgmt/impl/src/dndMgmt.c b/source/dnode/mgmt/impl/src/dndMgmt.c
index 1748c52c66b614c5e8304a8cb9be6c462c37c347..b7f42fb465623687f468bb51874d1520f17abc7b 100644
--- a/source/dnode/mgmt/impl/src/dndMgmt.c
+++ b/source/dnode/mgmt/impl/src/dndMgmt.c
@@ -371,9 +371,9 @@ void dndSendStatusReq(SDnode *pDnode) {
req.clusterCfg.checkTime = 0;
char timestr[32] = "1970-01-01 00:00:00.00";
(void)taosParseTime(timestr, &req.clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
- memcpy(req.clusterCfg.timezone, pDnode->env.timezone, TSDB_TIMEZONE_LEN);
- memcpy(req.clusterCfg.locale, pDnode->env.locale, TSDB_LOCALE_LEN);
- memcpy(req.clusterCfg.charset, pDnode->env.charset, TSDB_LOCALE_LEN);
+ memcpy(req.clusterCfg.timezone, pDnode->env.timezone, TD_TIMEZONE_LEN);
+ memcpy(req.clusterCfg.locale, pDnode->env.locale, TD_LOCALE_LEN);
+ memcpy(req.clusterCfg.charset, pDnode->env.charset, TD_LOCALE_LEN);
taosRUnLockLatch(&pMgmt->latch);
req.pVloads = taosArrayInit(TSDB_MAX_VNODES, sizeof(SVnodeLoad));
diff --git a/source/dnode/mgmt/impl/test/sut/src/sut.cpp b/source/dnode/mgmt/impl/test/sut/src/sut.cpp
index 9863fd9f54e7879df574c1e343387a35e9a0184f..5d2abd86c35cbe3a2ef8e227c131dc58b416782d 100644
--- a/source/dnode/mgmt/impl/test/sut/src/sut.cpp
+++ b/source/dnode/mgmt/impl/test/sut/src/sut.cpp
@@ -33,7 +33,7 @@ void Testbase::InitLog(const char* path) {
taosRemoveDir(path);
taosMkDir(path);
- tstrncpy(tsLogDir, path, PATH_MAX);
+ osSetLogDir(path);
if (taosInitLog("taosdlog", 1) != 0) {
printf("failed to init log file\n");
}
diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp
index ebe20fbb7fb9053463b265ffd1442527e35f1e3c..9dfe6eac3fcc06e8210191513057e35398cd1526 100644
--- a/source/libs/catalog/test/catalogTests.cpp
+++ b/source/libs/catalog/test/catalogTests.cpp
@@ -132,7 +132,7 @@ void ctgTestInitLogFile() {
ctgDbgEnableDebug("api");
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
- printf("failed to open log file in directory:%s\n", tsLogDir);
+ printf("failed to open log file in directory:%s\n", osLogDir());
}
}
diff --git a/source/libs/config/src/config.c b/source/libs/config/src/config.c
index 17a652d2b5a7cb509af2d93798faf7594b25a00a..b23826ceacc696669af94c2dbc729897e2fa5efd 100644
--- a/source/libs/config/src/config.c
+++ b/source/libs/config/src/config.c
@@ -16,9 +16,7 @@
#define _DEFAULT_SOURCE
#include "cfgInt.h"
#include "tep.h"
-#include "tlocale.h"
#include "tmsg.h"
-#include "ttimezone.h"
#define CFG_NAME_PRINT_LEN 22
#define CFG_SRC_PRINT_LEN 12
@@ -593,16 +591,16 @@ void cfgDumpCfg(SConfig *pCfg) {
// pItem = cfgGetItem(pCfg, "dataDir");
// if (pItem != NULL) {
-// tstrncpy(tsDataDir, pItem->str, PATH_MAX);
+// tstrncpy(osDataDir(), pItem->str, PATH_MAX);
// }
// if (tsDiskCfgNum <= 0) {
-// taosAddDataDir(0, tsDataDir, 0, 1);
+// taosAddDataDir(0, osDataDir(), 0, 1);
// tsDiskCfgNum = 1;
-// uTrace("dataDir:%s, level:0 primary:1 is configured by default", tsDataDir);
+// uTrace("dataDir:%s, level:0 primary:1 is configured by default", osDataDir());
// }
-// if (taosDirExist(tsTempDir) != 0) {
+// if (taosDirExist(osTempDir()) != 0) {
// return -1;
// }
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 62c0e3623fbd520bf0e791d5623cf3f3e5e28804..cc05d433eb013b32abaed70290fbdeb0b7208584 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -4629,7 +4629,7 @@ int32_t doInitQInfo(SQInfo* pQInfo, STSBuf* pTsBuf, void* tsdb, void* sourceOptr
getIntermediateBufInfo(pRuntimeEnv, &ps, &pQueryAttr->intermediateResultRowSize);
int32_t TENMB = 1024*1024*10;
- int32_t code = createDiskbasedBuffer(&pRuntimeEnv->pResultBuf, ps, TENMB, pQInfo->qId, tsTempDir);
+ int32_t code = createDiskbasedBuffer(&pRuntimeEnv->pResultBuf, ps, TENMB, pQInfo->qId, osTempDir());
if (code != TSDB_CODE_SUCCESS) {
return code;
}
diff --git a/source/libs/function/src/tpercentile.c b/source/libs/function/src/tpercentile.c
index 40731adc58326da548bd53d4de6f2825efeff021..e58cdf8802d7aa48d02e87eb07d2319b60e98a0d 100644
--- a/source/libs/function/src/tpercentile.c
+++ b/source/libs/function/src/tpercentile.c
@@ -254,7 +254,7 @@ tMemBucket *tMemBucketCreate(int16_t nElemSize, int16_t dataType, double minval,
resetSlotInfo(pBucket);
- int32_t ret = createDiskbasedBuffer(&pBucket->pBuffer, pBucket->bufPageSize, pBucket->bufPageSize * 512, 1, tsTempDir);
+ int32_t ret = createDiskbasedBuffer(&pBucket->pBuffer, pBucket->bufPageSize, pBucket->bufPageSize * 512, 1, osTempDir());
if (ret != 0) {
tMemBucketDestroy(pBucket);
return NULL;
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index b65e637a57496486919f0114dd633077f337d8d1..98bcf189b0809ff385517f3507825d378f59324a 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -55,7 +55,7 @@ int32_t initUdfInfo(SUdfInfo* pUdfInfo) {
} else {
char path[PATH_MAX] = {0};
- taosGetTmpfilePath("script", path, tsTempDir);
+ taosGetTmpfilePath("script", path, osTempDir());
FILE* file = fopen(path, "w+");
diff --git a/source/libs/index/test/fstUT.cc b/source/libs/index/test/fstUT.cc
index d59a3428da2ca377444234d77850ea4d7afadb26..0e16f57f58876369911948785ed328e028162a43 100644
--- a/source/libs/index/test/fstUT.cc
+++ b/source/libs/index/test/fstUT.cc
@@ -30,7 +30,7 @@ static void EnvInit() {
taosRemoveDir(path.c_str());
taosMkDir(path.c_str());
// init log file
- tstrncpy(tsLogDir, path.c_str(), PATH_MAX);
+ osSetLogDir( path.c_str());
if (taosInitLog("tindex.idx", 1) != 0) {
printf("failed to init log");
}
diff --git a/source/libs/parser/src/insertParser.c b/source/libs/parser/src/insertParser.c
index 745982e869c6bf092babd2369fd2420f9a99c2b4..a88f679655b31bdf487428f892dc61751ab338b9 100644
--- a/source/libs/parser/src/insertParser.c
+++ b/source/libs/parser/src/insertParser.c
@@ -204,7 +204,7 @@ static int parseTime(char **end, SToken *pToken, int16_t timePrec, int64_t *time
bool isSigned = false;
toInteger(pToken->z, pToken->n, 10, &ts, &isSigned);
} else { // parse the RFC-3339/ISO-8601 timestamp format string
- if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
+ if (taosParseTime(pToken->z, time, pToken->n, timePrec, osDaylight()) != TSDB_CODE_SUCCESS) {
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
}
diff --git a/source/libs/parser/src/parserImpl.c b/source/libs/parser/src/parserImpl.c
index ef040fdff47ff925acfbdc08071147d2eb56bf74..8e29f66c574eddafaec8b0507da06b180dbcc468 100644
--- a/source/libs/parser/src/parserImpl.c
+++ b/source/libs/parser/src/parserImpl.c
@@ -578,7 +578,7 @@ static EDealRes translateValue(STranslateContext* pCxt, SValueNode* pVal) {
return DEAL_RES_ERROR;
}
int32_t len = trimStringCopy(pVal->literal, n, tmp);
- if (taosParseTime(tmp, &pVal->datum.i, len, pVal->node.resType.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
+ if (taosParseTime(tmp, &pVal->datum.i, len, pVal->node.resType.precision, osDaylight()) != TSDB_CODE_SUCCESS) {
tfree(tmp);
generateSyntaxErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
return DEAL_RES_ERROR;
diff --git a/source/libs/parser/src/parserUtil.c b/source/libs/parser/src/parserUtil.c
index ec68980c447ac5324660779949533d0826480480..2647806e03ad796c94a4cda6ace4dfd8acf0ee58 100644
--- a/source/libs/parser/src/parserUtil.c
+++ b/source/libs/parser/src/parserUtil.c
@@ -1639,7 +1639,7 @@ static int parseTime(char **end, SToken *pToken, int16_t timePrec, int64_t *time
bool isSigned = false;
toInteger(pToken->z, pToken->n, 10, &ts, &isSigned);
} else { // parse the RFC-3339/ISO-8601 timestamp format string
- if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
+ if (taosParseTime(pToken->z, time, pToken->n, timePrec, osDaylight()) != TSDB_CODE_SUCCESS) {
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
}
diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp
index 8ad5a76388e45c10aee8df05f91629338d7a0f02..d8df9a81c4f8a0480ce775ec8d62ffd764de2117 100644
--- a/source/libs/qworker/test/qworkerTests.cpp
+++ b/source/libs/qworker/test/qworkerTests.cpp
@@ -102,7 +102,7 @@ void qwtInitLogFile() {
qDebugFlag = 159;
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
- printf("failed to open log file in directory:%s\n", tsLogDir);
+ printf("failed to open log file in directory:%s\n", osLogDir());
}
}
diff --git a/source/libs/scalar/test/filter/filterTests.cpp b/source/libs/scalar/test/filter/filterTests.cpp
index a159263804d3c201d914a2ffb9600beb3aef6944..d27fe2c25ff7dbeb93dccae165ae4db042443ca2 100644
--- a/source/libs/scalar/test/filter/filterTests.cpp
+++ b/source/libs/scalar/test/filter/filterTests.cpp
@@ -53,7 +53,7 @@ void flttInitLogFile() {
qDebugFlag = 159;
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
- printf("failed to open log file in directory:%s\n", tsLogDir);
+ printf("failed to open log file in directory:%s\n", osLogDir());
}
}
diff --git a/source/libs/scalar/test/scalar/scalarTests.cpp b/source/libs/scalar/test/scalar/scalarTests.cpp
index 24bc8eaf40bb4a5603eeb7dee40d39ba0070f59c..de2c7f587468ac36ca06db602967cadc0136d181 100644
--- a/source/libs/scalar/test/scalar/scalarTests.cpp
+++ b/source/libs/scalar/test/scalar/scalarTests.cpp
@@ -52,7 +52,7 @@ void scltInitLogFile() {
qDebugFlag = 159;
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
- printf("failed to open log file in directory:%s\n", tsLogDir);
+ printf("failed to open log file in directory:%s\n", osLogDir());
}
}
diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp
index 89d365a7e7fe2410a5cfa8e3e7168b28f096540d..70684412ee28d88a32d67f47301453dacd84c02b 100644
--- a/source/libs/scheduler/test/schedulerTests.cpp
+++ b/source/libs/scheduler/test/schedulerTests.cpp
@@ -67,7 +67,7 @@ void schtInitLogFile() {
qDebugFlag = 159;
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
- printf("failed to open log file in directory:%s\n", tsLogDir);
+ printf("failed to open log file in directory:%s\n", osLogDir());
}
}
diff --git a/source/libs/transport/test/transUT.cc b/source/libs/transport/test/transUT.cc
index f5b3ed4c3203808718090c27af8fb073bd6c81f5..8a8a6de5e12895c1d161e59541e11039c872a8cc 100644
--- a/source/libs/transport/test/transUT.cc
+++ b/source/libs/transport/test/transUT.cc
@@ -155,7 +155,7 @@ class TransObj {
taosRemoveDir(path.c_str());
taosMkDir(path.c_str());
- tstrncpy(tsLogDir, path.c_str(), PATH_MAX);
+ osSetLogDir(path.c_str());
if (taosInitLog("taosdlog", 1) != 0) {
printf("failed to init log file\n");
}
diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c
index 8fee6a6f7dab26d7a10586b58e67f0762c79b416..c464073e5faeb6a9a08da886268f469189b2fbf1 100644
--- a/source/os/src/osDir.c
+++ b/source/os/src/osDir.c
@@ -71,7 +71,7 @@ int32_t taosMkDir(const char *dirname) {
return code;
}
-void taosRemoveOldFiles(char *dirname, int32_t keepDays) {
+void taosRemoveOldFiles(const char *dirname, int32_t keepDays) {
DIR *dir = opendir(dirname);
if (dir == NULL) return;
diff --git a/source/os/src/osEnv.c b/source/os/src/osEnv.c
index 7417c6ff8443af4a2da8ebb8bd1c339f72323ed7..6fad7e4f3265fa65a106b022f84cb403b9e6a387 100644
--- a/source/os/src/osEnv.c
+++ b/source/os/src/osEnv.c
@@ -13,77 +13,100 @@
* along with this program. If not, see .
*/
-
#define _DEFAULT_SOURCE
-#include "os.h"
#include "osEnv.h"
-#include "osSysinfo.h"
-
-SDiskSpace tsLogSpace;
-SDiskSpace tsTempSpace;
-SDiskSpace tsDataSpace;
-
-void taosUpdateLogSpace() { taosGetDiskSize(tsLogDir, &tsLogSpace.size); }
-
-void taosUpdateTempSpace() { taosGetDiskSize(tsTempDir, &tsTempSpace.size); }
-
-void taosUpdateDataSpace() { taosGetDiskSize(tsDataDir, &tsDataSpace.size); }
-
-bool taosLogSpaceAvailable() { return tsLogSpace.reserved < tsLogSpace.size.avail; }
-
-bool taosTempSpaceAvailable() { return tsTempSpace.reserved < tsTempSpace.size.avail; }
-bool taosDataSpaceAvailable() { return tsDataSpace.reserved < tsDataSpace.size.avail; }
-
-void taosUpdateAllSpace() {
- taosUpdateLogSpace();
- taosUpdateTempSpace();
- taosUpdateDataSpace();
+extern void taosWinSocketInit();
+char configDir[PATH_MAX] = {0};
+
+typedef struct SOsEnv {
+ char dataDir[PATH_MAX];
+ char logDir[PATH_MAX];
+ char tempDir[PATH_MAX];
+ SDiskSpace dataSpace;
+ SDiskSpace logSpace;
+ SDiskSpace tempSpace;
+ char osName[16];
+ char timezone[TD_TIMEZONE_LEN];
+ char locale[TD_LOCALE_LEN];
+ char charset[TD_CHARSET_LEN];
+ int8_t daylight;
+} SOsEnv;
+
+static SOsEnv env = {0};
+
+SOsEnv *osEnv() { return &env; }
+
+void osInitImp() {
+ taosGetSystemLocale(env.locale, env.charset);
+ taosGetSystemTimezone(env.timezone);
+ osSetTimezone(env.timezone);
}
-#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
-
-char tsOsName[10] = "Windows";
-char configDir[PATH_MAX] = "C:/TDengine/cfg";
-char tsDataDir[PATH_MAX] = "C:/TDengine/data";
-char tsLogDir[PATH_MAX] = "C:/TDengine/log";
-char tsTempDir[PATH_MAX] = "C:\\Windows\\Temp";
+void osUpdate() {
+ if (env.logDir[0] != 0) {
+ taosGetDiskSize(env.logDir, &env.logSpace.size);
+ }
+ if (env.dataDir[0] != 0) {
+ taosGetDiskSize(env.dataDir, &env.dataSpace.size);
+ }
+ if (env.tempDir[0] != 0) {
+ taosGetDiskSize(env.tempDir, &env.tempSpace.size);
+ }
+}
-extern taosWinSocketInit();
+bool osLogSpaceAvailable() { return env.logSpace.reserved <= env.logSpace.size.avail; }
+int8_t osDaylight() { return env.daylight; }
+
+const char *osLogDir() { return env.logDir; }
+const char *osTempDir() { return env.tempDir; }
+const char *osDataDir() { return env.dataDir; }
+const char *osName() { return env.osName; }
+const char *osTimezone() { return env.timezone; }
+const char *osLocale() { return env.locale; }
+const char *osCharset() { return env.charset; }
+
+void osSetLogDir(const char *logDir) { tstrncpy(env.logDir, logDir, PATH_MAX); }
+void osSetTempDir(const char *tempDir) { tstrncpy(env.tempDir, tempDir, PATH_MAX); }
+void osSetDataDir(const char *dataDir) { tstrncpy(env.dataDir, dataDir, PATH_MAX); }
+void osSetLogReservedSpace(float sizeInGB) { env.logSpace.reserved = sizeInGB; }
+void osSetTempReservedSpace(float sizeInGB) { env.tempSpace.reserved = sizeInGB; }
+void osSetDataReservedSpace(float sizeInGB) { env.dataSpace.reserved = sizeInGB; }
+void osSetTimezone(const char *timezone) { taosSetSystemTimezone(timezone, env.timezone, &env.daylight); }
void osInit() {
+ srand(taosSafeRand());
+
+#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
taosWinSocketInit();
const char *tmpDir = getenv("tmp");
if (tmpDir == NULL) {
tmpDir = getenv("temp");
}
-
if (tmpDir != NULL) {
- strcpy(tsTempDir, tmpDir);
+ strcpy(env.tempDir, tmpDir);
}
-}
-
-#elif defined(_TD_DARWIN_64)
-char tsOsName[10] = "Darwin";
-char configDir[PATH_MAX] = "/usr/local/etc/taos";
-char tsDataDir[PATH_MAX] = "/usr/local/var/lib/taos";
-char tsLogDir[PATH_MAX] = "/usr/local/var/log/taos";
-char tsTempDir[PATH_MAX] = "/tmp/taosd";
+ strcpy(configDir, "C:\\TDengine\\cfg");
+ strcpy(env.dataDir, "C:\\TDengine\\data");
+ strcpy(env.logDir, "C:\\TDengine\\log");
+ strcpy(env.tempDir, "C:\\Windows\\Temp");
+ strcpy(env.osName, "Windows");
-void osInit() {}
+#elif defined(_TD_DARWIN_64)
+ strcpy(configDir, "/tmp/taosd");
+ strcpy(env.dataDir, "/usr/local/var/lib/taos");
+ strcpy(env.logDir, "/usr/local/var/log/taos");
+ strcpy(env.tempDir, "/usr/local/etc/taos");
+ strcpy(env.osName, "Darwin");
#else
-
-char tsOsName[10] = "Linux";
-char configDir[PATH_MAX] = "/etc/taos";
-char tsDataDir[PATH_MAX] = "/var/lib/taos";
-char tsLogDir[PATH_MAX] = "/var/log/taos";
-char tsTempDir[PATH_MAX] = "/tmp/";
-
-void osInit() {
- srand(taosSafeRand());
-}
+ strcpy(configDir, "/etc/taos");
+ strcpy(env.dataDir, "/var/lib/taos");
+ strcpy(env.logDir, "/var/log/taos");
+ strcpy(env.tempDir, "/tmp");
+ strcpy(env.osName, "Linux");
#endif
+}
\ No newline at end of file
diff --git a/source/os/src/osLocale.c b/source/os/src/osLocale.c
new file mode 100644
index 0000000000000000000000000000000000000000..e006a337a0817a9f94d0d694ead331c20d4a1dff
--- /dev/null
+++ b/source/os/src/osLocale.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#define _DEFAULT_SOURCE
+#include "osLocale.h"
+
+#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
+#if (_WIN64)
+#include
+#include
+#include
+#include
+#include
+#include
+#pragma comment(lib, "Mswsock.lib ")
+#endif
+#include
+#pragma warning(push)
+#pragma warning(disable : 4091)
+#include
+#pragma warning(pop)
+#elif defined(_TD_DARWIN_64)
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#endif
+
+typedef struct CharsetPair {
+ char *oldCharset;
+ char *newCharset;
+} CharsetPair;
+
+char *taosCharsetReplace(char *charsetstr) {
+ CharsetPair charsetRep[] = {
+ {"utf8", "UTF-8"},
+ {"936", "CP936"},
+ };
+
+ for (int32_t i = 0; i < tListLen(charsetRep); ++i) {
+ if (strcasecmp(charsetRep[i].oldCharset, charsetstr) == 0) {
+ return strdup(charsetRep[i].newCharset);
+ }
+ }
+
+ return strdup(charsetstr);
+}
+
+/**
+ * In some Linux systems, setLocale(LC_CTYPE, "") may return NULL, in which case the launch of
+ * both the TDengine Server and the Client may be interrupted.
+ *
+ * In case that the setLocale failed to be executed, the right charset needs to be set.
+ */
+void taosSetSystemLocale(const char *inLocale, const char *inCharSet) {
+ char *locale = setlocale(LC_CTYPE, inLocale);
+
+ // default locale or user specified locale is not valid, abort launch
+ if (inLocale == NULL) {
+ printf("Invalid locale:%s, please set the valid locale in config file\n", inLocale);
+ }
+
+ if (strlen(inCharSet) == 0) {
+ printf("failed to get charset, please set the valid charset in config file\n");
+ exit(-1);
+ }
+
+ if (!taosValidateEncodec(inCharSet)) {
+ printf("Invalid charset:%s, please set the valid charset in config file", inCharSet);
+ exit(-1);
+ }
+}
+
+void taosGetSystemLocale(char *outLocale, char *outCharset) {
+#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
+ char *locale = setlocale(LC_CTYPE, "chs");
+ if (locale != NULL) {
+ tstrncpy(outLocale, locale, TD_LOCALE_LEN);
+ }
+ strcpy(outCharset, "cp936");
+
+#elif defined(_TD_DARWIN_64)
+ /*
+ * originally from src/os/src/detail/osSysinfo.c
+ * POSIX format locale string:
+ * (Language Strings)_(Country/Region Strings).(code_page)
+ *
+ * example: en_US.UTF-8, zh_CN.GB18030, zh_CN.UTF-8,
+ *
+ * if user does not specify the locale in taos.cfg the program use default LC_CTYPE as system locale.
+ *
+ * In case of some CentOS systems, their default locale is "en_US.utf8", which is not valid code_page
+ * for libiconv that is employed to convert string in this system. This program will automatically use
+ * UTF-8 instead as the charset.
+ *
+ * In case of windows client, the locale string is not valid POSIX format, user needs to set the
+ * correct code_page for libiconv. Usually, the code_page of windows system with simple chinese is
+ * CP936, CP437 for English charset.
+ *
+ */
+
+ char sep = '.';
+ char *locale = NULL;
+
+ locale = setlocale(LC_CTYPE, "");
+ if (locale == NULL) {
+ // printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
+ strcpy(outLocale, "en_US.UTF-8");
+ } else {
+ tstrncpy(outLocale, locale, TD_LOCALE_LEN);
+ // printf("locale not configured, set to system default:%s", outLocale);
+ }
+
+ /* if user does not specify the charset, extract it from locale */
+ char *str = strrchr(outLocale, sep);
+ if (str != NULL) {
+ str++;
+
+ char *revisedCharset = taosCharsetReplace(str);
+ tstrncpy(outCharset, revisedCharset, TD_CHARSET_LEN);
+
+ free(revisedCharset);
+ // printf("charset not configured, set to system default:%s", outCharset);
+ } else {
+ strcpy(outCharset, "UTF-8");
+ // printf("can't get locale and charset from system, set it to UTF-8");
+ }
+
+#else
+ /*
+ * POSIX format locale string:
+ * (Language Strings)_(Country/Region Strings).(code_page)
+ *
+ * example: en_US.UTF-8, zh_CN.GB18030, zh_CN.UTF-8,
+ *
+ * if user does not specify the locale in taos.cfg the program use default LC_CTYPE as system locale.
+ *
+ * In case of some CentOS systems, their default locale is "en_US.utf8", which is not valid code_page
+ * for libiconv that is employed to convert string in this system. This program will automatically use
+ * UTF-8 instead as the charset.
+ *
+ * In case of windows client, the locale string is not valid POSIX format, user needs to set the
+ * correct code_page for libiconv. Usually, the code_page of windows system with simple chinese is
+ * CP936, CP437 for English charset.
+ *
+ */
+ char sep = '.';
+ char *locale = NULL;
+
+ locale = setlocale(LC_CTYPE, "");
+ if (locale == NULL) {
+ // printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
+ strcpy(outLocale, "en_US.UTF-8");
+ } else {
+ tstrncpy(outLocale, locale, TD_LOCALE_LEN);
+ // printf("locale not configured, set to system default:%s", outLocale);
+ }
+
+ // if user does not specify the charset, extract it from locale
+ char *str = strrchr(outLocale, sep);
+ if (str != NULL) {
+ str++;
+
+ char *revisedCharset = taosCharsetReplace(str);
+ tstrncpy(outCharset, revisedCharset, TD_LOCALE_LEN);
+
+ free(revisedCharset);
+ // printf("charset not configured, set to system default:%s", outCharset);
+ } else {
+ strcpy(outCharset, "UTF-8");
+ // printf("can't get locale and charset from system, set it to UTF-8");
+ }
+
+#endif
+}
diff --git a/source/os/src/osString.c b/source/os/src/osString.c
index f714fd0dc4d26cf9f5c1391b34c6277b971cd74d..88ea4b3e1521103b4827c7b5646ec2ed92b556e6 100644
--- a/source/os/src/osString.c
+++ b/source/os/src/osString.c
@@ -18,24 +18,6 @@
#include
#include
-typedef struct CharsetPair {
- char *oldCharset;
- char *newCharset;
-} CharsetPair;
-
-char *taosCharsetReplace(char *charsetstr) {
- CharsetPair charsetRep[] = {
- { "utf8", "UTF-8" }, { "936", "CP936" },
- };
-
- for (int32_t i = 0; i < tListLen(charsetRep); ++i) {
- if (strcasecmp(charsetRep[i].oldCharset, charsetstr) == 0) {
- return strdup(charsetRep[i].newCharset);
- }
- }
-
- return strdup(charsetstr);
-}
int64_t taosStr2int64(const char *str) {
char *endptr = NULL;
diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c
index cae1b18b3c3dc876d9a7b2b54b1e4735ec417e4c..4a8cc5ecbc92656bd372af9684039339ccca33c8 100644
--- a/source/os/src/osSysinfo.c
+++ b/source/os/src/osSysinfo.c
@@ -21,10 +21,6 @@ int64_t tsPageSize = 0;
int64_t tsOpenMax = 0;
int64_t tsStreamMax = 0;
int32_t tsNumOfCores = 1;
-char tsTimezone[TSDB_TIMEZONE_LEN] = {0};
-char tsLocale[TSDB_LOCALE_LEN] = {0};
-char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
-
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
/*
@@ -89,25 +85,6 @@ bool taosGetProcMemory(float *memoryUsedMB) {
return true;
}
-static void taosGetSystemTimezone() {
- // get and set default timezone
- char *tz = getenv("TZ");
- if (tz == NULL || strlen(tz) == 0) {
- strcpy(tsTimezone, "not configured");
- } else {
- strcpy(tsTimezone, tz);
- }
-}
-
-static void taosGetSystemLocale() {
- // get and set default locale
- char *locale = setlocale(LC_CTYPE, "chs");
- if (locale != NULL) {
- tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
- }
-
- strcpy(tsCharset, "cp936");
-}
int32_t taosGetCpuCores() {
SYSTEM_INFO info;
@@ -134,7 +111,7 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
diskSize->used = (int64_t)(i64TotalBytes - i64FreeBytes);
return 0;
} else {
- //printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
+ //printf("failed to get disk size, dataDir:%s errno:%s", osDataDir(), strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
}
@@ -200,8 +177,6 @@ void taosGetSystemInfo() {
taosGetCpuUsage(&tmp1, &tmp2);
taosGetProcIO(&tmp1, &tmp2);
- taosGetSystemTimezone();
- taosGetSystemLocale();
}
void taosKillSystem() {
@@ -273,103 +248,6 @@ char *taosGetCmdlineByPID(int pid) { return ""; }
#include
#include
-static void taosGetSystemTimezone() {
- /* load time zone string from /etc/localtime */
- char buf[4096];
- char *tz = NULL;
- {
- int n = readlink("/etc/localtime", buf, sizeof(buf));
- if (n < 0) {
- //printf("read /etc/localtime error, reason:%s", strerror(errno));
- return;
- }
- buf[n] = '\0';
- for (int i = n - 1; i >= 0; --i) {
- if (buf[i] == '/') {
- if (tz) {
- tz = buf + i + 1;
- break;
- }
- tz = buf + i + 1;
- }
- }
- if (!tz || 0 == strchr(tz, '/')) {
- //printf("parsing /etc/localtime failed");
- return;
- }
-
- setenv("TZ", tz, 1);
- tzset();
- }
-
- /*
- * NOTE: do not remove it.
- * Enforce set the correct daylight saving time(DST) flag according
- * to current time
- */
- time_t tx1 = time(NULL);
- struct tm tm1;
- localtime_r(&tx1, &tm1);
-
- /*
- * format example:
- *
- * Asia/Shanghai (CST, +0800)
- * Europe/London (BST, +0100)
- */
- snprintf(tsTimezone, TSDB_TIMEZONE_LEN, "%s (%s, %+03ld00)", tz, tm1.tm_isdst ? tzname[daylight] : tzname[0],
- -timezone / 3600);
-
- // cfg_timezone->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT;
- //printf("timezone not configured, set to system default:%s", tsTimezone);
-}
-
-/*
- * originally from src/os/src/detail/osSysinfo.c
- * POSIX format locale string:
- * (Language Strings)_(Country/Region Strings).(code_page)
- *
- * example: en_US.UTF-8, zh_CN.GB18030, zh_CN.UTF-8,
- *
- * if user does not specify the locale in taos.cfg the program use default LC_CTYPE as system locale.
- *
- * In case of some CentOS systems, their default locale is "en_US.utf8", which is not valid code_page
- * for libiconv that is employed to convert string in this system. This program will automatically use
- * UTF-8 instead as the charset.
- *
- * In case of windows client, the locale string is not valid POSIX format, user needs to set the
- * correct code_page for libiconv. Usually, the code_page of windows system with simple chinese is
- * CP936, CP437 for English charset.
- *
- */
-static void taosGetSystemLocale() { // get and set default locale
- char sep = '.';
- char *locale = NULL;
-
- locale = setlocale(LC_CTYPE, "");
- if (locale == NULL) {
- //printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
- strcpy(tsLocale, "en_US.UTF-8");
- } else {
- tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
- //printf("locale not configured, set to system default:%s", tsLocale);
- }
-
- /* if user does not specify the charset, extract it from locale */
- char *str = strrchr(tsLocale, sep);
- if (str != NULL) {
- str++;
-
- char *revisedCharset = taosCharsetReplace(str);
- tstrncpy(tsCharset, revisedCharset, TSDB_LOCALE_LEN);
-
- free(revisedCharset);
- //printf("charset not configured, set to system default:%s", tsCharset);
- } else {
- strcpy(tsCharset, "UTF-8");
- //printf("can't get locale and charset from system, set it to UTF-8");
- }
-}
void taosKillSystem() {
//printf("function taosKillSystem, exit!");
@@ -386,9 +264,6 @@ void taosGetSystemInfo() {
long page_size = sysconf(_SC_PAGESIZE);
tsTotalMemoryMB = physical_pages * page_size / (1024 * 1024);
tsPageSize = page_size;
-
- taosGetSystemTimezone();
- taosGetSystemLocale();
}
bool taosReadProcIO(int64_t *rchars, int64_t *wchars) {
@@ -441,7 +316,7 @@ void taosSetCoreDump() {}
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
struct statvfs info;
if (statvfs(dataDir, &info)) {
- //printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
+ //printf("failed to get disk size, dataDir:%s errno:%s", osDataDir(), strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
} else {
@@ -625,110 +500,6 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
return true;
}
-static void taosGetSystemTimezone() {
- /*
- * NOTE: do not remove it.
- * Enforce set the correct daylight saving time(DST) flag according
- * to current time
- */
- time_t tx1 = time(NULL);
- struct tm tm1;
- localtime_r(&tx1, &tm1);
-
- /* load time zone string from /etc/timezone */
- FILE *f = fopen("/etc/timezone", "r");
- char buf[68] = {0};
- if (f != NULL) {
- int len = fread(buf, 64, 1, f);
- if (len < 64 && ferror(f)) {
- fclose(f);
- //printf("read /etc/timezone error, reason:%s", strerror(errno));
- return;
- }
-
- fclose(f);
-
- buf[sizeof(buf) - 1] = 0;
- char *lineEnd = strstr(buf, "\n");
- if (lineEnd != NULL) {
- *lineEnd = 0;
- }
-
- // for CentOS system, /etc/timezone does not exist. Ignore the TZ environment variables
- if (strlen(buf) > 0) {
- setenv("TZ", buf, 1);
- }
- }
- // get and set default timezone
- tzset();
-
- /*
- * get CURRENT time zone.
- * system current time zone is affected by daylight saving time(DST)
- *
- * e.g., the local time zone of London in DST is GMT+01:00,
- * otherwise is GMT+00:00
- */
- int32_t tz = (-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR;
- tz += daylight;
-
- /*
- * format example:
- *
- * Asia/Shanghai (CST, +0800)
- * Europe/London (BST, +0100)
- */
- snprintf(tsTimezone, TSDB_TIMEZONE_LEN, "%s (%s, %s%02d00)", buf, tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
-
- // cfg_timezone->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT;
- //printf("timezone not configured, set to system default:%s", tsTimezone);
-}
-
-/*
- * POSIX format locale string:
- * (Language Strings)_(Country/Region Strings).(code_page)
- *
- * example: en_US.UTF-8, zh_CN.GB18030, zh_CN.UTF-8,
- *
- * if user does not specify the locale in taos.cfg the program use default LC_CTYPE as system locale.
- *
- * In case of some CentOS systems, their default locale is "en_US.utf8", which is not valid code_page
- * for libiconv that is employed to convert string in this system. This program will automatically use
- * UTF-8 instead as the charset.
- *
- * In case of windows client, the locale string is not valid POSIX format, user needs to set the
- * correct code_page for libiconv. Usually, the code_page of windows system with simple chinese is
- * CP936, CP437 for English charset.
- *
- */
-static void taosGetSystemLocale() { // get and set default locale
- char sep = '.';
- char *locale = NULL;
-
- locale = setlocale(LC_CTYPE, "");
- if (locale == NULL) {
- //printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno));
- strcpy(tsLocale, "en_US.UTF-8");
- } else {
- tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
- //printf("locale not configured, set to system default:%s", tsLocale);
- }
-
- // if user does not specify the charset, extract it from locale
- char *str = strrchr(tsLocale, sep);
- if (str != NULL) {
- str++;
-
- char *revisedCharset = taosCharsetReplace(str);
- tstrncpy(tsCharset, revisedCharset, TSDB_LOCALE_LEN);
-
- free(revisedCharset);
- //printf("charset not configured, set to system default:%s", tsCharset);
- } else {
- strcpy(tsCharset, "UTF-8");
- //printf("can't get locale and charset from system, set it to UTF-8");
- }
-}
int32_t taosGetCpuCores() { return (int32_t)sysconf(_SC_NPROCESSORS_ONLN); }
@@ -957,8 +728,6 @@ void taosGetSystemInfo() {
taosGetCpuUsage(&tmp1, &tmp2);
taosGetProcIO(&tmp1, &tmp2);
- taosGetSystemTimezone();
- taosGetSystemLocale();
}
void taosKillSystem() {
diff --git a/source/os/src/osTimeZone.c b/source/os/src/osTimeZone.c
deleted file mode 100644
index da40e14389ef4173ef8ac0afca235a3feeecafef..0000000000000000000000000000000000000000
--- a/source/os/src/osTimeZone.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * 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 .
- */
-
-#define _DEFAULT_SOURCE
-#include "os.h"
-// #include "ulog.h"
-// #include "tglobal.h"
-// #include "tutil.h"
-
-// TODO refactor to set the tz value through parameter
-void tsSetTimeZone() {
-#if 0
- SGlobalCfg *cfg_timezone = taosGetConfigOption("timezone");
- if (cfg_timezone != NULL) {
- uInfo("timezone is set to %s by %s", tsTimezone, tsCfgStatusStr[cfg_timezone->cfgStatus]);
- }
-
-#ifdef WINDOWS
- char winStr[TSDB_LOCALE_LEN * 2];
- sprintf(winStr, "TZ=%s", tsTimezone);
- putenv(winStr);
-#else
- setenv("TZ", tsTimezone, 1);
-#endif
- tzset();
-
- /*
- * get CURRENT time zone.
- * system current time zone is affected by daylight saving time(DST)
- *
- * e.g., the local time zone of London in DST is GMT+01:00,
- * otherwise is GMT+00:00
- */
-#ifdef _MSC_VER
-#if _MSC_VER >= 1900
- // see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
- int64_t timezone = _timezone;
- int32_t daylight = _daylight;
- char **tzname = _tzname;
-#endif
-#endif
-
- int32_t tz = (int32_t)((-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR);
- tz += daylight;
-
- /*
- * format:
- * (CST, +0800)
- * (BST, +0100)
- */
- sprintf(tsTimezone, "(%s, %s%02d00)", tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
- tsDaylight = daylight;
-
- uInfo("timezone format changed to %s", tsTimezone);
-
-#endif
-}
diff --git a/source/os/src/osTimezone.c b/source/os/src/osTimezone.c
new file mode 100644
index 0000000000000000000000000000000000000000..a0ea01596fe5c811582073ec0809f66855d54f6e
--- /dev/null
+++ b/source/os/src/osTimezone.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * 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 .
+ */
+
+#define _DEFAULT_SOURCE
+#include "os.h"
+
+#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
+#if (_WIN64)
+#include
+#include
+#include
+#include
+#include
+#include
+#pragma comment(lib, "Mswsock.lib ")
+#endif
+#include
+#pragma warning(push)
+#pragma warning(disable : 4091)
+#include
+#pragma warning(pop)
+#elif defined(_TD_DARWIN_64)
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#endif
+
+void taosSetSystemTimezone(const char *inTimezone, char *outTimezone, int8_t *outDaylight) {
+#ifdef WINDOWS
+ char winStr[TD_LOCALE_LEN * 2];
+ sprintf(winStr, "TZ=%s", inTimezone);
+ putenv(winStr);
+#else
+ setenv("TZ", inTimezone, 1);
+#endif
+ tzset();
+
+ /*
+ * get CURRENT time zone.
+ * system current time zone is affected by daylight saving time(DST)
+ *
+ * e.g., the local time zone of London in DST is GMT+01:00,
+ * otherwise is GMT+00:00
+ */
+#ifdef _MSC_VER
+#if _MSC_VER >= 1900
+ // see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
+ int64_t timezone = _timezone;
+ int32_t daylight = _daylight;
+ char **tzname = _tzname;
+#endif
+#endif
+
+ int32_t tz = (int32_t)((-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR);
+ tz += daylight;
+
+ /*
+ * format:
+ * (CST, +0800)
+ * (BST, +0100)
+ */
+
+ sprintf(outTimezone, "(%s, %s%02d00)", tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
+ *outDaylight = daylight;
+}
+
+void taosGetSystemTimezone(char *outTimezone) {
+#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
+ char *tz = getenv("TZ");
+ if (tz == NULL || strlen(tz) == 0) {
+ strcpy(outTimezone, "not configured");
+ } else {
+ strcpy(outTimezone, tz);
+ }
+
+#elif defined(_TD_DARWIN_64)
+ char buf[4096] = {0};
+ char *tz = NULL;
+ {
+ int n = readlink("/etc/localtime", buf, sizeof(buf));
+ if (n < 0) {
+ printf("read /etc/localtime error, reason:%s", strerror(errno));
+ return;
+ }
+ buf[n] = '\0';
+ for (int i = n - 1; i >= 0; --i) {
+ if (buf[i] == '/') {
+ if (tz) {
+ tz = buf + i + 1;
+ break;
+ }
+ tz = buf + i + 1;
+ }
+ }
+ if (!tz || 0 == strchr(tz, '/')) {
+ printf("parsing /etc/localtime failed");
+ return;
+ }
+
+ setenv("TZ", tz, 1);
+ tzset();
+ }
+
+ /*
+ * NOTE: do not remove it.
+ * Enforce set the correct daylight saving time(DST) flag according
+ * to current time
+ */
+ time_t tx1 = time(NULL);
+ struct tm tm1;
+ localtime_r(&tx1, &tm1);
+
+ /*
+ * format example:
+ *
+ * Asia/Shanghai (CST, +0800)
+ * Europe/London (BST, +0100)
+ */
+ snprintf(outTimezone, TD_TIMEZONE_LEN, "%s (%s, %+03ld00)", tz, tm1.tm_isdst ? tzname[daylight] : tzname[0],
+ -timezone / 3600);
+
+#else
+ /*
+ * NOTE: do not remove it.
+ * Enforce set the correct daylight saving time(DST) flag according
+ * to current time
+ */
+ time_t tx1 = time(NULL);
+ struct tm tm1;
+ localtime_r(&tx1, &tm1);
+
+ /* load time zone string from /etc/timezone */
+ FILE *f = fopen("/etc/timezone", "r");
+ char buf[68] = {0};
+ if (f != NULL) {
+ int len = fread(buf, 64, 1, f);
+ if (len < 64 && ferror(f)) {
+ fclose(f);
+ // printf("read /etc/timezone error, reason:%s", strerror(errno));
+ return;
+ }
+
+ fclose(f);
+
+ buf[sizeof(buf) - 1] = 0;
+ char *lineEnd = strstr(buf, "\n");
+ if (lineEnd != NULL) {
+ *lineEnd = 0;
+ }
+
+ // for CentOS system, /etc/timezone does not exist. Ignore the TZ environment variables
+ if (strlen(buf) > 0) {
+ setenv("TZ", buf, 1);
+ }
+ }
+ // get and set default timezone
+ tzset();
+
+ /*
+ * get CURRENT time zone.
+ * system current time zone is affected by daylight saving time(DST)
+ *
+ * e.g., the local time zone of London in DST is GMT+01:00,
+ * otherwise is GMT+00:00
+ */
+ int32_t tz = (-timezone * MILLISECOND_PER_SECOND) / MILLISECOND_PER_HOUR;
+ tz += daylight;
+
+ /*
+ * format example:
+ *
+ * Asia/Shanghai (CST, +0800)
+ * Europe/London (BST, +0100)
+ */
+ snprintf(outTimezone, TD_TIMEZONE_LEN, "%s (%s, %s%02d00)", buf, tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
+
+#endif
+}
diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c
index f479203fcef88249d2e88655610fda1bd43307aa..ed55ef91b033442d667b9cea938e3abc6f504044 100644
--- a/source/util/src/tlog.c
+++ b/source/util/src/tlog.c
@@ -118,10 +118,10 @@ static int32_t taosStartLog() {
int32_t taosInitLog(const char *logName, int maxFiles) {
if (tsLogInited) return 0;
- taosUpdateLogSpace();
+ osUpdate();
char fullName[PATH_MAX] = {0};
- snprintf(fullName, PATH_MAX, "%s" TD_DIRSEP "%s", tsLogDir, logName);
+ snprintf(fullName, PATH_MAX, "%s" TD_DIRSEP "%s", osLogDir(), logName);
tsLogObj.logHandle = taosLogBuffNew(TSDB_DEFAULT_LOG_BUF_SIZE);
if (tsLogObj.logHandle == NULL) return -1;
@@ -187,7 +187,7 @@ static void taosKeepOldLog(char *oldName) {
}
}
- taosRemoveOldFiles(tsLogDir, TABS(tsLogKeepDays));
+ taosRemoveOldFiles(osLogDir(), TABS(tsLogKeepDays));
}
static void *taosThreadToOpenNewFile(void *param) {
@@ -380,7 +380,7 @@ static int32_t taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum) {
}
void taosPrintLog(const char *flags, int32_t dflag, const char *format, ...) {
- if (!taosLogSpaceAvailable()) return;
+ if (!osLogSpaceAvailable()) return;
va_list argpointer;
char buffer[MAX_LOGLINE_BUFFER_SIZE] = {0};
@@ -434,7 +434,7 @@ void taosPrintLog(const char *flags, int32_t dflag, const char *format, ...) {
}
void taosDumpData(unsigned char *msg, int32_t len) {
- if (!taosLogSpaceAvailable()) return;
+ if (!osLogSpaceAvailable()) return;
char temp[256];
int32_t i, pos = 0, c = 0;
@@ -457,7 +457,7 @@ void taosDumpData(unsigned char *msg, int32_t len) {
}
void taosPrintLongString(const char *flags, int32_t dflag, const char *format, ...) {
- if (!taosLogSpaceAvailable()) return;
+ if (!osLogSpaceAvailable()) return;
va_list argpointer;
char buffer[MAX_LOGLINE_DUMP_BUFFER_SIZE];
diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c
index 4186f0dae1038f2336565a99b03953b0e99a1e8d..33774bdd058b516189d7c0552c08622e10ac8a8d 100644
--- a/tools/shell/src/shellEngine.c
+++ b/tools/shell/src/shellEngine.c
@@ -68,11 +68,11 @@ TAOS *shellInit(SShellArguments *_args) {
printf("\n");
if (!_args->is_use_passwd) {
#ifdef TD_WINDOWS
- strcpy(tsOsName, "Windows");
+ strcpy(osName(), "Windows");
#elif defined(TD_DARWIN)
- strcpy(tsOsName, "Darwin");
+ strcpy(osName(), "Darwin");
#endif
- printf(CLIENT_VERSION, tsOsName, taos_get_client_info());
+ printf(CLIENT_VERSION, osName(), taos_get_client_info());
}
fflush(stdout);
diff --git a/tools/shell/src/shellLinux.c b/tools/shell/src/shellLinux.c
index 89b477f08a447c99d36707785ad17569df670e24..caba986ce7f5326a3ec15ebc64220cd50dc67581 100644
--- a/tools/shell/src/shellLinux.c
+++ b/tools/shell/src/shellLinux.c
@@ -184,8 +184,7 @@ static void parse_args(
for (int i = 1; i < argc; i++) {
if ((strncmp(argv[i], "-p", 2) == 0)
|| (strncmp(argv[i], "--password", 10) == 0)) {
- strcpy(tsOsName, "Linux");
- printf(LINUXCLIENT_VERSION, tsOsName, taos_get_client_info());
+ printf(LINUXCLIENT_VERSION, osName(), taos_get_client_info());
if ((strlen(argv[i]) == 2)
|| (strncmp(argv[i], "--password", 10) == 0)) {
printf("Enter password: ");