sdb.h 11.3 KB
Newer Older
H
refact  
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

S
Shengliang Guan 已提交
16 17
#ifndef _TD_SDB_H_
#define _TD_SDB_H_
S
Shengliang Guan 已提交
18

L
Liu Jicong 已提交
19 20
#include "os.h"

S
Shengliang Guan 已提交
21 22 23
#ifdef __cplusplus
extern "C" {
#endif
S
Shengliang Guan 已提交
24

S
Shengliang Guan 已提交
25 26 27
#define SDB_GET_INT64(pData, pRow, dataPos, val)   \
  {                                                \
    if (sdbGetRawInt64(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
28
      tfree(pRow);                                 \
S
Shengliang Guan 已提交
29 30 31
      return NULL;                                 \
    }                                              \
    dataPos += sizeof(int64_t);                    \
S
Shengliang Guan 已提交
32 33
  }

S
Shengliang Guan 已提交
34 35 36
#define SDB_GET_INT32(pData, pRow, dataPos, val)   \
  {                                                \
    if (sdbGetRawInt32(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
37
      tfree(pRow);                                 \
S
Shengliang Guan 已提交
38 39 40
      return NULL;                                 \
    }                                              \
    dataPos += sizeof(int32_t);                    \
S
Shengliang Guan 已提交
41 42
  }

S
Shengliang Guan 已提交
43 44 45
#define SDB_GET_INT16(pData, pRow, dataPos, val)   \
  {                                                \
    if (sdbGetRawInt16(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
46
      tfree(pRow);                                 \
S
Shengliang Guan 已提交
47 48 49 50 51
      return NULL;                                 \
    }                                              \
    dataPos += sizeof(int16_t);                    \
  }

S
Shengliang Guan 已提交
52 53 54
#define SDB_GET_INT8(pData, pRow, dataPos, val)   \
  {                                               \
    if (sdbGetRawInt8(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
55
      tfree(pRow);                                \
S
Shengliang Guan 已提交
56 57 58
      return NULL;                                \
    }                                             \
    dataPos += sizeof(int8_t);                    \
S
Shengliang Guan 已提交
59 60
  }

S
Shengliang Guan 已提交
61 62 63
#define SDB_GET_BINARY(pRaw, pRow, dataPos, val, valLen)    \
  {                                                         \
    if (sdbGetRawBinary(pRaw, dataPos, val, valLen) != 0) { \
S
Shengliang Guan 已提交
64
      tfree(pRow);                                          \
S
Shengliang Guan 已提交
65 66 67
      return NULL;                                          \
    }                                                       \
    dataPos += valLen;                                      \
S
Shengliang Guan 已提交
68 69
  }

S
Shengliang Guan 已提交
70 71 72 73
#define SDB_GET_RESERVE(pRaw, pRow, dataPos, valLen)        \
  {                                                         \
    char val[valLen] = {0};                                 \
    if (sdbGetRawBinary(pRaw, dataPos, val, valLen) != 0) { \
S
Shengliang Guan 已提交
74
      tfree(pRow);                                          \
S
Shengliang Guan 已提交
75 76 77 78 79
      return NULL;                                          \
    }                                                       \
    dataPos += valLen;                                      \
  }

S
Shengliang Guan 已提交
80
#define SDB_SET_INT64(pRaw, dataPos, val)          \
S
Shengliang Guan 已提交
81 82
  {                                                \
    if (sdbSetRawInt64(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
83
      sdbFreeRaw(pRaw);                            \
S
Shengliang Guan 已提交
84
      return NULL;                                 \
S
Shengliang Guan 已提交
85
    }                                              \
S
Shengliang Guan 已提交
86
    dataPos += sizeof(int64_t);                    \
S
Shengliang Guan 已提交
87 88
  }

S
Shengliang Guan 已提交
89
#define SDB_SET_INT32(pRaw, dataPos, val)          \
S
Shengliang Guan 已提交
90 91
  {                                                \
    if (sdbSetRawInt32(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
92
      sdbFreeRaw(pRaw);                            \
S
Shengliang Guan 已提交
93
      return NULL;                                 \
S
Shengliang Guan 已提交
94
    }                                              \
S
Shengliang Guan 已提交
95 96 97
    dataPos += sizeof(int32_t);                    \
  }

S
Shengliang Guan 已提交
98 99 100 101 102 103
#define SDB_SET_INT16(pRaw, dataPos, val)          \
  {                                                \
    if (sdbSetRawInt16(pRaw, dataPos, val) != 0) { \
      sdbFreeRaw(pRaw);                            \
      return NULL;                                 \
    }                                              \
S
Shengliang Guan 已提交
104
    dataPos += sizeof(int16_t);                    \
S
Shengliang Guan 已提交
105 106
  }

S
Shengliang Guan 已提交
107
#define SDB_SET_INT8(pRaw, dataPos, val)          \
S
Shengliang Guan 已提交
108 109
  {                                               \
    if (sdbSetRawInt8(pRaw, dataPos, val) != 0) { \
S
Shengliang Guan 已提交
110
      sdbFreeRaw(pRaw);                           \
S
Shengliang Guan 已提交
111
      return NULL;                                \
S
Shengliang Guan 已提交
112
    }                                             \
S
Shengliang Guan 已提交
113 114 115 116 117 118
    dataPos += sizeof(int8_t);                    \
  }

#define SDB_SET_BINARY(pRaw, dataPos, val, valLen)          \
  {                                                         \
    if (sdbSetRawBinary(pRaw, dataPos, val, valLen) != 0) { \
S
Shengliang Guan 已提交
119 120 121 122 123 124 125 126 127 128
      sdbFreeRaw(pRaw);                                     \
      return NULL;                                          \
    }                                                       \
    dataPos += valLen;                                      \
  }

#define SDB_SET_RESERVE(pRaw, dataPos, valLen)              \
  {                                                         \
    char val[valLen] = {0};                                 \
    if (sdbSetRawBinary(pRaw, dataPos, val, valLen) != 0) { \
S
Shengliang Guan 已提交
129
      sdbFreeRaw(pRaw);                                     \
S
Shengliang Guan 已提交
130
      return NULL;                                          \
S
Shengliang Guan 已提交
131
    }                                                       \
S
Shengliang Guan 已提交
132 133 134 135 136 137
    dataPos += valLen;                                      \
  }

#define SDB_SET_DATALEN(pRaw, dataLen)          \
  {                                             \
    if (sdbSetRawDataLen(pRaw, dataLen) != 0) { \
S
Shengliang Guan 已提交
138
      sdbFreeRaw(pRaw);                         \
S
Shengliang Guan 已提交
139
      return NULL;                              \
S
Shengliang Guan 已提交
140
    }                                           \
S
Shengliang Guan 已提交
141 142
  }

S
Shengliang Guan 已提交
143
typedef struct SMnode  SMnode;
S
Shengliang Guan 已提交
144 145 146 147 148
typedef struct SSdbRaw SSdbRaw;
typedef struct SSdbRow SSdbRow;
typedef enum { SDB_KEY_BINARY = 1, SDB_KEY_INT32 = 2, SDB_KEY_INT64 = 3 } EKeyType;
typedef enum {
  SDB_STATUS_CREATING = 1,
S
Shengliang Guan 已提交
149
  SDB_STATUS_UPDATING = 2,
S
Shengliang Guan 已提交
150
  SDB_STATUS_DROPPING = 3,
S
Shengliang Guan 已提交
151 152
  SDB_STATUS_READY = 4,
  SDB_STATUS_DROPPED = 5
S
Shengliang Guan 已提交
153 154
} ESdbStatus;

S
Shengliang Guan 已提交
155
typedef enum {
S
Shengliang Guan 已提交
156
  SDB_START = 0,
S
Shengliang Guan 已提交
157
  SDB_TRANS = 1,
S
Shengliang Guan 已提交
158
  SDB_CLUSTER = 2,
S
Shengliang Guan 已提交
159
  SDB_MNODE = 3,
S
Shengliang Guan 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
  SDB_QNODE = 4,
  SDB_SNODE = 5,
  SDB_BNODE = 6,
  SDB_DNODE = 7,
  SDB_USER = 8,
  SDB_AUTH = 9,
  SDB_ACCT = 10,
  SDB_CONSUMER = 11,
  SDB_CGROUP = 12,
  SDB_TOPIC = 13,
  SDB_VGROUP = 14,
  SDB_STB = 15,
  SDB_DB = 16,
  SDB_FUNC = 17,
  SDB_MAX = 18
S
Shengliang Guan 已提交
175 176
} ESdbType;

S
Shengliang Guan 已提交
177 178 179 180
typedef struct SSdb SSdb;
typedef int32_t (*SdbInsertFp)(SSdb *pSdb, void *pObj);
typedef int32_t (*SdbUpdateFp)(SSdb *pSdb, void *pSrcObj, void *pDstObj);
typedef int32_t (*SdbDeleteFp)(SSdb *pSdb, void *pObj);
S
Shengliang Guan 已提交
181
typedef int32_t (*SdbDeployFp)(SMnode *pMnode);
S
Shengliang Guan 已提交
182
typedef SSdbRow *(*SdbDecodeFp)(SSdbRaw *pRaw);
S
Shengliang Guan 已提交
183
typedef SSdbRaw *(*SdbEncodeFp)(void *pObj);
S
Shengliang Guan 已提交
184
typedef bool (*sdbTraverseFp)(SMnode *pMnode, void *pObj, void *p1, void *p2, void *p3);
S
Shengliang Guan 已提交
185

S
Shengliang Guan 已提交
186
typedef struct {
S
Shengliang Guan 已提交
187 188
  ESdbType    sdbType;
  EKeyType    keyType;
S
Shengliang Guan 已提交
189 190 191 192 193 194
  SdbDeployFp deployFp;
  SdbEncodeFp encodeFp;
  SdbDecodeFp decodeFp;
  SdbInsertFp insertFp;
  SdbUpdateFp updateFp;
  SdbDeleteFp deleteFp;
S
Shengliang Guan 已提交
195
} SSdbTable;
S
Shengliang Guan 已提交
196

S
Shengliang Guan 已提交
197 198
typedef struct SSdbOpt {
  const char *path;
S
Shengliang Guan 已提交
199
  SMnode     *pMnode;
S
Shengliang Guan 已提交
200
} SSdbOpt;
S
Shengliang Guan 已提交
201

S
Shengliang Guan 已提交
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
/**
 * @brief Initialize and start the sdb.
 *
 * @param pOption Option of the sdb.
 * @return SSdb* The sdb object.
 */
SSdb *sdbInit(SSdbOpt *pOption);

/**
 * @brief Stop and cleanup the sdb.
 *
 * @param pSdb The sdb object to close.
 */
void sdbCleanup(SSdb *pSdb);

/**
 * @brief Set the properties of sdb table.
 *
 * @param pSdb The sdb object.
 * @param table The properties of the table.
 * @return int32_t 0 for success, -1 for failure.
 */
S
Shengliang Guan 已提交
224
int32_t sdbSetTable(SSdb *pSdb, SSdbTable table);
S
Shengliang Guan 已提交
225 226 227 228 229 230 231

/**
 * @brief Set the initial rows of sdb.
 *
 * @param pSdb The sdb object.
 * @return int32_t 0 for success, -1 for failure.
 */
S
Shengliang Guan 已提交
232
int32_t sdbDeploy(SSdb *pSdb);
S
Shengliang Guan 已提交
233 234 235 236 237 238 239

/**
 * @brief Load sdb from file.
 *
 * @param pSdb The sdb object.
 * @return int32_t 0 for success, -1 for failure.
 */
S
Shengliang Guan 已提交
240
int32_t sdbReadFile(SSdb *pSdb);
S
Shengliang Guan 已提交
241 242

/**
S
Shengliang Guan 已提交
243
 * @brief Parse and write raw data to sdb, then free the pRaw object
S
Shengliang Guan 已提交
244 245 246 247 248
 *
 * @param pSdb The sdb object.
 * @param pRaw The raw data.
 * @return int32_t 0 for success, -1 for failure.
 */
S
Shengliang Guan 已提交
249
int32_t sdbWrite(SSdb *pSdb, SSdbRaw *pRaw);
S
Shengliang Guan 已提交
250

S
Shengliang Guan 已提交
251 252 253 254 255 256 257 258 259
/**
 * @brief Parse and write raw data to sdb.
 *
 * @param pSdb The sdb object.
 * @param pRaw The raw data.
 * @return int32_t 0 for success, -1 for failure.
 */
int32_t sdbWriteNotFree(SSdb *pSdb, SSdbRaw *pRaw);

S
Shengliang Guan 已提交
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
/**
 * @brief Acquire a row from sdb
 *
 * @param pSdb The sdb object.
 * @param type The type of the row.
 * @param pKey The key value of the row.
 * @return void* The object of the row.
 */
void *sdbAcquire(SSdb *pSdb, ESdbType type, void *pKey);

/**
 * @brief Release a row from sdb.
 *
 * @param pSdb The sdb object.
 * @param pObj The object of the row.
 */
void sdbRelease(SSdb *pSdb, void *pObj);

/**
 * @brief Traverse a sdb table
 *
 * @param pSdb The sdb object.
 * @param type The type of the table.
S
Shengliang Guan 已提交
283
 * @param pIter The initial iterator of the table.
S
Shengliang Guan 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296
 * @param pObj The object of the row just fetched.
 * @return void* The next iterator of the table.
 */
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj);

/**
 * @brief Cancel a traversal
 *
 * @param pSdb The sdb object.
 * @param type The initial iterator of table.
 */
void sdbCancelFetch(SSdb *pSdb, void *pIter);

S
Shengliang Guan 已提交
297 298 299 300 301 302 303 304 305 306 307 308
/**
 * @brief Traverse a sdb
 *
 * @param pSdb The sdb object.
 * @param type The initial iterator of table.
 * @param fp The function pointer.
 * @param p1 The callback param.
 * @param p2 The callback param.
 * @param p3 The callback param.
 */
void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2, void *p3);

S
Shengliang Guan 已提交
309 310 311 312 313 314 315
/**
 * @brief Get the number of rows in the table
 *
 * @param pSdb The sdb object.
 * @param pIter The type of the table.
 * @record int32_t The number of rows in the table
 */
S
Shengliang Guan 已提交
316
int32_t sdbGetSize(SSdb *pSdb, ESdbType type);
S
Shengliang Guan 已提交
317

S
Shengliang Guan 已提交
318 319 320 321 322 323 324 325 326
/**
 * @brief Get the max id of the table, keyType of table should be INT32
 *
 * @param pSdb The sdb object.
 * @param pIter The type of the table.
 * @record int32_t The max id of the table
 */
int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type);

S
Shengliang Guan 已提交
327
SSdbRaw *sdbAllocRaw(ESdbType type, int8_t sver, int32_t dataLen);
S
Shengliang Guan 已提交
328 329
void     sdbFreeRaw(SSdbRaw *pRaw);
int32_t  sdbSetRawInt8(SSdbRaw *pRaw, int32_t dataPos, int8_t val);
S
Shengliang Guan 已提交
330
int32_t  sdbSetRawInt16(SSdbRaw *pRaw, int32_t dataPos, int16_t val);
S
Shengliang Guan 已提交
331 332 333 334 335 336
int32_t  sdbSetRawInt32(SSdbRaw *pRaw, int32_t dataPos, int32_t val);
int32_t  sdbSetRawInt64(SSdbRaw *pRaw, int32_t dataPos, int64_t val);
int32_t  sdbSetRawBinary(SSdbRaw *pRaw, int32_t dataPos, const char *pVal, int32_t valLen);
int32_t  sdbSetRawDataLen(SSdbRaw *pRaw, int32_t dataLen);
int32_t  sdbSetRawStatus(SSdbRaw *pRaw, ESdbStatus status);
int32_t  sdbGetRawInt8(SSdbRaw *pRaw, int32_t dataPos, int8_t *val);
S
Shengliang Guan 已提交
337
int32_t  sdbGetRawInt16(SSdbRaw *pRaw, int32_t dataPos, int16_t *val);
S
Shengliang Guan 已提交
338 339 340 341 342 343 344
int32_t  sdbGetRawInt32(SSdbRaw *pRaw, int32_t dataPos, int32_t *val);
int32_t  sdbGetRawInt64(SSdbRaw *pRaw, int32_t dataPos, int64_t *val);
int32_t  sdbGetRawBinary(SSdbRaw *pRaw, int32_t dataPos, char *pVal, int32_t valLen);
int32_t  sdbGetRawSoftVer(SSdbRaw *pRaw, int8_t *sver);
int32_t  sdbGetRawTotalSize(SSdbRaw *pRaw);

SSdbRow *sdbAllocRow(int32_t objSize);
S
Shengliang Guan 已提交
345
void     sdbFreeRow(SSdb *pSdb, SSdbRow *pRow);
S
Shengliang Guan 已提交
346 347
void    *sdbGetRowObj(SSdbRow *pRow);

S
Shengliang Guan 已提交
348 349 350
#ifdef __cplusplus
}
#endif
S
Shengliang Guan 已提交
351

S
Shengliang Guan 已提交
352
#endif /*_TD_SDB_H_*/