mockCatalog.cpp 15.5 KB
Newer Older
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/>.
 */
#include <iostream>
X
Xiaoyu Wang 已提交
16
#include "stub.h"
S
Shengliang Guan 已提交
17 18 19 20

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat"

21
#include <addr_any.h>
X
Xiaoyu Wang 已提交
22

S
Shengliang Guan 已提交
23 24
#pragma GCC diagnostic pop

wafwerar's avatar
wafwerar 已提交
25 26 27
#ifdef WINDOWS
#define TD_USE_WINSOCK
#endif
28

29
#include "mockCatalog.h"
30 31

#include "systable.h"
32 33
namespace {

X
Xiaoyu Wang 已提交
34 35
void generateInformationSchema(MockCatalogService* mcs) {
  {
36 37 38
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("id", TSDB_DATA_TYPE_INT);
X
Xiaoyu Wang 已提交
39 40 41
    builder.done();
  }
  {
42 43 44
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("id", TSDB_DATA_TYPE_INT);
X
Xiaoyu Wang 已提交
45 46 47
    builder.done();
  }
  {
48 49 50
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("id", TSDB_DATA_TYPE_INT);
X
Xiaoyu Wang 已提交
51 52 53
    builder.done();
  }
  {
54 55 56
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("id", TSDB_DATA_TYPE_INT);
X
Xiaoyu Wang 已提交
57 58 59
    builder.done();
  }
  {
60 61 62
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_DATABASES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
X
Xiaoyu Wang 已提交
63 64 65
    builder.done();
  }
  {
66 67 68
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_FUNCTIONS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_FUNC_NAME_LEN);
X
Xiaoyu Wang 已提交
69 70 71
    builder.done();
  }
  {
72 73 74 75
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_INDEXES, TSDB_SYSTEM_TABLE, 2)
            .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
            .addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
X
Xiaoyu Wang 已提交
76 77 78
    builder.done();
  }
  {
79 80 81 82
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_STABLES, TSDB_SYSTEM_TABLE, 2)
            .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
            .addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
X
Xiaoyu Wang 已提交
83 84 85
    builder.done();
  }
  {
86 87 88 89
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_TABLES, TSDB_SYSTEM_TABLE, 2)
            .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
            .addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
X
Xiaoyu Wang 已提交
90 91 92
    builder.done();
  }
  {
X
Xiaoyu Wang 已提交
93
    ITableBuilder& builder =
94
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 1)
X
Xiaoyu Wang 已提交
95
            .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
X
Xiaoyu Wang 已提交
96 97 98
    builder.done();
  }
  {
99 100 101
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_USERS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("user_name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN);
X
Xiaoyu Wang 已提交
102 103 104
    builder.done();
  }
  {
105 106 107
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN);
X
Xiaoyu Wang 已提交
108 109
    builder.done();
  }
110
  {
111 112 113
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_OPTION_LEN);
114 115 116
    builder.done();
  }
  {
117 118 119
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODE_VARIABLES, TSDB_SYSTEM_TABLE, 1)
            .addColumn("dnode_id", TSDB_DATA_TYPE_INT);
120 121
    builder.done();
  }
X
Xiaoyu Wang 已提交
122 123
}

124 125
void generatePerformanceSchema(MockCatalogService* mcs) {
  {
126 127 128
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_TRANS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("id", TSDB_DATA_TYPE_INT);
129 130
    builder.done();
  }
H
Haojun Liao 已提交
131
  {
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_STREAMS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
    builder.done();
  }
  {
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_CONSUMERS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
    builder.done();
  }
  {
    ITableBuilder& builder =
        mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_SUBSCRIPTIONS, TSDB_SYSTEM_TABLE, 1)
            .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
H
Haojun Liao 已提交
147 148
    builder.done();
  }
149 150
}

X
Xiaoyu Wang 已提交
151 152 153 154 155 156 157 158 159 160 161
/*
 * Table:t1
 *        Field        |        Type        |      DataType      |  Bytes   |
 * ==========================================================================
 *          ts         |       column       |     TIMESTAMP      |    8     |
 *          c1         |       column       |        INT         |    4     |
 *          c2         |       column       |      VARCHAR       |    20    |
 *          c3         |       column       |       BIGINT       |    8     |
 *          c4         |       column       |       DOUBLE       |    8     |
 *          c5         |       column       |       DOUBLE       |    8     |
 */
162 163
void generateTestTables(MockCatalogService* mcs, const std::string& db) {
  ITableBuilder& builder = mcs->createTableBuilder(db, "t1", TSDB_NORMAL_TABLE, 6)
X
Xiaoyu Wang 已提交
164 165 166 167 168 169 170 171
                               .setPrecision(TSDB_TIME_PRECISION_MILLI)
                               .setVgid(1)
                               .addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
                               .addColumn("c1", TSDB_DATA_TYPE_INT)
                               .addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
                               .addColumn("c3", TSDB_DATA_TYPE_BIGINT)
                               .addColumn("c4", TSDB_DATA_TYPE_DOUBLE)
                               .addColumn("c5", TSDB_DATA_TYPE_DOUBLE);
172 173 174
  builder.done();
}

X
Xiaoyu Wang 已提交
175 176 177 178 179 180 181 182 183
/*
 * Super Table: st1
 *        Field        |        Type        |      DataType      |  Bytes   |
 * ==========================================================================
 *          ts         |       column       |     TIMESTAMP      |    8     |
 *          c1         |       column       |        INT         |    4     |
 *          c2         |       column       |      VARCHAR       |    20    |
 *         tag1        |        tag         |        INT         |    4     |
 *         tag2        |        tag         |      VARCHAR       |    20    |
X
Xiaoyu Wang 已提交
184
 *         tag3        |        tag         |     TIMESTAMP      |    8     |
X
Xiaoyu Wang 已提交
185
 * Child Table: st1s1, st1s2
186
 *
X
Xiaoyu Wang 已提交
187 188 189 190 191 192 193 194 195
 * Super Table: st2
 *        Field        |        Type        |      DataType      |  Bytes   |
 * ==========================================================================
 *          ts         |       column       |     TIMESTAMP      |    8     |
 *          c1         |       column       |        INT         |    4     |
 *          c2         |       column       |      VARCHAR       |    20    |
 *         jtag        |        tag         |        json        |    --    |
 * Child Table: st2s1, st2s2
 */
196
void generateTestStables(MockCatalogService* mcs, const std::string& db) {
197
  {
198
    ITableBuilder& builder = mcs->createTableBuilder(db, "st1", TSDB_SUPER_TABLE, 3, 3)
199 200 201 202 203 204 205 206
                                 .setPrecision(TSDB_TIME_PRECISION_MILLI)
                                 .addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
                                 .addColumn("c1", TSDB_DATA_TYPE_INT)
                                 .addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
                                 .addTag("tag1", TSDB_DATA_TYPE_INT)
                                 .addTag("tag2", TSDB_DATA_TYPE_BINARY, 20)
                                 .addTag("tag3", TSDB_DATA_TYPE_TIMESTAMP);
    builder.done();
207 208 209
    mcs->createSubTable(db, "st1", "st1s1", 1);
    mcs->createSubTable(db, "st1", "st1s2", 2);
    mcs->createSubTable(db, "st1", "st1s3", 1);
210 211
  }
  {
212
    ITableBuilder& builder = mcs->createTableBuilder(db, "st2", TSDB_SUPER_TABLE, 3, 1)
213 214 215 216 217 218
                                 .setPrecision(TSDB_TIME_PRECISION_MILLI)
                                 .addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
                                 .addColumn("c1", TSDB_DATA_TYPE_INT)
                                 .addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
                                 .addTag("jtag", TSDB_DATA_TYPE_JSON);
    builder.done();
219 220
    mcs->createSubTable(db, "st2", "st2s1", 1);
    mcs->createSubTable(db, "st2", "st2s2", 2);
221
  }
X
Xiaoyu Wang 已提交
222 223
}

224 225 226 227 228 229
void generateFunctions(MockCatalogService* mcs) {
  mcs->createFunction("udf1", TSDB_FUNC_TYPE_SCALAR, TSDB_DATA_TYPE_INT, tDataTypes[TSDB_DATA_TYPE_INT].bytes, 0);
  mcs->createFunction("udf2", TSDB_FUNC_TYPE_AGGREGATE, TSDB_DATA_TYPE_DOUBLE, tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes,
                      8);
}

230 231 232 233 234 235
void generateDnodes(MockCatalogService* mcs) {
  mcs->createDnode(1, "host1", 7030);
  mcs->createDnode(2, "host2", 7030);
  mcs->createDnode(3, "host3", 7030);
}

236
void generateDatabases(MockCatalogService* mcs) {
237 238
  mcs->createDatabase(TSDB_INFORMATION_SCHEMA_DB);
  mcs->createDatabase(TSDB_PERFORMANCE_SCHEMA_DB);
239
  mcs->createDatabase("test");
240 241 242 243 244
  generateTestTables(g_mockCatalogService.get(), "test");
  generateTestStables(g_mockCatalogService.get(), "test");
  mcs->createDatabase("cache_db", false, 1);
  generateTestTables(g_mockCatalogService.get(), "cache_db");
  generateTestStables(g_mockCatalogService.get(), "cache_db");
245 246 247
  mcs->createDatabase("rollup_db", true);
}

X
Xiaoyu Wang 已提交
248
}  // namespace
249

X
Xiaoyu Wang 已提交
250
int32_t __catalogGetHandle(const char* clusterId, struct SCatalog** catalogHandle) { return 0; }
251

X
Xiaoyu Wang 已提交
252
int32_t __catalogGetTableMeta(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
X
Xiaoyu Wang 已提交
253
                              STableMeta** pTableMeta) {
254
  return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
X
Xiaoyu Wang 已提交
255 256
}

X
Xiaoyu Wang 已提交
257 258
int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
                                    SVgroupInfo* vgInfo) {
259
  return g_mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo);
260 261
}

X
Xiaoyu Wang 已提交
262
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
X
Xiaoyu Wang 已提交
263
                                    SArray** pVgList) {
264
  return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
265 266
}

X
Xiaoyu Wang 已提交
267 268
int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId,
                                int32_t* tableNum) {
269 270 271
  return 0;
}

X
Xiaoyu Wang 已提交
272
int32_t __catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SArray** pVgList) {
X
Xiaoyu Wang 已提交
273
  return g_mockCatalogService->catalogGetDBVgInfo(dbFName, pVgList);
X
Xiaoyu Wang 已提交
274 275
}

X
Xiaoyu Wang 已提交
276
int32_t __catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
277
  return g_mockCatalogService->catalogGetDBCfg(dbFName, pDbCfg);
278 279
}

X
Xiaoyu Wang 已提交
280 281
int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                         bool* pass) {
282 283 284 285
  *pass = true;
  return 0;
}

X
Xiaoyu Wang 已提交
286
int32_t __catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
287 288 289
  return g_mockCatalogService->catalogGetUdfInfo(funcName, pInfo);
}

X
Xiaoyu Wang 已提交
290 291
int32_t __catalogRefreshGetTableMeta(SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
                                     STableMeta** pTableMeta, int32_t isSTable) {
X
Xiaoyu Wang 已提交
292 293 294 295 296
  return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
}

int32_t __catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName) { return 0; }

X
Xiaoyu Wang 已提交
297 298 299 300 301
int32_t __catalogGetTableIndex(SCatalog* pCtg, void* pTrans, const SEpSet* pMgmtEps, const SName* pName,
                               SArray** pRes) {
  return g_mockCatalogService->catalogGetTableIndex(pName, pRes);
}

302 303 304 305
int32_t __catalogGetDnodeList(SCatalog* pCatalog, SRequestConnInfo* pConn, SArray** pDnodeList) {
  return g_mockCatalogService->catalogGetDnodeList(pDnodeList);
}

306 307
int32_t __catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                    STableCfg** pCfg) {
D
dapan1121 已提交
308 309 310 311
  *pCfg = (STableCfg*)taosMemoryCalloc(1, sizeof(STableCfg));
  return 0;
}

312
void initMetaDataEnv() {
313
  g_mockCatalogService.reset(new MockCatalogService());
X
Xiaoyu Wang 已提交
314 315 316 317

  static Stub stub;
  stub.set(catalogGetHandle, __catalogGetHandle);
  stub.set(catalogGetTableMeta, __catalogGetTableMeta);
318
  stub.set(catalogGetSTableMeta, __catalogGetTableMeta);
X
Xiaoyu Wang 已提交
319
  stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
320
  stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
X
Xiaoyu Wang 已提交
321
  stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
X
Xiaoyu Wang 已提交
322
  stub.set(catalogGetDBVgInfo, __catalogGetDBVgInfo);
323
  stub.set(catalogGetDBCfg, __catalogGetDBCfg);
324
  stub.set(catalogChkAuth, __catalogChkAuth);
325
  stub.set(catalogGetUdfInfo, __catalogGetUdfInfo);
X
Xiaoyu Wang 已提交
326 327
  stub.set(catalogRefreshGetTableMeta, __catalogRefreshGetTableMeta);
  stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
X
Xiaoyu Wang 已提交
328
  stub.set(catalogGetTableIndex, __catalogGetTableIndex);
329
  stub.set(catalogGetDnodeList, __catalogGetDnodeList);
D
dapan1121 已提交
330
  stub.set(catalogRefreshGetTableCfg, __catalogRefreshGetTableCfg);
X
Xiaoyu Wang 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
  // {
  //   AddrAny any("libcatalog.so");
  //   std::map<std::string,void*> result;
  //   any.get_global_func_addr_dynsym("^catalogGetHandle$", result);
  //   for (const auto& f : result) {
  //     stub.set(f.second, __catalogGetHandle);
  //   }
  // }
  // {
  //   AddrAny any("libcatalog.so");
  //   std::map<std::string,void*> result;
  //   any.get_global_func_addr_dynsym("^catalogGetTableMeta$", result);
  //   for (const auto& f : result) {
  //     stub.set(f.second, __catalogGetTableMeta);
  //   }
  // }
  // {
  //   AddrAny any("libcatalog.so");
  //   std::map<std::string,void*> result;
  //   any.get_global_func_addr_dynsym("^catalogGetTableHashVgroup$", result);
  //   for (const auto& f : result) {
  //     stub.set(f.second, __catalogGetTableHashVgroup);
  //   }
  // }
  // {
  //   AddrAny any("libcatalog.so");
  //   std::map<std::string,void*> result;
  //   any.get_global_func_addr_dynsym("^catalogGetTableDistVgInfo$", result);
  //   for (const auto& f : result) {
  //     stub.set(f.second, __catalogGetTableDistVgInfo);
  //   }
  // }
  // {
  //   AddrAny any("libcatalog.so");
  //   std::map<std::string,void*> result;
  //   any.get_global_func_addr_dynsym("^catalogGetDBVgVersion$", result);
  //   for (const auto& f : result) {
  //     stub.set(f.second, __catalogGetDBVgVersion);
  //   }
  // }
371 372 373
}

void generateMetaData() {
374
  generateDatabases(g_mockCatalogService.get());
375 376
  generateInformationSchema(g_mockCatalogService.get());
  generatePerformanceSchema(g_mockCatalogService.get());
377
  generateFunctions(g_mockCatalogService.get());
378
  generateDnodes(g_mockCatalogService.get());
379 380
}

381
void destroyMetaDataEnv() { g_mockCatalogService.reset(); }