more TDB
This commit is contained in:
parent
212e24dda6
commit
f4359a6fb3
|
@ -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
|
||||||
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);
|
||||||
|
|
||||||
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) {
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue