tdataformat.h 6.7 KB
Newer Older
H
more  
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
H
hzcheng 已提交
15
#ifndef _TD_DATA_FORMAT_H_
H
more  
Hongze Cheng 已提交
16 17 18
#define _TD_DATA_FORMAT_H_

#include <stdint.h>
H
hzcheng 已提交
19
#include <stdlib.h>
H
hzcheng 已提交
20
#include <string.h>
H
more  
Hongze Cheng 已提交
21

H
hzcheng 已提交
22
#include "taosdef.h"
H
TD-166  
hzcheng 已提交
23
#include "tutil.h"
H
hzcheng 已提交
24

H
more  
hzcheng 已提交
25 26 27
#ifdef __cplusplus
extern "C" {
#endif
H
hzcheng 已提交
28 29 30 31 32 33

// ----------------- TSDB COLUMN DEFINITION
typedef struct {
  int8_t  type;    // Column type
  int16_t colId;   // column ID
  int32_t bytes;   // column bytes
H
TD-166  
hzcheng 已提交
34
  int32_t offset;  // point offset in SDataRow after the header part
H
hzcheng 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48
} STColumn;

#define colType(col) ((col)->type)
#define colColId(col) ((col)->colId)
#define colBytes(col) ((col)->bytes)
#define colOffset(col) ((col)->offset)

#define colSetType(col, t) (colType(col) = (t))
#define colSetColId(col, id) (colColId(col) = (id))
#define colSetBytes(col, b) (colBytes(col) = (b))
#define colSetOffset(col, o) (colOffset(col) = (o))

// ----------------- TSDB SCHEMA DEFINITION
typedef struct {
H
TD-166  
hzcheng 已提交
49
  int      totalCols;  // Total columns allocated
H
hzcheng 已提交
50
  int      numOfCols;  // Number of columns appended
H
TD-166  
hzcheng 已提交
51 52
  int      tlen;       // maximum length of a SDataRow without the header part
  int      flen;       // First part length in a SDataRow after the header part
H
hzcheng 已提交
53 54 55 56
  STColumn columns[];
} STSchema;

#define schemaNCols(s) ((s)->numOfCols)
H
TD-166  
hzcheng 已提交
57 58 59
#define schemaTotalCols(s) ((s)->totalCols)
#define schemaTLen(s) ((s)->tlen)
#define schemaFLen(s) ((s)->flen)
H
hzcheng 已提交
60 61 62
#define schemaColAt(s, i) ((s)->columns + i)

STSchema *tdNewSchema(int32_t nCols);
H
TD-166  
hzcheng 已提交
63 64
#define   tdFreeSchema(s) tfree((s))
int       tdSchemaAddCol(STSchema *pSchema, int8_t type, int16_t colId, int32_t bytes);
H
hzcheng 已提交
65
STSchema *tdDupSchema(STSchema *pSchema);
H
TD-27  
hzcheng 已提交
66 67 68
int       tdGetSchemaEncodeSize(STSchema *pSchema);
void *    tdEncodeSchema(void *dst, STSchema *pSchema);
STSchema *tdDecodeSchema(void **psrc);
H
hzcheng 已提交
69

H
more  
Hongze Cheng 已提交
70 71
// ----------------- Data row structure

H
hzcheng 已提交
72
/* A data row, the format is like below:
H
TD-166  
hzcheng 已提交
73 74 75 76 77 78 79
 * |<------------------------------------- len ---------------------------------->|
 * |<--Head ->|<---------   flen -------------->|                                 |
 * +----------+---------------------------------+---------------------------------+
 * | int32_t  |                                 |                                 |
 * +----------+---------------------------------+---------------------------------+
 * |   len    |           First part            |             Second part         |
 * +----------+---------------------------------+---------------------------------+
H
more  
Hongze Cheng 已提交
80
 */
H
hzcheng 已提交
81 82
typedef void *SDataRow;

H
TD-166  
hzcheng 已提交
83
#define TD_DATA_ROW_HEAD_SIZE sizeof(int32_t)
H
hzcheng 已提交
84

H
hzcheng 已提交
85
#define dataRowLen(r) (*(int32_t *)(r))
H
TD-166  
hzcheng 已提交
86 87
#define dataRowAt(r, idx) ((char *)(r) + (idx))
#define dataRowTuple(r) dataRowAt(r, TD_DATA_ROW_HEAD_SIZE)
H
TD-34  
hzcheng 已提交
88
#define dataRowKey(r) (*(TSKEY *)(dataRowTuple(r)))
H
hzcheng 已提交
89
#define dataRowSetLen(r, l) (dataRowLen(r) = (l))
H
hzcheng 已提交
90
#define dataRowCpy(dst, r) memcpy((dst), (r), dataRowLen(r))
H
TD-166  
hzcheng 已提交
91
#define dataRowMaxBytesFromSchema(s) ((s)->tlen + TD_DATA_ROW_HEAD_SIZE)
H
hzcheng 已提交
92

H
hzcheng 已提交
93
SDataRow tdNewDataRowFromSchema(STSchema *pSchema);
H
hzcheng 已提交
94
void     tdFreeDataRow(SDataRow row);
H
TD-166  
hzcheng 已提交
95
void     tdInitDataRow(SDataRow row, STSchema *pSchema);
H
TD-166  
hzcheng 已提交
96
int      tdAppendColVal(SDataRow row, void *value, int8_t type, int32_t bytes, int32_t offset);
H
hzcheng 已提交
97
void     tdDataRowReset(SDataRow row, STSchema *pSchema);
H
hzcheng 已提交
98
SDataRow tdDataRowDup(SDataRow row);
H
more  
Hongze Cheng 已提交
99

H
TD-166  
hzcheng 已提交
100 101 102 103 104 105 106
static FORCE_INLINE void *tdGetRowDataOfCol(SDataRow row, int8_t type, int32_t offset) {
  switch (type) {
    case TSDB_DATA_TYPE_BINARY:
    case TSDB_DATA_TYPE_NCHAR:
      return dataRowAt(row, *(int32_t *)dataRowAt(row, offset));
      break;
    default:
H
TD-166  
hzcheng 已提交
107
      return dataRowAt(row, offset);
H
TD-166  
hzcheng 已提交
108 109 110 111
      break;
  }
}

H
TD-34  
hzcheng 已提交
112 113
// ----------------- Data column structure
typedef struct SDataCol {
H
TD-34  
hzcheng 已提交
114 115 116 117 118
  int8_t  type;
  int16_t colId;
  int     bytes;
  int     len;
  int     offset;
H
TD-100  
hzcheng 已提交
119
  void *  pData; // Original data
H
TD-34  
hzcheng 已提交
120 121
} SDataCol;

H
TD-166  
hzcheng 已提交
122
void dataColAppendVal(SDataCol *pCol, void *value, int numOfPoints, int maxPoints);
H
TD-166  
hzcheng 已提交
123 124 125
bool isNEleNull(SDataCol *pCol, int nEle);
void dataColSetNEleNull(SDataCol *pCol, int nEle, int maxPoints);
void dataColSetOffset(SDataCol *pCol, int nEle, int maxPoints);
H
TD-166  
hzcheng 已提交
126 127 128 129 130 131 132

// Get the data pointer from a column-wised data
static FORCE_INLINE void *tdGetColDataOfRow(SDataCol *pCol, int row) {
  switch (pCol->type)
  {
  case TSDB_DATA_TYPE_BINARY:
  case TSDB_DATA_TYPE_NCHAR:
H
TD-166  
hzcheng 已提交
133
    return (void *)((char *)(pCol->pData) + ((int32_t *)(pCol->pData))[row]);
H
TD-166  
hzcheng 已提交
134 135 136
    break;

  default:
H
TD-166  
hzcheng 已提交
137
    return (void *)((char *)(pCol->pData) + TYPE_BYTES[pCol->type] * row);
H
TD-166  
hzcheng 已提交
138 139 140 141
    break;
  }
}

H
TD-166  
hzcheng 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
static FORCE_INLINE void dataColGetNEleStartAndLen(SDataCol *pDataCol, int rows, void **pStart, int32_t *len, int32_t maxPoints) {
  void *ptr = NULL;
  switch (pDataCol->type) {
    case TSDB_DATA_TYPE_BINARY:
    case TSDB_DATA_TYPE_NCHAR:
      ptr = tdGetColDataOfRow(pDataCol, rows - 1);
      *pStart = (char *)(pDataCol->pData) + sizeof(int32_t) * maxPoints;
      *len = (char *)ptr - (char *)(*pStart) + sizeof(int16_t) + *(int16_t *)ptr;
      break;

    default:
      *pStart = pDataCol->pData;
      *len = TYPE_BYTES[pDataCol->type] * rows;
      break;
  }
}


H
TD-34  
hzcheng 已提交
160
typedef struct {
H
TD-34  
hzcheng 已提交
161 162 163
  int      maxRowSize;
  int      maxCols;    // max number of columns
  int      maxPoints;  // max number of points
H
TD-166  
hzcheng 已提交
164 165
  int      exColBytes; // extra column bytes to allocate for each column

H
TD-34  
hzcheng 已提交
166
  int      numOfPoints;
H
TD-34  
hzcheng 已提交
167
  int      numOfCols;  // Total number of cols
H
TD-34  
hzcheng 已提交
168
  int      sversion;   // TODO: set sversion
H
TD-34  
hzcheng 已提交
169 170 171 172
  void *   buf;
  SDataCol cols[];
} SDataCols;

H
TD-34  
hzcheng 已提交
173
#define keyCol(pCols) (&((pCols)->cols[0]))  // Key column
H
TD-34  
hzcheng 已提交
174 175 176
#define dataColsKeyAt(pCols, idx) ((int64_t *)(keyCol(pCols)->pData))[(idx)]
#define dataColsKeyFirst(pCols) dataColsKeyAt(pCols, 0)
#define dataColsKeyLast(pCols) dataColsKeyAt(pCols, (pCols)->numOfPoints - 1)
H
TD-34  
hzcheng 已提交
177

H
TD-166  
hzcheng 已提交
178
SDataCols *tdNewDataCols(int maxRowSize, int maxCols, int maxRows, int exColBytes);
H
TD-34  
hzcheng 已提交
179
void       tdResetDataCols(SDataCols *pCols);
H
TD-34  
hzcheng 已提交
180
void       tdInitDataCols(SDataCols *pCols, STSchema *pSchema);
H
TD-100  
hzcheng 已提交
181
SDataCols *tdDupDataCols(SDataCols *pCols, bool keepData);
H
TD-34  
hzcheng 已提交
182
void       tdFreeDataCols(SDataCols *pCols);
H
TD-34  
hzcheng 已提交
183
void       tdAppendDataRowToDataCol(SDataRow row, SDataCols *pCols);
H
TD-34  
hzcheng 已提交
184
void       tdPopDataColsPoints(SDataCols *pCols, int pointsToPop);
H
hzcheng 已提交
185
int        tdMergeDataCols(SDataCols *target, SDataCols *src, int rowsToMerge);
H
TD-100  
hzcheng 已提交
186
void       tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, SDataCols *src2, int *iter2, int tRows);
H
more  
Hongze Cheng 已提交
187

H
more  
hzcheng 已提交
188 189 190 191
#ifdef __cplusplus
}
#endif

H
hzcheng 已提交
192
#endif  // _TD_DATA_FORMAT_H_