tdbEnv.c 3.5 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
refact  
Hongze Cheng 已提交
18 19
int tdbEnvOpen(const char *rootDir, int pageSize, int cacheSize, TENV **ppEnv) {
  TENV *pEnv;
H
Hongze Cheng 已提交
20 21
  int   dsize;
  int   zsize;
H
Hongze Cheng 已提交
22
  int   tsize;
H
Hongze Cheng 已提交
23 24
  u8   *pPtr;
  int   ret;
H
Hongze Cheng 已提交
25 26 27 28

  *ppEnv = NULL;

  dsize = strlen(rootDir);
H
more  
Hongze Cheng 已提交
29
  zsize = sizeof(*pEnv) + dsize * 2 + strlen(TDB_JOURNAL_NAME) + 3;
H
Hongze Cheng 已提交
30

H
Hongze Cheng 已提交
31
  pPtr = (uint8_t *)tdbOsCalloc(1, zsize);
H
Hongze Cheng 已提交
32 33 34 35
  if (pPtr == NULL) {
    return -1;
  }

H
refact  
Hongze Cheng 已提交
36
  pEnv = (TENV *)pPtr;
H
Hongze Cheng 已提交
37
  pPtr += sizeof(*pEnv);
H
more  
Hongze Cheng 已提交
38
  // pEnv->rootDir
H
Hongze Cheng 已提交
39 40 41
  pEnv->rootDir = pPtr;
  memcpy(pEnv->rootDir, rootDir, dsize);
  pEnv->rootDir[dsize] = '\0';
H
more  
Hongze Cheng 已提交
42 43 44 45 46 47 48
  pPtr = pPtr + dsize + 1;
  // pEnv->jfname
  pEnv->jfname = pPtr;
  memcpy(pEnv->jfname, rootDir, dsize);
  pEnv->jfname[dsize] = '/';
  memcpy(pEnv->jfname + dsize + 1, TDB_JOURNAL_NAME, strlen(TDB_JOURNAL_NAME));
  pEnv->jfname[dsize + 1 + strlen(TDB_JOURNAL_NAME)] = '\0';
H
Hongze Cheng 已提交
49

H
Hongze Cheng 已提交
50 51
  pEnv->jfd = -1;

H
Hongze Cheng 已提交
52
  ret = tdbPCacheOpen(pageSize, cacheSize, &(pEnv->pCache));
H
more  
Hongze Cheng 已提交
53 54 55 56
  if (ret < 0) {
    return -1;
  }

H
Hongze Cheng 已提交
57 58 59 60
  pEnv->nPgrHash = 8;
  tsize = sizeof(SPager *) * pEnv->nPgrHash;
  pEnv->pgrHash = TDB_REALLOC(pEnv->pgrHash, tsize);
  if (pEnv->pgrHash == NULL) {
H
Hongze Cheng 已提交
61 62
    return -1;
  }
H
Hongze Cheng 已提交
63
  memset(pEnv->pgrHash, 0, tsize);
H
Hongze Cheng 已提交
64

H
more  
Hongze Cheng 已提交
65
  mkdir(rootDir, 0755);
H
Hongze Cheng 已提交
66

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

H
refact  
Hongze Cheng 已提交
71
int tdbEnvClose(TENV *pEnv) {
H
Hongze Cheng 已提交
72 73
  // TODO
  return 0;
H
Hongze Cheng 已提交
74 75
}

H
Hongze Cheng 已提交
76
int tdbBegin(TENV *pEnv) {
H
Hongze Cheng 已提交
77
  ASSERT(0);
H
Hongze Cheng 已提交
78 79 80 81
  return 0;
}

int tdbCommit(TENV *pEnv) {
H
Hongze Cheng 已提交
82 83
  SPager *pPager;

H
Hongze Cheng 已提交
84
  pPager = pEnv->pgrList;
H
Hongze Cheng 已提交
85 86 87 88
  while (pPager) {
    tdbPagerCommit(pPager);
  }

H
Hongze Cheng 已提交
89 90 91 92
  return 0;
}

int tdbRollback(TENV *pEnv) {
H
Hongze Cheng 已提交
93
  ASSERT(0);
H
Hongze Cheng 已提交
94 95 96
  return 0;
}

H
refact  
Hongze Cheng 已提交
97
SPager *tdbEnvGetPager(TENV *pEnv, const char *fname) {
H
Hongze Cheng 已提交
98 99 100 101 102 103 104 105 106
  int      hash;
  SPager **ppPager;

  hash = tdbCstringHash(fname);
  ppPager = &pEnv->pgrHash[hash % pEnv->nPgrHash];
  for (; *ppPager && (strcmp(fname, (*ppPager)->dbFileName) != 0); ppPager = &((*ppPager)->pHashNext)) {
  }

  return *ppPager;
H
Hongze Cheng 已提交
107 108
}

H
Hongze Cheng 已提交
109 110 111
void tdbEnvAddPager(TENV *pEnv, SPager *pPager) {
  int      hash;
  SPager **ppPager;
H
Hongze Cheng 已提交
112

H
Hongze Cheng 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
  // rehash if neccessary
  if (pEnv->nPager + 1 > pEnv->nPgrHash) {
    // TODO
  }

  // add to list
  pPager->pNext = pEnv->pgrList;
  pEnv->pgrList = pPager;

  // add to hash
  hash = tdbCstringHash(pPager->dbFileName);
  ppPager = &pEnv->pgrHash[hash % pEnv->nPgrHash];
  pPager->pHashNext = *ppPager;
  *ppPager = pPager;

  // increase the counter
  pEnv->nPager++;
}

void tdbEnvRemovePager(TENV *pEnv, SPager *pPager) {
  int      hash;
  SPager **ppPager;

  // remove from the list
  for (ppPager = &pEnv->pgrList; *ppPager && (*ppPager != pPager); ppPager = &((*ppPager)->pNext)) {
  }
  ASSERT(*ppPager == pPager);
  *ppPager = pPager->pNext;

  // remove from hash
  hash = tdbCstringHash(pPager->dbFileName);
  ppPager = &pEnv->pgrHash[hash % pEnv->nPgrHash];
  for (; *ppPager && *ppPager != pPager; ppPager = &((*ppPager)->pHashNext)) {
  }
  ASSERT(*ppPager == pPager);
  *ppPager = pPager->pNext;

  // decrease the counter
  pEnv->nPager--;

  // rehash if necessary
  if (pEnv->nPgrHash > 8 && pEnv->nPager < pEnv->nPgrHash / 2) {
    // TODO
  }
H
Hongze Cheng 已提交
157
}