提交 438c3eaa 编写于 作者: S slguan

fix issue #530

上级 d5097cb7
......@@ -2428,7 +2428,7 @@ static int setColumnFilterInfoForTimestamp(SSqlCmd* pCmd, tVariant* pVar) {
}
tVariantDestroy(pVar);
tVariantCreateB(pVar, &time, 0, TSDB_DATA_TYPE_BIGINT);
tVariantCreateB(pVar, (char*)&time, 0, TSDB_DATA_TYPE_BIGINT);
return TSDB_CODE_SUCCESS;
}
......
......@@ -210,22 +210,25 @@ int taos_options(TSDB_OPTION option, const void *arg, ...) {
if (cfg_locale && cfg_charset && cfg_locale->cfgStatus <= TSDB_CFG_CSTATUS_OPTION) {
char sep = '.';
char oldLocale[64] = {0};
strncpy(oldLocale, tsLocale, sizeof(oldLocale) / sizeof(oldLocale[0]));
if (strlen(tsLocale) == 0) { // locale does not set yet
char* defaultLocale = setlocale(LC_CTYPE, "");
strcpy(tsLocale, defaultLocale);
}
// set the user specified locale
char *locale = setlocale(LC_CTYPE, pStr);
if (locale != NULL) {
tscPrint("locale set, prev locale:%s, new locale:%s", oldLocale, locale);
tscPrint("locale set, prev locale:%s, new locale:%s", tsLocale, locale);
cfg_locale->cfgStatus = TSDB_CFG_CSTATUS_OPTION;
} else {
/* set the user-specified localed failed, use default LC_CTYPE as
* current locale */
locale = setlocale(LC_CTYPE, oldLocale);
tscPrint("failed to set locale:%s, restore locale:%s", pStr, oldLocale);
/* set the user-specified localed failed, use default LC_CTYPE as current locale */
locale = setlocale(LC_CTYPE, tsLocale);
tscPrint("failed to set locale:%s, current locale:%s", pStr, tsLocale);
}
strncpy(tsLocale, locale, sizeof(tsLocale) / sizeof(tsLocale[0]));
strncpy(tsLocale, locale, tListLen(tsLocale));
char *charset = strrchr(tsLocale, sep);
if (charset != NULL) {
......@@ -234,15 +237,21 @@ int taos_options(TSDB_OPTION option, const void *arg, ...) {
charset = taosCharsetReplace(charset);
if (taosValidateEncodec(charset)) {
tscPrint("charset changed from %s to %s", tsCharset, charset);
if (strlen(tsCharset) == 0) {
tscPrint("charset set:%s", charset);
} else {
tscPrint("charset changed from %s to %s", tsCharset, charset);
}
strncpy(tsCharset, charset, tListLen(tsCharset));
cfg_charset->cfgStatus = TSDB_CFG_CSTATUS_OPTION;
;
} else {
tscPrint("charset:%s is not valid in locale, charset remains:%s", charset, tsCharset);
}
free(charset);
} else {
} else { // it may be windows system
tscPrint("charset remains:%s", tsCharset);
}
} else {
......@@ -256,22 +265,24 @@ int taos_options(TSDB_OPTION option, const void *arg, ...) {
/* set charset will override the value of charset, assigned during system locale changed */
pStr = (char *)arg;
char oldCharset[64] = {0};
strncpy(oldCharset, tsCharset, tListLen(oldCharset));
size_t len = strlen(pStr);
if (len == 0 || len > TSDB_LOCALE_LEN) {
tscPrint("Invalid charset:%s, failed to set charset, current charset:%s", pStr, oldCharset);
tscPrint("failed to set charset:%s", pStr);
return -1;
}
if (cfg_charset && cfg_charset->cfgStatus <= TSDB_CFG_CSTATUS_OPTION) {
if (taosValidateEncodec(pStr)) {
tscPrint("charset changed from %s to %s", tsCharset, pStr);
if (strlen(tsCharset) == 0) {
tscPrint("charset is set:%s", pStr);
} else {
tscPrint("charset changed from %s to %s", tsCharset, pStr);
}
strncpy(tsCharset, pStr, tListLen(tsCharset));
cfg_charset->cfgStatus = TSDB_CFG_CSTATUS_OPTION;
} else {
tscPrint("charset:%s is not valid, charset remains:%s", pStr, tsCharset);
tscPrint("charset:%s not valid", pStr);
}
} else {
tscWarn("config option:%s, input value:%s, is configured by %s, use %s", cfg_charset->option, pStr,
......
......@@ -229,30 +229,24 @@ char *taosCharsetReplace(char *charsetstr) {
return strdup(charsetstr);
}
/*
* 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.
*
*/
void taosGetSystemLocale() { // get and set default locale
/*
* 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.
* User needs to specify the locale explicitly
* in config file in the correct format: en_US.UTF-8
*
* In case of windows client, the locale string is not legal 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 locale.
*
*/
char sep = '.';
char *locale = NULL;
......@@ -262,7 +256,7 @@ void taosGetSystemLocale() { // get and set default locale
if (locale == NULL) {
pError("can't get locale from system");
} else {
strncpy(tsLocale, locale, sizeof(tsLocale) / sizeof(tsLocale[0]));
strncpy(tsLocale, locale, tListLen(tsLocale));
pPrint("locale not configured, set to system default:%s", tsLocale);
}
}
......@@ -275,7 +269,7 @@ void taosGetSystemLocale() { // get and set default locale
str++;
char *revisedCharset = taosCharsetReplace(str);
strncpy(tsCharset, revisedCharset, sizeof(tsCharset) / sizeof(tsCharset[0]));
strncpy(tsCharset, revisedCharset, tListLen(tsCharset));
free(revisedCharset);
pPrint("charset not configured, set to system default:%s", tsCharset);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册