提交 f4359a6f 编写于 作者: H Hongze Cheng

more TDB

上级 212e24dd
...@@ -207,6 +207,7 @@ int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen ...@@ -207,6 +207,7 @@ int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen
SBTC btc; SBTC btc;
SCell *pCell; SCell *pCell;
int cret; int cret;
void *pVal;
SCellDecoder cd; SCellDecoder cd;
tdbBtreeCursor(&btc, pBt); tdbBtreeCursor(&btc, pBt);
...@@ -221,12 +222,12 @@ int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen ...@@ -221,12 +222,12 @@ int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen
tdbBtreeDecodeCell(btc.pPage, pCell, &cd); tdbBtreeDecodeCell(btc.pPage, pCell, &cd);
*vLen = cd.vLen; *vLen = cd.vLen;
// TODO: here may have memory leak pVal = TDB_REALLOC(*ppVal, *vLen);
*ppVal = realloc(*ppVal, *vLen); if (pVal == NULL) {
if (*ppVal == NULL) {
return -1; return -1;
} }
*ppVal = pVal;
memcpy(*ppVal, cd.pVal, cd.vLen); memcpy(*ppVal, cd.pVal, cd.vLen);
return 0; return 0;
} }
......
...@@ -39,6 +39,28 @@ int tdbGetFileSize(const char *fname, int pgSize, SPgno *pSize); ...@@ -39,6 +39,28 @@ int tdbGetFileSize(const char *fname, int pgSize, SPgno *pSize);
int tdbPRead(int fd, void *pData, int count, i64 offset); int tdbPRead(int fd, void *pData, int count, i64 offset);
#define TDB_REALLOC(PTR, SIZE) \
({ \
void *nPtr; \
if ((PTR) == NULL || ((int *)(PTR))[-1] < (SIZE)) { \
nPtr = realloc((PTR) ? (char *)(PTR) - sizeof(int) : NULL, (SIZE) + sizeof(int)); \
if (nPtr) { \
((int *)nPtr)[0] = (SIZE); \
nPtr = (char *)nPtr + sizeof(int); \
} \
} else { \
nPtr = (PTR); \
} \
nPtr; \
})
#define TDB_FREE(PTR) \
do { \
if (PTR) { \
free((char *)(PTR) - sizeof(int)); \
} \
} while (0)
static inline void *tdbOsMalloc(void *arg, size_t size) { static inline void *tdbOsMalloc(void *arg, size_t size) {
void *ptr; void *ptr;
......
...@@ -44,6 +44,8 @@ TEST(tdb_test, simple_test) { ...@@ -44,6 +44,8 @@ TEST(tdb_test, simple_test) {
GTEST_ASSERT_EQ(vLen, strlen(val)); GTEST_ASSERT_EQ(vLen, strlen(val));
GTEST_ASSERT_EQ(memcmp(val, pVal, vLen), 0); GTEST_ASSERT_EQ(memcmp(val, pVal, vLen), 0);
} }
TDB_FREE(pVal);
} }
{ // Loop to query the data { // Loop to query the data
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册