tsdbFSet.c 4.6 KB
Newer Older
H
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/>.
 */

H
Hongze Cheng 已提交
16
#include "inc/tsdbFSet.h"
H
Hongze Cheng 已提交
17

H
Hongze Cheng 已提交
18 19 20 21 22
static int32_t stt_lvl_to_json(const SSttLvl *lvl, cJSON *json) {
  if (cJSON_AddNumberToObject(json, "lvl", lvl->lvl) == NULL) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }

H
Hongze Cheng 已提交
23
  cJSON *ajson = cJSON_AddArrayToObject(json, "files");
H
Hongze Cheng 已提交
24
  if (ajson == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
25

H
Hongze Cheng 已提交
26 27 28
  SRBTreeIter iter = tRBTreeIterCreate(&lvl->sttTree, 1);
  for (SRBTreeNode *node = tRBTreeIterNext(&iter); node; node = tRBTreeIterNext(&iter)) {
    STFileObj *fobj = TCONTAINER_OF(node, STFileObj, rbtn);
H
Hongze Cheng 已提交
29

H
Hongze Cheng 已提交
30 31
    cJSON *item = cJSON_CreateObject();
    if (item == NULL) return TSDB_CODE_OUT_OF_MEMORY;
H
Hongze Cheng 已提交
32
    cJSON_AddItemToArray(ajson, item);
H
Hongze Cheng 已提交
33

H
Hongze Cheng 已提交
34
    int32_t code = tsdbTFileToJson(&fobj->f, item);
H
Hongze Cheng 已提交
35
    if (code) return code;
H
Hongze Cheng 已提交
36
  }
H
Hongze Cheng 已提交
37 38 39 40

  return 0;
}

H
Hongze Cheng 已提交
41 42 43 44 45
static int32_t stt_lvl_from_json(const cJSON *json, SSttLvl *lvl) {
  // TODO
  return 0;
}

H
Hongze Cheng 已提交
46 47
static int32_t add_file(STFileSet *fset, STFile *f) {
  if (f->type == TSDB_FTYPE_STT) {
H
Hongze Cheng 已提交
48
    SSttLvl *lvl = NULL;  // TODO
H
Hongze Cheng 已提交
49

H
Hongze Cheng 已提交
50 51
    // lvl->nstt++;
    // lvl->fstt = f;
H
Hongze Cheng 已提交
52
  } else {
H
Hongze Cheng 已提交
53
    // fset->farr[f->type] = f;
H
Hongze Cheng 已提交
54 55 56 57 58
  }

  return 0;
}

H
Hongze Cheng 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
static int32_t stt_lvl_cmpr(const SRBTreeNode *n1, const SRBTreeNode *n2) {
  SSttLvl *lvl1 = TCONTAINER_OF(n1, SSttLvl, rbtn);
  SSttLvl *lvl2 = TCONTAINER_OF(n2, SSttLvl, rbtn);

  if (lvl1->lvl < lvl2->lvl) {
    return -1;
  } else if (lvl1->lvl > lvl2->lvl) {
    return 1;
  }
  return 0;
}

static int32_t fset_init(STFileSet *fset) {
  memset(fset, 0, sizeof(*fset));
  tRBTreeCreate(&fset->lvlTree, stt_lvl_cmpr);
  return 0;
}

static int32_t fset_clear(STFileSet *fset) {
  // TODO
  return 0;
}

H
Hongze Cheng 已提交
82
int32_t tsdbFileSetToJson(const STFileSet *fset, cJSON *json) {
H
Hongze Cheng 已提交
83 84
  int32_t code = 0;

H
Hongze Cheng 已提交
85 86 87 88
  // fid
  if (cJSON_AddNumberToObject(json, "fid", fset->fid) == NULL) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }
H
Hongze Cheng 已提交
89

H
Hongze Cheng 已提交
90
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
H
Hongze Cheng 已提交
91
    if (fset->farr[ftype] == NULL) continue;
H
Hongze Cheng 已提交
92

H
Hongze Cheng 已提交
93 94
    code = tsdbTFileToJson(&fset->farr[ftype]->f, json);
    if (code) return code;
H
Hongze Cheng 已提交
95 96 97 98 99 100
  }

  // each level
  cJSON *ajson = cJSON_AddArrayToObject(json, "stt");
  if (ajson == NULL) return TSDB_CODE_OUT_OF_MEMORY;

H
Hongze Cheng 已提交
101 102 103 104 105 106
  SRBTreeIter iter = tRBTreeIterCreate(&fset->lvlTree, 1);
  for (SRBTreeNode *node = tRBTreeIterNext(&iter); node; node = tRBTreeIterNext(&iter)) {
    SSttLvl *lvl = TCONTAINER_OF(node, SSttLvl, rbtn);
    code = stt_lvl_to_json(lvl, ajson);
    if (code) return code;
  }
H
Hongze Cheng 已提交
107 108

  return 0;
H
Hongze Cheng 已提交
109 110
}

H
Hongze Cheng 已提交
111
int32_t tsdbJsonToFileSet(const cJSON *json, STFileSet *fset) {
H
Hongze Cheng 已提交
112 113
  const cJSON *item;

H
Hongze Cheng 已提交
114 115
  fset_init(fset);

H
Hongze Cheng 已提交
116 117 118 119 120 121 122 123
  /* fid */
  item = cJSON_GetObjectItem(json, "fid");
  if (cJSON_IsNumber(item)) {
    fset->fid = item->valueint;
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

H
Hongze Cheng 已提交
124
  int32_t code;
H
Hongze Cheng 已提交
125
  for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
H
Hongze Cheng 已提交
126 127 128 129 130 131 132 133 134 135 136
    STFile tf;
    code = tsdbJsonToTFile(json, ftype, &tf);
    if (code == TSDB_CODE_NOT_FOUND) {
      continue;
    } else if (code) {
      return code;
    } else {
      // TODO
      // code = tsdbFileObjCreate(&tf, &fset->farr[ftype]);
      // if (code) return code;
    }
H
Hongze Cheng 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149
  }

  // each level
  item = cJSON_GetObjectItem(json, "stt");
  if (cJSON_IsArray(item)) {
    // TODO
  } else {
    return TSDB_CODE_FILE_CORRUPTED;
  }

  return 0;
}

H
Hongze Cheng 已提交
150 151 152 153
int32_t tsdbFSetCmprFn(const STFileSet *pSet1, const STFileSet *pSet2) {
  if (pSet1->fid < pSet2->fid) return -1;
  if (pSet1->fid > pSet2->fid) return 1;
  return 0;
H
Hongze Cheng 已提交
154 155
}

H
Hongze Cheng 已提交
156
int32_t tsdbFSetEdit(STFileSet *fset, const STFileOp *op) {
H
Hongze Cheng 已提交
157 158
  int32_t code;

H
Hongze Cheng 已提交
159 160 161 162
  ASSERT(fset->fid == op->fid);

  if (op->oState.size == 0) {
    // create
H
Hongze Cheng 已提交
163 164 165
    // STFile *f;
    // code = tsdbTFileCreate(&op->nState, &f);
    // if (code) return code;
H
Hongze Cheng 已提交
166

H
Hongze Cheng 已提交
167
    // add_file(fset, f);
H
Hongze Cheng 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180
  } else if (op->nState.size == 0) {
    // delete
  } else {
    // modify
  }
  return 0;
}

int32_t tsdbFileSetInit(STFileSet *pSet) {
  for (tsdb_ftype_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ftype++) {
    pSet->farr[ftype] = NULL;
  }

H
Hongze Cheng 已提交
181 182 183 184
  // LISTD_INIT(&pSet->lvl0, listNode);
  // pSet->lvl0.lvl = 0;
  // pSet->lvl0.nstt = 0;
  // pSet->lvl0.fstt = NULL;
H
Hongze Cheng 已提交
185 186 187 188
  return 0;
}

int32_t tsdbFileSetClear(STFileSet *pSet) {
H
Hongze Cheng 已提交
189 190
  // TODO
  return 0;
H
Hongze Cheng 已提交
191
}