feat: get latest schema

This commit is contained in:
Hongze Cheng 2022-05-28 07:10:59 +00:00
parent b350d0025d
commit c55b402777
1 changed files with 41 additions and 33 deletions

View File

@ -155,44 +155,52 @@ int metaTbCursorNext(SMTbCursor *pTbCur) {
} }
SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline) { SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline) {
void *pKey = NULL; void *pData = NULL;
void *pVal = NULL; int nData = 0;
int kLen = 0; int64_t version;
int vLen = 0; SSchemaWrapper schema = {0};
int ret; SSchemaWrapper *pSchema = NULL;
SSkmDbKey skmDbKey; SDecoder dc = {0};
SSchemaWrapper *pSW = NULL;
SSchema *pSchema = NULL;
void *pBuf;
SDecoder coder = {0};
// fetch
skmDbKey.uid = uid;
skmDbKey.sver = sver;
pKey = &skmDbKey;
kLen = sizeof(skmDbKey);
metaRLock(pMeta); metaRLock(pMeta);
ret = tdbTbGet(pMeta->pSkmDb, pKey, kLen, &pVal, &vLen); if (sver < 0) {
metaULock(pMeta); if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData) < 0) {
if (ret < 0) { goto _err;
return NULL;
} }
// decode version = *(int64_t *)pData;
pBuf = pVal;
pSW = taosMemoryMalloc(sizeof(SSchemaWrapper));
tDecoderInit(&coder, pVal, vLen); tdbTbGet(pMeta->pTbDb, &(STbDbKey){.uid = uid, .version = version}, sizeof(STbDbKey), &pData, &nData);
tDecodeSSchemaWrapper(&coder, pSW);
pSchema = taosMemoryMalloc(sizeof(SSchema) * pSW->nCols);
memcpy(pSchema, pSW->pSchema, sizeof(SSchema) * pSW->nCols);
tDecoderClear(&coder);
pSW->pSchema = pSchema; SMetaEntry me = {0};
tDecoderInit(&dc, pData, nData);
metaDecodeEntry(&dc, &me);
if (me.type == TSDB_SUPER_TABLE) {
pSchema = tCloneSSchemaWrapper(&me.stbEntry.schemaRow);
} else if (me.type == TSDB_NORMAL_TABLE) {
} else {
ASSERT(0);
}
tDecoderClear(&dc);
} else {
if (tdbTbGet(pMeta->pSkmDb, &(SSkmDbKey){.uid = uid, .sver = sver}, sizeof(SSkmDbKey), &pData, &nData) < 0) {
goto _err;
}
tdbFree(pVal); tDecoderInit(&dc, pData, nData);
tDecodeSSchemaWrapper(&dc, &schema);
pSchema = tCloneSSchemaWrapper(&schema);
tDecoderClear(&dc);
}
return pSW; metaULock(pMeta);
tdbFree(pData);
return pSchema;
_err:
metaULock(pMeta);
tdbFree(pData);
return NULL;
} }
struct SMCtbCursor { struct SMCtbCursor {