You need to sign in or sign up before continuing.
tdbEnv.c 4.2 KB
Newer Older
H
Hongze Cheng 已提交
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 "tdbInt.h"

struct STDbEnv {
H
Hongze Cheng 已提交
19 20 21
  char *      rootDir;    // root directory of the environment
  pgsz_t      pgSize;     // page size
  cachesz_t   cacheSize;  // total cache size
H
Hongze Cheng 已提交
22 23 24
  STDbList    dbList;     // TDB List
  SPgFileList pgfList;    // SPgFile List
  SPgCache *  pPgCache;   // page cache
H
Hongze Cheng 已提交
25
  struct {
H
Hongze Cheng 已提交
26 27
#define TDB_ENV_PGF_HASH_BUCKETS 17
    SPgFileList buckets[TDB_ENV_PGF_HASH_BUCKETS];
H
Hongze Cheng 已提交
28
  } pgfht;  // page file hash table;
H
Hongze Cheng 已提交
29
  SJournal *pJournal;
H
Hongze Cheng 已提交
30 31
};

H
Hongze Cheng 已提交
32 33 34 35 36 37
#define TDB_ENV_PGF_HASH(fileid)        \
  ({                                    \
    uint8_t *tmp = (uint8_t *)(fileid); \
    tmp[0] + tmp[1] + tmp[2];           \
  })

H
Hongze Cheng 已提交
38 39
static int tdbEnvDestroy(TENV *pEnv);

H
Hongze Cheng 已提交
40 41 42
int tdbEnvCreate(TENV **ppEnv, const char *rootDir) {
  TENV * pEnv;
  size_t slen;
H
Hongze Cheng 已提交
43

H
Hongze Cheng 已提交
44 45 46 47
  ASSERT(rootDir != NULL);

  *ppEnv = NULL;
  slen = strlen(rootDir);
H
Hongze Cheng 已提交
48
  pEnv = (TENV *)calloc(1, sizeof(*pEnv) + sizeof(SJournal) + slen + 1);
H
Hongze Cheng 已提交
49 50 51 52
  if (pEnv == NULL) {
    return -1;
  }

H
Hongze Cheng 已提交
53
  pEnv->rootDir = (char *)(&pEnv[1]) + sizeof(SJournal);
H
Hongze Cheng 已提交
54 55 56
  pEnv->pgSize = TDB_DEFAULT_PGSIZE;
  pEnv->cacheSize = TDB_DEFAULT_CACHE_SIZE;

H
Hongze Cheng 已提交
57
  memcpy(pEnv->rootDir, rootDir, slen);
H
Hongze Cheng 已提交
58
  pEnv->rootDir[slen] = '\0';
H
Hongze Cheng 已提交
59

H
Hongze Cheng 已提交
60 61
  TD_DLIST_INIT(&(pEnv->dbList));
  TD_DLIST_INIT(&(pEnv->pgfList));
H
Hongze Cheng 已提交
62 63 64 65

  /* TODO */

  *ppEnv = pEnv;
H
Hongze Cheng 已提交
66 67 68
  return 0;
}

H
Hongze Cheng 已提交
69
int tdbEnvOpen(TENV *pEnv) {
H
Hongze Cheng 已提交
70 71 72
  SPgCache *pPgCache;
  int       ret;

H
Hongze Cheng 已提交
73
  ASSERT(pEnv != NULL);
H
Hongze Cheng 已提交
74

H
Hongze Cheng 已提交
75 76 77 78 79
  /* TODO: here we do not need to create the root directory, more
   * work should be done here
   */
  mkdir(pEnv->rootDir, 0755);

H
Hongze Cheng 已提交
80
  ret = pgCacheOpen(&pPgCache, pEnv);
H
Hongze Cheng 已提交
81 82 83
  if (ret != 0) {
    goto _err;
  }
H
Hongze Cheng 已提交
84

H
Hongze Cheng 已提交
85
  pEnv->pPgCache = pPgCache;
H
Hongze Cheng 已提交
86
  return 0;
H
Hongze Cheng 已提交
87 88 89

_err:
  return -1;
H
Hongze Cheng 已提交
90 91 92
}

int tdbEnvClose(TENV *pEnv) {
H
Hongze Cheng 已提交
93
  if (pEnv == NULL) return 0;
H
Hongze Cheng 已提交
94
  pgCacheClose(pEnv->pPgCache);
H
Hongze Cheng 已提交
95
  tdbEnvDestroy(pEnv);
H
Hongze Cheng 已提交
96 97 98
  return 0;
}

H
Hongze Cheng 已提交
99 100 101 102
int tdbEnvSetCache(TENV *pEnv, pgsz_t pgSize, cachesz_t cacheSize) {
  if (!TDB_IS_PGSIZE_VLD(pgSize) || cacheSize / pgSize < 10) {
    return -1;
  }
H
Hongze Cheng 已提交
103 104

  /* TODO */
H
Hongze Cheng 已提交
105 106 107 108

  pEnv->pgSize = pgSize;
  pEnv->cacheSize = cacheSize;

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

H
Hongze Cheng 已提交
112
pgsz_t tdbEnvGetPageSize(TENV *pEnv) { return pEnv->pgSize; }
H
Hongze Cheng 已提交
113 114 115

cachesz_t tdbEnvGetCacheSize(TENV *pEnv) { return pEnv->cacheSize; }

H
Hongze Cheng 已提交
116
SPgFile *tdbEnvGetPageFile(TENV *pEnv, const uint8_t fileid[]) {
H
Hongze Cheng 已提交
117 118 119 120 121 122 123 124 125
  SPgFileList *pBucket;
  SPgFile *    pPgFile;

  pBucket = pEnv->pgfht.buckets + (TDB_ENV_PGF_HASH(fileid) % TDB_ENV_PGF_HASH_BUCKETS);  // TODO
  for (pPgFile = TD_DLIST_HEAD(pBucket); pPgFile != NULL; pPgFile = TD_DLIST_NODE_NEXT_WITH_FIELD(pPgFile, envHash)) {
    if (memcmp(fileid, pPgFile->fileid, TDB_FILE_ID_LEN) == 0) break;
  };

  return pPgFile;
H
Hongze Cheng 已提交
126 127
}

H
Hongze Cheng 已提交
128
SPgCache *tdbEnvGetPgCache(TENV *pEnv) { return pEnv->pPgCache; }
H
Hongze Cheng 已提交
129 130 131 132

static int tdbEnvDestroy(TENV *pEnv) {
  // TODO
  return 0;
H
Hongze Cheng 已提交
133 134 135
}

int tdbEnvBeginTxn(TENV *pEnv) {
H
Hongze Cheng 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148
  SJournal *pJournal;
  int       ret;

  ASSERT(pEnv->pJournal == NULL);

  pJournal = (SJournal *)(&(pEnv[1]));
  ret = tdbOpenJournal(pJournal);
  if (ret < 0) {
    // TODO: handle error
    return -1;
  }

  pEnv->pJournal = pJournal;
H
Hongze Cheng 已提交
149 150 151 152
  return 0;
}

int tdbEnvCommit(TENV *pEnv) {
H
Hongze Cheng 已提交
153 154 155 156 157 158 159
  SJournal *pJournal;

  ASSERT(pEnv->pJournal != NULL);

  pJournal = pEnv->pJournal;
  tdbCloseJournal(pJournal);
  /* TODO */
H
Hongze Cheng 已提交
160
  return 0;
H
Hongze Cheng 已提交
161 162 163
}

const char *tdbEnvGetRootDir(TENV *pEnv) { return pEnv->rootDir; }
H
Hongze Cheng 已提交
164 165 166 167

int tdbEnvRgstPageFile(TENV *pEnv, SPgFile *pPgFile) {
  SPgFileList *pBucket;

H
Hongze Cheng 已提交
168 169 170
  TD_DLIST_APPEND_WITH_FIELD(&(pEnv->pgfList), pPgFile, envPgfList);

  pBucket = pEnv->pgfht.buckets + (TDB_ENV_PGF_HASH(pPgFile->fileid) % TDB_ENV_PGF_HASH_BUCKETS);  // TODO
H
Hongze Cheng 已提交
171 172
  TD_DLIST_APPEND_WITH_FIELD(pBucket, pPgFile, envHash);

H
Hongze Cheng 已提交
173 174 175 176 177
  return 0;
}

int tdbEnvRgstDB(TENV *pEnv, TDB *pDb) {
  // TODO
H
Hongze Cheng 已提交
178 179
  return 0;
}