/* * Copyright (c) 2019 TAOS Data, Inc. * * 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 . */ #include "tdbInt.h" struct STDb { char * dbname; // dbname; SBTree * pBt; // current access method (may extend) SPgFile * pPgFile; // backend page file this DB is using TENV * pEnv; // TENV containing the DB int klen; // key length if know int vlen; // value length if know bool dup; // dup mode TdbKeyCmprFn cFn; // compare function }; struct STDbCurosr { SBtCursor *pBtCur; }; int tdbCreate(TDB **ppDb) { TDB *pDb; // create the handle pDb = (TDB *)calloc(1, sizeof(*pDb)); if (pDb == NULL) { return -1; } pDb->klen = TDB_VARIANT_LEN; pDb->vlen = TDB_VARIANT_LEN; pDb->dup = false; pDb->cFn = NULL /*TODO*/; *ppDb = pDb; return 0; } static int tdbDestroy(TDB *pDb) { if (pDb) { free(pDb); } return 0; } int tdbOpen(TDB *pDb, const char *fname, const char *dbname, TENV *pEnv) { int ret; uint8_t fileid[TDB_FILE_ID_LEN]; SPgFile * pPgFile; SPgCache *pPgCache; SBTree * pBt; ASSERT(pDb != NULL); // Create a default ENV if pEnv is not set if (pEnv == NULL) { // if ((ret = tdbEnvOpen(&pEnv)) != 0) { // return -1; // } } pDb->pEnv = pEnv; // register DB to ENV ASSERT(fname != NULL); // Check if file exists if (tdbCheckFileAccess(fname, TDB_F_OK) != 0) { if (1) { // create the file } } // Check if the SPgFile already opened tdbGnrtFileID(fname, fileid, false); pPgFile = tdbEnvGetPageFile(pEnv, fileid); if (pPgFile == NULL) { pPgCache = tdbEnvGetPgCache(pEnv); if ((ret = pgFileOpen(&pPgFile, fname, pPgCache)) != 0) { return -1; } } pDb->pPgFile = pPgFile; // open the access method (TODO) if (btreeOpen(&pBt, pPgFile) != 0) { return -1; } pDb->pBt = pBt; return 0; } int tdbClose(TDB *pDb) { if (pDb == NULL) return 0; return tdbDestroy(pDb); } int tdbSetKeyLen(TDB *pDb, int klen) { // TODO: check `klen` pDb->klen = klen; return 0; } int tdbSetValLen(TDB *pDb, int vlen) { // TODO: check `vlen` pDb->vlen = vlen; return 0; } int tdbSetDup(TDB *pDb, int dup) { if (dup) { pDb->dup = true; } else { pDb->dup = false; } return 0; } int tdbSetCmprFunc(TDB *pDb, TdbKeyCmprFn fn) { if (fn == NULL) { return -1; } else { pDb->cFn = fn; } return 0; } int tdbGetKeyLen(TDB *pDb) { return pDb->klen; } int tdbGetValLen(TDB *pDb) { return pDb->vlen; } int tdbGetDup(TDB *pDb) { if (pDb->dup) { return 1; } else { return 0; } }