mockCatalogService.cpp 11.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * 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 <iomanip>
#include <iostream>
#include <map>
wafwerar's avatar
wafwerar 已提交
19
#include "mockCatalogService.h"
wafwerar's avatar
wafwerar 已提交
20
#include "tdatablock.h"
21

22
#include "tname.h"
23 24 25 26 27 28 29
#include "ttypes.h"

std::unique_ptr<MockCatalogService> mockCatalogService;

class TableBuilder : public ITableBuilder {
public:
  virtual TableBuilder& addColumn(const std::string& name, int8_t type, int32_t bytes) {
X
Xiaoyu Wang 已提交
30
    assert(colId_ <= schema()->tableInfo.numOfTags + schema()->tableInfo.numOfColumns);
X
Xiaoyu Wang 已提交
31
    SSchema* col = schema()->schema + (colId_ - 1);
32
    col->type = type;
33
    col->colId = colId_++;
34 35
    col->bytes = bytes;
    strcpy(col->name, name.c_str());
36
    rowsize_ += bytes;
37 38 39 40
    return *this;
  }

  virtual TableBuilder& setVgid(int16_t vgid) {
41
    schema()->vgId = vgid;
H
Haojun Liao 已提交
42 43 44

    SVgroupInfo vgroup = {.vgId = vgid, .hashBegin = 0, .hashEnd = 0, };

L
Liu Jicong 已提交
45 46 47 48 49
    vgroup.epSet.eps[0] = (SEp){"dnode_1", 6030};
    vgroup.epSet.eps[1] = (SEp){"dnode_2", 6030};
    vgroup.epSet.eps[2] = (SEp){"dnode_3", 6030};
    vgroup.epSet.inUse = 0;
    vgroup.epSet.numOfEps = 3;
H
Haojun Liao 已提交
50 51

    meta_->vgs.emplace_back(vgroup);
52 53 54 55
    return *this;
  }

  virtual TableBuilder& setPrecision(uint8_t precision) {
56
    schema()->tableInfo.precision = precision;
57 58 59 60
    return *this;
  }

  virtual void done() {
61
    schema()->tableInfo.rowSize = rowsize_;
62 63 64 65 66 67
  }

private:
  friend class MockCatalogServiceImpl;

  static std::unique_ptr<TableBuilder> createTableBuilder(int8_t tableType, int32_t numOfColumns, int32_t numOfTags) {
wafwerar's avatar
wafwerar 已提交
68
    STableMeta* meta = (STableMeta*)taosMemoryCalloc(1, sizeof(STableMeta) + sizeof(SSchema) * (numOfColumns + numOfTags));
69 70 71 72 73 74 75 76 77
    if (nullptr == meta) {
      throw std::bad_alloc();
    }
    meta->tableType = tableType;
    meta->tableInfo.numOfTags = numOfTags;
    meta->tableInfo.numOfColumns = numOfColumns;
    return std::unique_ptr<TableBuilder>(new TableBuilder(meta));
  }

X
Xiaoyu Wang 已提交
78
  TableBuilder(STableMeta* schemaMeta) : colId_(1), rowsize_(0), meta_(new MockTableMeta()) {
X
Xiaoyu Wang 已提交
79
    meta_->schema = schemaMeta;
80 81
  }

X
Xiaoyu Wang 已提交
82
  STableMeta* schema() {
83 84 85 86
    return meta_->schema;
  }

  std::shared_ptr<MockTableMeta> table() {
87 88 89
    return meta_;
  }

90
  col_id_t                       colId_;
91
  int32_t rowsize_;
92
  std::shared_ptr<MockTableMeta> meta_;
93 94 95 96 97 98
};

class MockCatalogServiceImpl {
public:
  static const int32_t numOfDataTypes = sizeof(tDataTypes) / sizeof(tDataTypes[0]);

99
  MockCatalogServiceImpl() : id_(1) {
100 101
  }

X
Xiaoyu Wang 已提交
102
  int32_t catalogGetHandle() const {
103
    return 0;
104 105
  }

H
Haojun Liao 已提交
106
  int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
107
    std::unique_ptr<STableMeta> table;
H
Haojun Liao 已提交
108

X
Xiaoyu Wang 已提交
109 110
    char db[TSDB_DB_NAME_LEN] = {0};
    tNameGetDbName(pTableName, db);
H
Haojun Liao 已提交
111 112 113

    const char* tname = tNameGetTableName(pTableName);
    int32_t code = copyTableSchemaMeta(db, tname, &table);
114
    if (TSDB_CODE_SUCCESS != code) {
115
      std::cout << "db : " << db << ", table :" << tname << std::endl;
116 117
      return code;
    }
118
    *pTableMeta = table.release();
119
    return TSDB_CODE_SUCCESS;
120 121
  }

H
Haojun Liao 已提交
122
  int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
X
bugfix  
Xiaoyu Wang 已提交
123 124 125
    char db[TSDB_DB_NAME_LEN] = {0};
    tNameGetDbName(pTableName, db);
    return copyTableVgroup(db, tNameGetTableName(pTableName), vgInfo);
X
Xiaoyu Wang 已提交
126 127
  }

X
bugfix  
Xiaoyu Wang 已提交
128 129 130 131
  int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** vgList) const {
    char db[TSDB_DB_NAME_LEN] = {0};
    tNameGetDbName(pTableName, db);
    return copyTableVgroup(db, tNameGetTableName(pTableName), vgList);
H
Haojun Liao 已提交
132 133
  }

134 135
  TableBuilder& createTableBuilder(const std::string& db, const std::string& tbname, int8_t tableType, int32_t numOfColumns, int32_t numOfTags) {
    builder_ = TableBuilder::createTableBuilder(tableType, numOfColumns, numOfTags);
136 137
    meta_[db][tbname] = builder_->table();
    meta_[db][tbname]->schema->uid = id_++;
138 139 140
    return *(builder_.get());
  }

141 142
  void createSubTable(const std::string& db, const std::string& stbname, const std::string& tbname, int16_t vgid) {
    std::unique_ptr<STableMeta> table;
143 144
    if (TSDB_CODE_SUCCESS != copyTableSchemaMeta(db, stbname, &table)) {
      throw std::runtime_error("copyTableSchemaMeta failed");
145
    }
146
    meta_[db][tbname].reset(new MockTableMeta());
X
Xiaoyu Wang 已提交
147
    meta_[db][tbname]->schema = table.release();
148
    meta_[db][tbname]->schema->uid = id_++;
H
Haojun Liao 已提交
149 150

    SVgroupInfo vgroup = {.vgId = vgid, .hashBegin = 0, .hashEnd = 0,};
L
Liu Jicong 已提交
151 152 153 154
    addEpIntoEpSet(&vgroup.epSet, "dnode_1", 6030);
    addEpIntoEpSet(&vgroup.epSet, "dnode_2", 6030);
    addEpIntoEpSet(&vgroup.epSet, "dnode_3", 6030);
    vgroup.epSet.inUse = 0;
H
Haojun Liao 已提交
155 156

    meta_[db][tbname]->vgs.emplace_back(vgroup);
157
    // super table
H
Haojun Liao 已提交
158
    meta_[db][stbname]->vgs.emplace_back(vgroup);
159 160
  }

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
  void showTables() const {
    // number of forward fills
    #define NOF(n) ((n) / 2)
    // number of backward fills
    #define NOB(n) ((n) % 2 ? (n) / 2 + 1 : (n) / 2)
    // center aligned
    #define CA(n, s) std::setw(NOF((n) - (s).length())) << "" << (s) << std::setw(NOB((n) - (s).length())) << "" << "|"
    // string field length
    #define SFL 20
    // string field header
    #define SH(h) CA(SFL, std::string(h))
    // string field
    #define SF(n) CA(SFL, n)
    // integer field length
    #define IFL 10
    // integer field header
    #define IH(i) CA(IFL, std::string(i))
    // integer field
    #define IF(i) CA(IFL, std::to_string(i))
    // split line
    #define SL(sn, in) std::setfill('=') << std::setw((sn) * (SFL + 1) + (in) * (IFL + 1)) << "" << std::setfill(' ')

    for (const auto& db : meta_) {
184
      std::cout << "Databse:" << db.first << std::endl;
185
      std::cout << SH("Table") << SH("Type") << SH("Precision") << IH("Vgid") << IH("RowSize") << std::endl;
186
      std::cout << SL(3, 1) << std::endl;
187
      for (const auto& table : db.second) {
188
        const auto& schema = table.second->schema;
189
        std::cout << SF(table.first) << SF(ttToString(schema->tableType)) << SF(pToString(schema->tableInfo.precision)) << IF(schema->vgId) << IF(schema->tableInfo.rowSize) << std::endl;
190 191 192 193 194 195
      }
      std::cout << std::endl;
    }

    for (const auto& db : meta_) {
      for (const auto& table : db.second) {
196
        const auto& schema = table.second->schema;
197 198 199
        std::cout << "Table:" << table.first << std::endl;
        std::cout << SH("Field") << SH("Type") << SH("DataType") << IH("Bytes") << std::endl;
        std::cout << SL(3, 1) << std::endl;
200 201
        int16_t numOfTags = schema->tableInfo.numOfTags;
        int16_t numOfFields = numOfTags + schema->tableInfo.numOfColumns;
202
        for (int16_t i = 0; i < numOfFields; ++i) {
203 204
          const SSchema* col = schema->schema + i;
          std::cout << SF(std::string(col->name)) << SH(ftToString(i, numOfTags)) << SH(dtToString(col->type)) << IF(col->bytes) << std::endl;
205 206
        }
        std::cout << std::endl;
207 208 209 210
      }
    }
  }

211 212 213 214 215 216 217 218 219 220 221 222
  std::shared_ptr<MockTableMeta> getTableMeta(const std::string& db, const std::string& tbname) const {
    DbMetaCache::const_iterator it = meta_.find(db);
    if (meta_.end() == it) {
      return std::shared_ptr<MockTableMeta>();
    }
    TableMetaCache::const_iterator tit = it->second.find(tbname);
    if (it->second.end() == tit) {
      return std::shared_ptr<MockTableMeta>();
    }
    return tit->second;
  }

223
private:
224
  typedef std::map<std::string, std::shared_ptr<MockTableMeta>> TableMetaCache;
225 226
  typedef std::map<std::string, TableMetaCache> DbMetaCache;

227 228 229 230 231 232 233 234
  std::string toDbname(const std::string& dbFullName) const {
    std::string::size_type n = dbFullName.find(".");
    if (n == std::string::npos) {
      return dbFullName;
    }
    return dbFullName.substr(n + 1);
  }

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
  std::string ttToString(int8_t tableType) const {
    switch (tableType) {
      case TSDB_SUPER_TABLE:
        return "super table";
      case TSDB_CHILD_TABLE:
        return "child table";
      case TSDB_NORMAL_TABLE:
        return "normal table";
      default:
        return "unknown";
    }
  }

  std::string pToString(uint8_t precision) const {
    switch (precision) {
      case TSDB_TIME_PRECISION_MILLI:
        return "millisecond";
      case TSDB_TIME_PRECISION_MICRO:
        return "microsecond";
      case TSDB_TIME_PRECISION_NANO:
        return "nanosecond";
      default:
        return "unknown";
    }
  }

261 262 263 264
  std::string dtToString(int8_t type) const {
    return tDataTypes[type].name;
  }

265 266 267 268
  std::string ftToString(int16_t colid, int16_t numOfTags) const {
    return (0 == colid ? "column" : (colid <= numOfTags ? "tag" : "column"));
  }

X
Xiaoyu Wang 已提交
269
  STableMeta* getTableSchemaMeta(const std::string& db, const std::string& tbname) const {
270
    std::shared_ptr<MockTableMeta> table = getTableMeta(db, tbname);
X
Xiaoyu Wang 已提交
271
    return table ? table->schema : nullptr;
272 273
  }

274
  int32_t copyTableSchemaMeta(const std::string& db, const std::string& tbname, std::unique_ptr<STableMeta>* dst) const {
X
Xiaoyu Wang 已提交
275 276
    STableMeta* src = getTableSchemaMeta(db, tbname);
    if (nullptr == src) {
277 278 279
      return TSDB_CODE_TSC_INVALID_TABLE_NAME;
    }
    int32_t len = sizeof(STableMeta) + sizeof(SSchema) * (src->tableInfo.numOfTags + src->tableInfo.numOfColumns);
wafwerar's avatar
wafwerar 已提交
280
    dst->reset((STableMeta*)taosMemoryCalloc(1, len));
281 282 283
    if (!dst) {
      return TSDB_CODE_TSC_OUT_OF_MEMORY;
    }
X
Xiaoyu Wang 已提交
284
    memcpy(dst->get(), src, len);
285 286 287
    return TSDB_CODE_SUCCESS;
  }

X
bugfix  
Xiaoyu Wang 已提交
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
  int32_t copyTableVgroup(const std::string& db, const std::string& tbname, SVgroupInfo* vg) const {
    std::shared_ptr<MockTableMeta> table = getTableMeta(db, tbname);
    if (table->vgs.empty()) {
      return TSDB_CODE_SUCCESS;
    }
    memcpy(vg, &(table->vgs[0]), sizeof(SVgroupInfo));
    return TSDB_CODE_SUCCESS;
  }

  int32_t copyTableVgroup(const std::string& db, const std::string& tbname, SArray** vgList) const {
    std::shared_ptr<MockTableMeta> table = getTableMeta(db, tbname);
    if (table->vgs.empty()) {
      return TSDB_CODE_SUCCESS;
    }
    *vgList = taosArrayInit(table->vgs.size(), sizeof(SVgroupInfo));
    for (const SVgroupInfo& vg : table->vgs) {
      taosArrayPush(*vgList, &vg);
    }
    return TSDB_CODE_SUCCESS;
  }

309 310
  uint64_t id_;
  std::unique_ptr<TableBuilder> builder_;
311
  DbMetaCache meta_;
312 313 314 315 316 317 318 319 320 321 322 323
};

MockCatalogService::MockCatalogService() : impl_(new MockCatalogServiceImpl()) {
}

MockCatalogService::~MockCatalogService() {
}

ITableBuilder& MockCatalogService::createTableBuilder(const std::string& db, const std::string& tbname, int8_t tableType, int32_t numOfColumns, int32_t numOfTags) {
  return impl_->createTableBuilder(db, tbname, tableType, numOfColumns, numOfTags);
}

324 325 326 327
void MockCatalogService::createSubTable(const std::string& db, const std::string& stbname, const std::string& tbname, int16_t vgid) {
  impl_->createSubTable(db, stbname, tbname, vgid);
}

328 329
void MockCatalogService::showTables() const {
  impl_->showTables();
330 331 332 333 334 335
}

std::shared_ptr<MockTableMeta> MockCatalogService::getTableMeta(const std::string& db, const std::string& tbname) const {
  return impl_->getTableMeta(db, tbname);
}

H
Haojun Liao 已提交
336 337
int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
  return impl_->catalogGetTableMeta(pTableName, pTableMeta);
338 339
}

H
Haojun Liao 已提交
340 341
int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
  return impl_->catalogGetTableHashVgroup(pTableName, vgInfo);
H
Haojun Liao 已提交
342 343 344 345
}

int32_t MockCatalogService::catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const {
  return impl_->catalogGetTableDistVgInfo(pTableName, pVgList);
X
Xiaoyu Wang 已提交
346
}