fix tdb problem
This commit is contained in:
parent
13740e8988
commit
264b3f0c73
|
@ -40,6 +40,7 @@ taosdalipu/
|
||||||
Target/
|
Target/
|
||||||
*.failed
|
*.failed
|
||||||
*.sql
|
*.sql
|
||||||
|
sim
|
||||||
sim/
|
sim/
|
||||||
psim/
|
psim/
|
||||||
pysim/
|
pysim/
|
||||||
|
|
|
@ -115,12 +115,9 @@ void tdbPCacheRelease(SPCache *pCache, SPage *pPage, TXN *pTxn) {
|
||||||
tdbPCacheRemovePageFromHash(pCache, pPage);
|
tdbPCacheRemovePageFromHash(pCache, pPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// free the page
|
|
||||||
if (pTxn && pTxn->xFree) {
|
|
||||||
tdbPageDestroy(pPage, pTxn->xFree, pTxn->xArg);
|
tdbPageDestroy(pPage, pTxn->xFree, pTxn->xArg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
tdbPCacheUnlock(pCache);
|
tdbPCacheUnlock(pCache);
|
||||||
}
|
}
|
||||||
|
@ -195,6 +192,7 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
|
||||||
pPage->pPager = pPageH->pPager;
|
pPage->pPager = pPageH->pPager;
|
||||||
|
|
||||||
memcpy(pPage->pData, pPageH->pData, pPage->pageSize);
|
memcpy(pPage->pData, pPageH->pData, pPage->pageSize);
|
||||||
|
tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid));
|
memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid));
|
||||||
pPage->pLruNext = NULL;
|
pPage->pLruNext = NULL;
|
||||||
|
@ -294,7 +292,7 @@ static int tdbPCacheOpenImpl(SPCache *pCache) {
|
||||||
|
|
||||||
// Open the hash table
|
// Open the hash table
|
||||||
pCache->nPage = 0;
|
pCache->nPage = 0;
|
||||||
pCache->nHash = pCache->cacheSize;
|
pCache->nHash = pCache->cacheSize < 8 ? 8 : pCache->cacheSize;
|
||||||
pCache->pgHash = (SPage **)tdbOsCalloc(pCache->nHash, sizeof(SPage *));
|
pCache->pgHash = (SPage **)tdbOsCalloc(pCache->nHash, sizeof(SPage *));
|
||||||
if (pCache->pgHash == NULL) {
|
if (pCache->pgHash == NULL) {
|
||||||
// TODO
|
// TODO
|
||||||
|
|
|
@ -229,3 +229,86 @@ TEST(tdb_test, simple_test) {
|
||||||
ret = tdbEnvClose(pEnv);
|
ret = tdbEnvClose(pEnv);
|
||||||
GTEST_ASSERT_EQ(ret, 0);
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(tdb_test, simple_test2) {
|
||||||
|
int ret;
|
||||||
|
TENV *pEnv;
|
||||||
|
TDB *pDb;
|
||||||
|
FKeyComparator compFunc;
|
||||||
|
int nData = 10000;
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
// Open Env
|
||||||
|
ret = tdbEnvOpen("tdb", 1024, 0, &pEnv);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
// Create a database
|
||||||
|
compFunc = tKeyCmpr;
|
||||||
|
ret = tdbDbOpen("db.db", TDB_VARIANT_LEN, TDB_VARIANT_LEN, compFunc, pEnv, &pDb);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
char key[64];
|
||||||
|
char val[64];
|
||||||
|
int64_t txnid = 0;
|
||||||
|
SPoolMem *pPool;
|
||||||
|
|
||||||
|
// open the pool
|
||||||
|
pPool = openPool();
|
||||||
|
|
||||||
|
// start a transaction
|
||||||
|
txnid++;
|
||||||
|
tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED);
|
||||||
|
tdbBegin(pEnv, &txn);
|
||||||
|
|
||||||
|
for (int iData = 1; iData <= nData; iData++) {
|
||||||
|
sprintf(key, "key%d", iData);
|
||||||
|
sprintf(val, "value%d", iData);
|
||||||
|
ret = tdbDbInsert(pDb, key, strlen(key), val, strlen(val), &txn);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // Iterate to query the DB data
|
||||||
|
TDBC *pDBC;
|
||||||
|
void *pKey = NULL;
|
||||||
|
void *pVal = NULL;
|
||||||
|
int vLen, kLen;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
ret = tdbDbcOpen(pDb, &pDBC);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
ret = tdbDbNext(pDBC, &pKey, &kLen, &pVal, &vLen);
|
||||||
|
if (ret < 0) break;
|
||||||
|
|
||||||
|
std::cout.write((char *)pKey, kLen) /* << " " << kLen */ << " ";
|
||||||
|
std::cout.write((char *)pVal, vLen) /* << " " << vLen */;
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
GTEST_ASSERT_EQ(count, nData);
|
||||||
|
|
||||||
|
tdbDbcClose(pDBC);
|
||||||
|
|
||||||
|
TDB_FREE(pKey);
|
||||||
|
TDB_FREE(pVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// commit the transaction
|
||||||
|
tdbCommit(pEnv, &txn);
|
||||||
|
tdbTxnClose(&txn);
|
||||||
|
|
||||||
|
ret = tdbDbDrop(pDb);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
// Close a database
|
||||||
|
tdbDbClose(pDb);
|
||||||
|
|
||||||
|
// Close Env
|
||||||
|
ret = tdbEnvClose(pEnv);
|
||||||
|
GTEST_ASSERT_EQ(ret, 0);
|
||||||
|
}
|
Loading…
Reference in New Issue