[supporting column output per row by row in shell]
This commit is contained in:
parent
1ddd7336f9
commit
aded75a8b5
|
@ -76,8 +76,8 @@ void source_file(TAOS* con, char* fptr);
|
||||||
void get_history_path(char* history);
|
void get_history_path(char* history);
|
||||||
void cleanup_handler(void* arg);
|
void cleanup_handler(void* arg);
|
||||||
void exitShell();
|
void exitShell();
|
||||||
int shellDumpResult(TAOS* con, char* fname, int* error_no);
|
int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
|
||||||
void shellPrintNChar(char* str, int width);
|
void shellPrintNChar(char* str, int width, bool printMode);
|
||||||
#define max(a, b) ((int)(a) < (int)(b) ? (int)(b) : (int)(a))
|
#define max(a, b) ((int)(a) < (int)(b) ? (int)(b) : (int)(a))
|
||||||
|
|
||||||
/**************** Global variable declarations ****************/
|
/**************** Global variable declarations ****************/
|
||||||
|
|
|
@ -33,13 +33,13 @@
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
||||||
/**************** Global variables ****************/
|
/**************** Global variables ****************/
|
||||||
char CLIENT_VERSION[] = "Welcome to the TDengine shell, client version:%s ";
|
char CLIENT_VERSION[] = "Welcome to the TDengine shell, client version:%s ";
|
||||||
char SERVER_VERSION[] = "server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
|
char SERVER_VERSION[] = "server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
|
||||||
char PROMPT_HEADER[] = "taos> ";
|
char PROMPT_HEADER[] = "taos> ";
|
||||||
char CONTINUE_PROMPT[] = " -> ";
|
char CONTINUE_PROMPT[] = " -> ";
|
||||||
int prompt_size = 6;
|
int prompt_size = 6;
|
||||||
TAOS_RES *result = NULL;
|
TAOS_RES *result = NULL;
|
||||||
History history;
|
History history;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Initialize the shell.
|
* FUNCTION: Initialize the shell.
|
||||||
|
@ -111,7 +111,7 @@ TAOS *shellInit(struct arguments *args) {
|
||||||
void shellReplaceCtrlChar(char *str) {
|
void shellReplaceCtrlChar(char *str) {
|
||||||
_Bool ctrlOn = false;
|
_Bool ctrlOn = false;
|
||||||
char *pstr = NULL;
|
char *pstr = NULL;
|
||||||
char quote = 0;
|
char quote = 0;
|
||||||
|
|
||||||
for (pstr = str; *str != '\0'; ++str) {
|
for (pstr = str; *str != '\0'; ++str) {
|
||||||
if (ctrlOn) {
|
if (ctrlOn) {
|
||||||
|
@ -128,6 +128,10 @@ void shellReplaceCtrlChar(char *str) {
|
||||||
*pstr = '\t';
|
*pstr = '\t';
|
||||||
pstr++;
|
pstr++;
|
||||||
break;
|
break;
|
||||||
|
case 'G':
|
||||||
|
*pstr++ = '\\';
|
||||||
|
*pstr++ = *str;
|
||||||
|
break;
|
||||||
case '\\':
|
case '\\':
|
||||||
*pstr = '\\';
|
*pstr = '\\';
|
||||||
pstr++;
|
pstr++;
|
||||||
|
@ -206,11 +210,12 @@ void shellRunCommand(TAOS *con, char *command) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellRunCommandOnServer(TAOS *con, char command[]) {
|
void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
int64_t st, et;
|
int64_t st, et;
|
||||||
wordexp_t full_path;
|
wordexp_t full_path;
|
||||||
char *sptr = NULL;
|
char * sptr = NULL;
|
||||||
char *cptr = NULL;
|
char * cptr = NULL;
|
||||||
char *fname = NULL;
|
char * fname = NULL;
|
||||||
|
bool printMode = false;
|
||||||
|
|
||||||
if ((sptr = strstr(command, ">>")) != NULL) {
|
if ((sptr = strstr(command, ">>")) != NULL) {
|
||||||
cptr = strstr(command, ";");
|
cptr = strstr(command, ";");
|
||||||
|
@ -226,6 +231,16 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
fname = full_path.we_wordv[0];
|
fname = full_path.we_wordv[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((sptr = strstr(command, "\\G")) != NULL) {
|
||||||
|
cptr = strstr(command, ";");
|
||||||
|
if (cptr != NULL) {
|
||||||
|
*cptr = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
*sptr = '\0';
|
||||||
|
printMode = true; // When output to a file, the switch does not work.
|
||||||
|
}
|
||||||
|
|
||||||
st = taosGetTimestampUs();
|
st = taosGetTimestampUs();
|
||||||
|
|
||||||
if (taos_query(con, command)) {
|
if (taos_query(con, command)) {
|
||||||
|
@ -242,7 +257,7 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
int num_fields = taos_field_count(con);
|
int num_fields = taos_field_count(con);
|
||||||
if (num_fields != 0) { // select and show kinds of commands
|
if (num_fields != 0) { // select and show kinds of commands
|
||||||
int error_no = 0;
|
int error_no = 0;
|
||||||
int numOfRows = shellDumpResult(con, fname, &error_no);
|
int numOfRows = shellDumpResult(con, fname, &error_no, printMode);
|
||||||
if (numOfRows < 0) return;
|
if (numOfRows < 0) return;
|
||||||
|
|
||||||
et = taosGetTimestampUs();
|
et = taosGetTimestampUs();
|
||||||
|
@ -268,7 +283,7 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
/* Function to do regular expression check */
|
/* Function to do regular expression check */
|
||||||
int regex_match(const char *s, const char *reg, int cflags) {
|
int regex_match(const char *s, const char *reg, int cflags) {
|
||||||
regex_t regex;
|
regex_t regex;
|
||||||
char msgbuf[100];
|
char msgbuf[100];
|
||||||
|
|
||||||
/* Compile regular expression */
|
/* Compile regular expression */
|
||||||
if (regcomp(®ex, reg, cflags) != 0) {
|
if (regcomp(®ex, reg, cflags) != 0) {
|
||||||
|
@ -294,16 +309,16 @@ int regex_match(const char *s, const char *reg, int cflags) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int shellDumpResult(TAOS *con, char *fname, int *error_no) {
|
int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
|
||||||
TAOS_ROW row = NULL;
|
TAOS_ROW row = NULL;
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
time_t tt;
|
time_t tt;
|
||||||
char buf[25] = "\0";
|
char buf[25] = "\0";
|
||||||
struct tm *ptm;
|
struct tm *ptm;
|
||||||
int output_bytes = 0;
|
int output_bytes = 0;
|
||||||
FILE *fp = NULL;
|
FILE * fp = NULL;
|
||||||
int num_fields = taos_field_count(con);
|
int num_fields = taos_field_count(con);
|
||||||
wordexp_t full_path;
|
wordexp_t full_path;
|
||||||
|
|
||||||
assert(num_fields != 0);
|
assert(num_fields != 0);
|
||||||
|
|
||||||
|
@ -333,138 +348,221 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no) {
|
||||||
|
|
||||||
row = taos_fetch_row(result);
|
row = taos_fetch_row(result);
|
||||||
char t_str[TSDB_MAX_BYTES_PER_ROW] = "\0";
|
char t_str[TSDB_MAX_BYTES_PER_ROW] = "\0";
|
||||||
int l[TSDB_MAX_COLUMNS] = {0};
|
int l[TSDB_MAX_COLUMNS] = {0};
|
||||||
|
int maxLenColumnName = 0;
|
||||||
|
|
||||||
if (row) {
|
if (row) {
|
||||||
// Print the header indicator
|
// Print the header indicator
|
||||||
if (fname == NULL) { // print to standard output
|
if (fname == NULL) { // print to standard output
|
||||||
for (int col = 0; col < num_fields; col++) {
|
if (!printMode) {
|
||||||
switch (fields[col].type) {
|
for (int col = 0; col < num_fields; col++) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
switch (fields[col].type) {
|
||||||
l[col] = max(BOOL_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
l[col] = max(TINYINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
l[col] = max(SMALLINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
l[col] = max(INT_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
l[col] = max(BIGINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
|
||||||
l[col] = max(FLOAT_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
l[col] = max(DOUBLE_OUTPUT_LENGTH, strlen(fields[col].name));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
|
||||||
l[col] = max(fields[col].bytes, strlen(fields[col].name));
|
|
||||||
/* l[col] = max(BINARY_OUTPUT_LENGTH, strlen(fields[col].name)); */
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
|
||||||
int32_t defaultWidth = TIMESTAMP_OUTPUT_LENGTH;
|
|
||||||
if (args.is_raw_time) {
|
|
||||||
defaultWidth = 14;
|
|
||||||
}
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
defaultWidth += 3;
|
|
||||||
}
|
|
||||||
l[col] = max(defaultWidth, strlen(fields[col].name));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int spaces = (int)(l[col] - strlen(fields[col].name));
|
|
||||||
int left_space = spaces / 2;
|
|
||||||
int right_space = (spaces % 2 ? left_space + 1 : left_space);
|
|
||||||
printf("%*.s%s%*.s|", left_space, " ", fields[col].name, right_space, " ");
|
|
||||||
output_bytes += (l[col] + 1);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
for (int k = 0; k < output_bytes; k++) printf("=");
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
// print the elements
|
|
||||||
do {
|
|
||||||
for (int i = 0; i < num_fields; i++) {
|
|
||||||
if (row[i] == NULL) {
|
|
||||||
printf("%*s|", l[i], TSDB_DATA_NULL_STR);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (fields[i].type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
printf("%*s|", l[i], ((((int)(*((char *)row[i]))) == 1) ? "true" : "false"));
|
l[col] = max(BOOL_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
printf("%*d|", l[i], (int)(*((char *)row[i])));
|
l[col] = max(TINYINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
printf("%*d|", l[i], (int)(*((short *)row[i])));
|
l[col] = max(SMALLINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
printf("%*d|", l[i], *((int *)row[i]));
|
l[col] = max(INT_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
#ifdef WINDOWS
|
l[col] = max(BIGINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
printf("%*lld|", l[i], *((int64_t *)row[i]));
|
|
||||||
#else
|
|
||||||
printf("%*ld|", l[i], *((int64_t *)row[i]));
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
printf("%*.5f|", l[i], *((float *)row[i]));
|
l[col] = max(FLOAT_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
printf("%*.9f|", l[i], *((double *)row[i]));
|
l[col] = max(DOUBLE_OUTPUT_LENGTH, strlen(fields[col].name));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
l[col] = max(fields[col].bytes, strlen(fields[col].name));
|
||||||
memcpy(t_str, row[i], fields[i].bytes);
|
/* l[col] = max(BINARY_OUTPUT_LENGTH, strlen(fields[col].name)); */
|
||||||
/* printf("%-*s|",max(fields[i].bytes, strlen(fields[i].name)),
|
|
||||||
* t_str); */
|
|
||||||
/* printf("%-*s|", l[i], t_str); */
|
|
||||||
shellPrintNChar(t_str, l[i]);
|
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
|
int32_t defaultWidth = TIMESTAMP_OUTPUT_LENGTH;
|
||||||
if (args.is_raw_time) {
|
if (args.is_raw_time) {
|
||||||
#ifdef WINDOWS
|
defaultWidth = 14;
|
||||||
printf(" %lld|", *(int64_t *)row[i]);
|
|
||||||
#else
|
|
||||||
printf(" %ld|", *(int64_t *)row[i]);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
tt = *(int64_t *)row[i] / 1000000;
|
|
||||||
} else {
|
|
||||||
tt = *(int64_t *)row[i] / 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptm = localtime(&tt);
|
|
||||||
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
|
||||||
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
printf(" %s.%06d|", buf, (int)(*(int64_t *)row[i] % 1000000));
|
|
||||||
} else {
|
|
||||||
printf(" %s.%03d|", buf, (int)(*(int64_t *)row[i] % 1000));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
defaultWidth += 3;
|
||||||
|
}
|
||||||
|
l[col] = max(defaultWidth, strlen(fields[col].name));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int spaces = (int)(l[col] - strlen(fields[col].name));
|
||||||
|
int left_space = spaces / 2;
|
||||||
|
int right_space = (spaces % 2 ? left_space + 1 : left_space);
|
||||||
|
printf("%*.s%s%*.s|", left_space, " ", fields[col].name, right_space, " ");
|
||||||
|
output_bytes += (l[col] + 1);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
for (int k = 0; k < output_bytes; k++) printf("=");
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
if (strlen(fields[col].name) > maxLenColumnName) maxLenColumnName = strlen(fields[col].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print the elements
|
||||||
|
do {
|
||||||
|
if (!printMode) {
|
||||||
|
for (int i = 0; i < num_fields; i++) {
|
||||||
|
if (row[i] == NULL) {
|
||||||
|
printf("%*s|", l[i], TSDB_DATA_NULL_STR);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (fields[i].type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
printf("%*s|", l[i], ((((int)(*((char *)row[i]))) == 1) ? "true" : "false"));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
printf("%*d|", l[i], (int)(*((char *)row[i])));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
printf("%*d|", l[i], (int)(*((short *)row[i])));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
printf("%*d|", l[i], *((int *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
#ifdef WINDOWS
|
||||||
|
printf("%*lld|", l[i], *((int64_t *)row[i]));
|
||||||
|
#else
|
||||||
|
printf("%*ld|", l[i], *((int64_t *)row[i]));
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
printf("%*.5f|", l[i], *((float *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
printf("%*.9f|", l[i], *((double *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
||||||
|
memcpy(t_str, row[i], fields[i].bytes);
|
||||||
|
/* printf("%-*s|",max(fields[i].bytes, strlen(fields[i].name)),
|
||||||
|
* t_str); */
|
||||||
|
/* printf("%-*s|", l[i], t_str); */
|
||||||
|
shellPrintNChar(t_str, l[i], printMode);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
if (args.is_raw_time) {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
printf(" %lld|", *(int64_t *)row[i]);
|
||||||
|
#else
|
||||||
|
printf(" %ld|", *(int64_t *)row[i]);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
tt = *(int64_t *)row[i] / 1000000;
|
||||||
|
} else {
|
||||||
|
tt = *(int64_t *)row[i] / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptm = localtime(&tt);
|
||||||
|
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
|
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
printf(" %s.%06d|", buf, (int)(*(int64_t *)row[i] % 1000000));
|
||||||
|
} else {
|
||||||
|
printf(" %s.%03d|", buf, (int)(*(int64_t *)row[i] % 1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
||||||
|
for (int i = 0; i < num_fields; i++) {
|
||||||
|
// 1. print column name
|
||||||
|
int left_space = (int)(maxLenColumnName - strlen(fields[i].name));
|
||||||
|
printf("%*.s%s: ", left_space, " ", fields[i].name);
|
||||||
|
|
||||||
|
// 2. print column value
|
||||||
|
if (row[i] == NULL) {
|
||||||
|
printf("%s\n", TSDB_DATA_NULL_STR);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (fields[i].type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
printf("%s\n", ((((int)(*((char *)row[i]))) == 1) ? "true" : "false"));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
printf("%d\n", (int)(*((char *)row[i])));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
printf("%d\n", (int)(*((short *)row[i])));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
printf("%d\n", *((int *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
#ifdef WINDOWS
|
||||||
|
printf("%lld\n", *((int64_t *)row[i]));
|
||||||
|
#else
|
||||||
|
printf("%ld\n", *((int64_t *)row[i]));
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
printf("%.5f\n", *((float *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
printf("%.9f\n", *((double *)row[i]));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
||||||
|
memcpy(t_str, row[i], fields[i].bytes);
|
||||||
|
l[i] = max(fields[i].bytes, strlen(fields[i].name));
|
||||||
|
shellPrintNChar(t_str, l[i], printMode);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
if (args.is_raw_time) {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
printf("%lld\n", *(int64_t *)row[i]);
|
||||||
|
#else
|
||||||
|
printf("%ld\n", *(int64_t *)row[i]);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
tt = *(int64_t *)row[i] / 1000000;
|
||||||
|
} else {
|
||||||
|
tt = *(int64_t *)row[i] / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptm = localtime(&tt);
|
||||||
|
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
|
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
printf("%s.%06d\n", buf, (int)(*(int64_t *)row[i] % 1000000));
|
||||||
|
} else {
|
||||||
|
printf("%s.%03d\n", buf, (int)(*(int64_t *)row[i] % 1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
} while ((row = taos_fetch_row(result)));
|
} while ((row = taos_fetch_row(result)));
|
||||||
|
|
||||||
|
@ -546,9 +644,9 @@ void read_history() {
|
||||||
memset(history.hist, 0, sizeof(char *) * MAX_HISTORY_SIZE);
|
memset(history.hist, 0, sizeof(char *) * MAX_HISTORY_SIZE);
|
||||||
history.hstart = 0;
|
history.hstart = 0;
|
||||||
history.hend = 0;
|
history.hend = 0;
|
||||||
char *line = NULL;
|
char * line = NULL;
|
||||||
size_t line_size = 0;
|
size_t line_size = 0;
|
||||||
int read_size = 0;
|
int read_size = 0;
|
||||||
|
|
||||||
char f_history[TSDB_FILENAME_LEN];
|
char f_history[TSDB_FILENAME_LEN];
|
||||||
get_history_path(f_history);
|
get_history_path(f_history);
|
||||||
|
@ -614,11 +712,11 @@ static int isCommentLine(char *line) {
|
||||||
|
|
||||||
void source_file(TAOS *con, char *fptr) {
|
void source_file(TAOS *con, char *fptr) {
|
||||||
wordexp_t full_path;
|
wordexp_t full_path;
|
||||||
int read_len = 0;
|
int read_len = 0;
|
||||||
char *cmd = malloc(MAX_COMMAND_SIZE);
|
char * cmd = malloc(MAX_COMMAND_SIZE);
|
||||||
size_t cmd_len = 0;
|
size_t cmd_len = 0;
|
||||||
char *line = NULL;
|
char * line = NULL;
|
||||||
size_t line_len = 0;
|
size_t line_len = 0;
|
||||||
|
|
||||||
if (wordexp(fptr, &full_path, 0) != 0) {
|
if (wordexp(fptr, &full_path, 0) != 0) {
|
||||||
fprintf(stderr, "ERROR: illegal file name\n");
|
fprintf(stderr, "ERROR: illegal file name\n");
|
||||||
|
|
|
@ -305,7 +305,7 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(char *str, int width) {
|
void shellPrintNChar(char *str, int width, bool printMode) {
|
||||||
int col_left = width;
|
int col_left = width;
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
while (col_left > 0) {
|
while (col_left > 0) {
|
||||||
|
@ -323,7 +323,12 @@ void shellPrintNChar(char *str, int width) {
|
||||||
printf(" ");
|
printf(" ");
|
||||||
col_left--;
|
col_left--;
|
||||||
}
|
}
|
||||||
printf("|");
|
|
||||||
|
if (!printMode) {
|
||||||
|
printf("|");
|
||||||
|
} else {
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_old_terminal_mode(struct termios *tio) {
|
int get_old_terminal_mode(struct termios *tio) {
|
||||||
|
|
|
@ -216,7 +216,7 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(char *str, int width) {
|
void shellPrintNChar(char *str, int width, bool printMode) {
|
||||||
int col_left = width;
|
int col_left = width;
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
while (col_left > 0) {
|
while (col_left > 0) {
|
||||||
|
@ -234,7 +234,12 @@ void shellPrintNChar(char *str, int width) {
|
||||||
printf(" ");
|
printf(" ");
|
||||||
col_left--;
|
col_left--;
|
||||||
}
|
}
|
||||||
printf("|");
|
|
||||||
|
if (!printMode) {
|
||||||
|
printf("|");
|
||||||
|
} else {
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
||||||
|
|
Loading…
Reference in New Issue