tdbEnv.c 4.3 KB
Newer Older
H
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * 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"

H
Hongze Cheng 已提交
18 19 20 21 22 23
struct STEnv {
  char *   rootDir;
  SPCache *pCache;
  int      jfd;
};

H
more  
Hongze Cheng 已提交
24
#if 0
H
Hongze Cheng 已提交
25
struct STDbEnv {
H
Hongze Cheng 已提交
26
  char *      rootDir;    // root directory of the environment
H
Hongze Cheng 已提交
27 28
  char *      jname;      // journal file name
  int         jfd;        // journal file fd
H
Hongze Cheng 已提交
29 30
  pgsz_t      pgSize;     // page size
  cachesz_t   cacheSize;  // total cache size
H
Hongze Cheng 已提交
31 32 33
  STDbList    dbList;     // TDB List
  SPgFileList pgfList;    // SPgFile List
  SPgCache *  pPgCache;   // page cache
H
Hongze Cheng 已提交
34
  struct {
H
Hongze Cheng 已提交
35 36
#define TDB_ENV_PGF_HASH_BUCKETS 17
    SPgFileList buckets[TDB_ENV_PGF_HASH_BUCKETS];
H
Hongze Cheng 已提交
37
  } pgfht;  // page file hash table;
H
Hongze Cheng 已提交
38 39
};

H
Hongze Cheng 已提交
40 41 42 43 44 45
#define TDB_ENV_PGF_HASH(fileid)        \
  ({                                    \
    uint8_t *tmp = (uint8_t *)(fileid); \
    tmp[0] + tmp[1] + tmp[2];           \
  })

H
Hongze Cheng 已提交
46 47
static int tdbEnvDestroy(TENV *pEnv);

H
Hongze Cheng 已提交
48 49 50
int tdbEnvCreate(TENV **ppEnv, const char *rootDir) {
  TENV * pEnv;
  size_t slen;
H
Hongze Cheng 已提交
51
  size_t jlen;
H
Hongze Cheng 已提交
52

H
Hongze Cheng 已提交
53 54 55 56
  ASSERT(rootDir != NULL);

  *ppEnv = NULL;
  slen = strlen(rootDir);
H
Hongze Cheng 已提交
57 58
  jlen = slen + strlen(TDB_JOURNAL_NAME) + 1;
  pEnv = (TENV *)calloc(1, sizeof(*pEnv) + slen + 1 + jlen + 1);
H
Hongze Cheng 已提交
59 60 61 62
  if (pEnv == NULL) {
    return -1;
  }

H
Hongze Cheng 已提交
63 64 65
  pEnv->rootDir = (char *)(&pEnv[1]);
  pEnv->jname = pEnv->rootDir + slen + 1;
  pEnv->jfd = -1;
H
Hongze Cheng 已提交
66 67 68
  pEnv->pgSize = TDB_DEFAULT_PGSIZE;
  pEnv->cacheSize = TDB_DEFAULT_CACHE_SIZE;

H
Hongze Cheng 已提交
69
  memcpy(pEnv->rootDir, rootDir, slen);
H
Hongze Cheng 已提交
70
  pEnv->rootDir[slen] = '\0';
H
Hongze Cheng 已提交
71
  sprintf(pEnv->jname, "%s/%s", rootDir, TDB_JOURNAL_NAME);
H
Hongze Cheng 已提交
72

H
Hongze Cheng 已提交
73 74
  TD_DLIST_INIT(&(pEnv->dbList));
  TD_DLIST_INIT(&(pEnv->pgfList));
H
Hongze Cheng 已提交
75 76 77 78

  /* TODO */

  *ppEnv = pEnv;
H
Hongze Cheng 已提交
79 80 81
  return 0;
}

H
Hongze Cheng 已提交
82
int tdbEnvOpen(TENV *pEnv) {
H
Hongze Cheng 已提交
83 84 85
  SPgCache *pPgCache;
  int       ret;

H
Hongze Cheng 已提交
86
  ASSERT(pEnv != NULL);
H
Hongze Cheng 已提交
87

H
Hongze Cheng 已提交
88 89 90 91 92
  /* TODO: here we do not need to create the root directory, more
   * work should be done here
   */
  mkdir(pEnv->rootDir, 0755);

H
Hongze Cheng 已提交
93
  ret = pgCacheOpen(&pPgCache, pEnv);
H
Hongze Cheng 已提交
94 95 96
  if (ret != 0) {
    goto _err;
  }
H
Hongze Cheng 已提交
97

H
Hongze Cheng 已提交
98
  pEnv->pPgCache = pPgCache;
H
Hongze Cheng 已提交
99
  return 0;
H
Hongze Cheng 已提交
100 101 102

_err:
  return -1;
H
Hongze Cheng 已提交
103 104 105
}

int tdbEnvClose(TENV *pEnv) {
H
Hongze Cheng 已提交
106
  if (pEnv == NULL) return 0;
H
Hongze Cheng 已提交
107
  pgCacheClose(pEnv->pPgCache);
H
Hongze Cheng 已提交
108
  tdbEnvDestroy(pEnv);
H
Hongze Cheng 已提交
109 110 111
  return 0;
}

H
Hongze Cheng 已提交
112 113 114 115
int tdbEnvSetCache(TENV *pEnv, pgsz_t pgSize, cachesz_t cacheSize) {
  if (!TDB_IS_PGSIZE_VLD(pgSize) || cacheSize / pgSize < 10) {
    return -1;
  }
H
Hongze Cheng 已提交
116 117

  /* TODO */
H
Hongze Cheng 已提交
118 119 120 121

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

H
Hongze Cheng 已提交
122 123 124
  return 0;
}

H
Hongze Cheng 已提交
125
pgsz_t tdbEnvGetPageSize(TENV *pEnv) { return pEnv->pgSize; }
H
Hongze Cheng 已提交
126 127 128

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

H
Hongze Cheng 已提交
129
SPgFile *tdbEnvGetPageFile(TENV *pEnv, const uint8_t fileid[]) {
H
Hongze Cheng 已提交
130 131 132 133 134 135 136 137 138
  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 已提交
139 140
}

H
Hongze Cheng 已提交
141
SPgCache *tdbEnvGetPgCache(TENV *pEnv) { return pEnv->pPgCache; }
H
Hongze Cheng 已提交
142 143 144 145

static int tdbEnvDestroy(TENV *pEnv) {
  // TODO
  return 0;
H
Hongze Cheng 已提交
146 147 148
}

int tdbEnvBeginTxn(TENV *pEnv) {
H
Hongze Cheng 已提交
149 150
  pEnv->jfd = open(pEnv->jname, O_CREAT | O_RDWR, 0755);
  if (pEnv->jfd < 0) {
H
Hongze Cheng 已提交
151 152 153
    return -1;
  }

H
Hongze Cheng 已提交
154 155 156 157
  return 0;
}

int tdbEnvCommit(TENV *pEnv) {
H
Hongze Cheng 已提交
158
  /* TODO */
H
Hongze Cheng 已提交
159 160
  close(pEnv->jfd);
  pEnv->jfd = -1;
H
Hongze Cheng 已提交
161
  return 0;
H
Hongze Cheng 已提交
162 163 164
}

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

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

H
Hongze Cheng 已提交
169 170 171
  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 已提交
172 173
  TD_DLIST_APPEND_WITH_FIELD(pBucket, pPgFile, envHash);

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

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