145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
// compile with:
 | 
						|
// gcc -o query_example query_example.c -ltaos
 | 
						|
#include <inttypes.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <taos.h>
 | 
						|
 | 
						|
typedef uint16_t VarDataLenT;
 | 
						|
 | 
						|
#define TSDB_NCHAR_SIZE sizeof(int32_t)
 | 
						|
#define VARSTR_HEADER_SIZE sizeof(VarDataLenT)
 | 
						|
 | 
						|
#define GET_FLOAT_VAL(x) (*(float *)(x))
 | 
						|
#define GET_DOUBLE_VAL(x) (*(double *)(x))
 | 
						|
 | 
						|
#define varDataLen(v) ((VarDataLenT *)(v))[0]
 | 
						|
 | 
						|
int printRow(char *str, TAOS_ROW row, TAOS_FIELD *fields, int numFields) {
 | 
						|
  int  len = 0;
 | 
						|
  char split = ' ';
 | 
						|
 | 
						|
  for (int i = 0; i < numFields; ++i) {
 | 
						|
    if (i > 0) {
 | 
						|
      str[len++] = split;
 | 
						|
    }
 | 
						|
 | 
						|
    if (row[i] == NULL) {
 | 
						|
      len += sprintf(str + len, "%s", "NULL");
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (fields[i].type) {
 | 
						|
      case TSDB_DATA_TYPE_TINYINT:
 | 
						|
        len += sprintf(str + len, "%d", *((int8_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_UTINYINT:
 | 
						|
        len += sprintf(str + len, "%u", *((uint8_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_SMALLINT:
 | 
						|
        len += sprintf(str + len, "%d", *((int16_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_USMALLINT:
 | 
						|
        len += sprintf(str + len, "%u", *((uint16_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_INT:
 | 
						|
        len += sprintf(str + len, "%d", *((int32_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_UINT:
 | 
						|
        len += sprintf(str + len, "%u", *((uint32_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_BIGINT:
 | 
						|
        len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_UBIGINT:
 | 
						|
        len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_FLOAT: {
 | 
						|
        float fv = 0;
 | 
						|
        fv = GET_FLOAT_VAL(row[i]);
 | 
						|
        len += sprintf(str + len, "%f", fv);
 | 
						|
      } break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_DOUBLE: {
 | 
						|
        double dv = 0;
 | 
						|
        dv = GET_DOUBLE_VAL(row[i]);
 | 
						|
        len += sprintf(str + len, "%lf", dv);
 | 
						|
      } break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_BINARY:
 | 
						|
      case TSDB_DATA_TYPE_VARBINARY:
 | 
						|
      case TSDB_DATA_TYPE_NCHAR:
 | 
						|
      case TSDB_DATA_TYPE_GEOMETRY: {
 | 
						|
        int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE);
 | 
						|
        memcpy(str + len, row[i], charLen);
 | 
						|
        len += charLen;
 | 
						|
      } break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_TIMESTAMP:
 | 
						|
        len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
 | 
						|
        break;
 | 
						|
 | 
						|
      case TSDB_DATA_TYPE_BOOL:
 | 
						|
        len += sprintf(str + len, "%d", *((int8_t *)row[i]));
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return len;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief print column name and values of each row
 | 
						|
 *
 | 
						|
 * @param res
 | 
						|
 * @return int
 | 
						|
 */
 | 
						|
static int printResult(TAOS_RES *res) {
 | 
						|
  int         numFields = taos_num_fields(res);
 | 
						|
  TAOS_FIELD *fields = taos_fetch_fields(res);
 | 
						|
  char        header[256] = {0};
 | 
						|
  int len = 0;
 | 
						|
  for (int i = 0; i < numFields; ++i) {
 | 
						|
    len += sprintf(header + len, "%s ", fields[i].name);
 | 
						|
  }
 | 
						|
  puts(header);
 | 
						|
 | 
						|
  TAOS_ROW row = NULL;
 | 
						|
  while ((row = taos_fetch_row(res))) {
 | 
						|
    char temp[256] = {0};
 | 
						|
    printRow(temp, row, fields, numFields);
 | 
						|
    puts(temp);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
  TAOS *taos = taos_connect("localhost", "root", "taosdata", "power", 6030);
 | 
						|
  if (taos == NULL) {
 | 
						|
    puts("failed to connect to server");
 | 
						|
    exit(EXIT_FAILURE);
 | 
						|
  }
 | 
						|
  TAOS_RES *res = taos_query(taos, "SELECT * FROM meters LIMIT 2");
 | 
						|
  if (taos_errno(res) != 0) {
 | 
						|
    printf("failed to execute taos_query. error: %s\n", taos_errstr(res));
 | 
						|
    exit(EXIT_FAILURE);
 | 
						|
  }
 | 
						|
  printResult(res);
 | 
						|
  taos_free_result(res);
 | 
						|
  taos_close(taos);
 | 
						|
  taos_cleanup();
 | 
						|
}
 | 
						|
 | 
						|
// output:
 | 
						|
// ts current voltage phase location groupid 
 | 
						|
// 1648432611249 10.300000 219 0.310000 California.SanFrancisco 2
 | 
						|
// 1648432611749 12.600000 218 0.330000 California.SanFrancisco 2
 |