mockCatalog.cpp 15.4 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
void generateTestTables(MockCatalogService* mcs) {
X
Xiaoyu Wang 已提交
163
  ITableBuilder& builder = mcs->createTableBuilder("test", "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 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
void generateTestStables(MockCatalogService* mcs) {
  {
    ITableBuilder& builder = mcs->createTableBuilder("test", "st1", TSDB_SUPER_TABLE, 3, 3)
                                 .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();
    mcs->createSubTable("test", "st1", "st1s1", 1);
    mcs->createSubTable("test", "st1", "st1s2", 2);
    mcs->createSubTable("test", "st1", "st1s3", 1);
  }
  {
    ITableBuilder& builder = mcs->createTableBuilder("test", "st2", TSDB_SUPER_TABLE, 3, 1)
                                 .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();
    mcs->createSubTable("test", "st2", "st2s1", 1);
    mcs->createSubTable("test", "st2", "st2s2", 2);
  }
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 240 241 242
  mcs->createDatabase("test");
  mcs->createDatabase("rollup_db", true);
}

X
Xiaoyu Wang 已提交
243
}  // namespace
244

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

X
Xiaoyu Wang 已提交
247
int32_t __catalogGetTableMeta(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
X
Xiaoyu Wang 已提交
248
                              STableMeta** pTableMeta) {
249
  return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
X
Xiaoyu Wang 已提交
250 251
}

X
Xiaoyu Wang 已提交
252 253
int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
                                    SVgroupInfo* vgInfo) {
254
  return g_mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo);
255 256
}

X
Xiaoyu Wang 已提交
257
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
X
Xiaoyu Wang 已提交
258
                                    SArray** pVgList) {
259
  return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
260 261
}

X
Xiaoyu Wang 已提交
262 263
int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId,
                                int32_t* tableNum) {
264 265 266
  return 0;
}

X
Xiaoyu Wang 已提交
267
int32_t __catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SArray** pVgList) {
X
Xiaoyu Wang 已提交
268
  return g_mockCatalogService->catalogGetDBVgInfo(dbFName, pVgList);
X
Xiaoyu Wang 已提交
269 270
}

X
Xiaoyu Wang 已提交
271
int32_t __catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
272
  return g_mockCatalogService->catalogGetDBCfg(dbFName, pDbCfg);
273 274
}

X
Xiaoyu Wang 已提交
275 276
int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
                         bool* pass) {
277 278 279 280
  *pass = true;
  return 0;
}

X
Xiaoyu Wang 已提交
281
int32_t __catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
282 283 284
  return g_mockCatalogService->catalogGetUdfInfo(funcName, pInfo);
}

X
Xiaoyu Wang 已提交
285 286
int32_t __catalogRefreshGetTableMeta(SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
                                     STableMeta** pTableMeta, int32_t isSTable) {
X
Xiaoyu Wang 已提交
287 288 289 290 291
  return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
}

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

X
Xiaoyu Wang 已提交
292 293 294 295 296
int32_t __catalogGetTableIndex(SCatalog* pCtg, void* pTrans, const SEpSet* pMgmtEps, const SName* pName,
                               SArray** pRes) {
  return g_mockCatalogService->catalogGetTableIndex(pName, pRes);
}

297 298 299 300
int32_t __catalogGetDnodeList(SCatalog* pCatalog, SRequestConnInfo* pConn, SArray** pDnodeList) {
  return g_mockCatalogService->catalogGetDnodeList(pDnodeList);
}

301 302
int32_t __catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
                                    STableCfg** pCfg) {
D
dapan1121 已提交
303 304 305 306
  *pCfg = (STableCfg*)taosMemoryCalloc(1, sizeof(STableCfg));
  return 0;
}

307
void initMetaDataEnv() {
308
  g_mockCatalogService.reset(new MockCatalogService());
X
Xiaoyu Wang 已提交
309 310 311 312

  static Stub stub;
  stub.set(catalogGetHandle, __catalogGetHandle);
  stub.set(catalogGetTableMeta, __catalogGetTableMeta);
313
  stub.set(catalogGetSTableMeta, __catalogGetTableMeta);
X
Xiaoyu Wang 已提交
314
  stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
315
  stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
X
Xiaoyu Wang 已提交
316
  stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
X
Xiaoyu Wang 已提交
317
  stub.set(catalogGetDBVgInfo, __catalogGetDBVgInfo);
318
  stub.set(catalogGetDBCfg, __catalogGetDBCfg);
319
  stub.set(catalogChkAuth, __catalogChkAuth);
320
  stub.set(catalogGetUdfInfo, __catalogGetUdfInfo);
X
Xiaoyu Wang 已提交
321 322
  stub.set(catalogRefreshGetTableMeta, __catalogRefreshGetTableMeta);
  stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
X
Xiaoyu Wang 已提交
323
  stub.set(catalogGetTableIndex, __catalogGetTableIndex);
324
  stub.set(catalogGetDnodeList, __catalogGetDnodeList);
D
dapan1121 已提交
325
  stub.set(catalogRefreshGetTableCfg, __catalogRefreshGetTableCfg);
X
Xiaoyu Wang 已提交
326 327 328 329 330 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
  // {
  //   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);
  //   }
  // }
366 367 368
}

void generateMetaData() {
369
  generateDatabases(g_mockCatalogService.get());
370 371
  generateInformationSchema(g_mockCatalogService.get());
  generatePerformanceSchema(g_mockCatalogService.get());
372 373
  generateTestTables(g_mockCatalogService.get());
  generateTestStables(g_mockCatalogService.get());
374
  generateFunctions(g_mockCatalogService.get());
375
  generateDnodes(g_mockCatalogService.get());
376
  g_mockCatalogService->showTables();
377 378
}

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