diff --git a/src/common/inc/dataformat.h b/src/common/inc/dataformat.h index cc13ab2eca3d2ee6281257626b69b490784569e5..c263f4128b7c2c70e386b3a1537f51cbdac7e92d 100644 --- a/src/common/inc/dataformat.h +++ b/src/common/inc/dataformat.h @@ -51,18 +51,20 @@ void tdSetCol(STColumn *pCol, int8_t type, int16_t colId, int32_t bytes); // ----------------- TSDB SCHEMA DEFINITION typedef struct { - int32_t numOfCols; - int32_t padding; // TODO: replace the padding for useful variable + int numOfCols; // Number of columns appended + int totalCols; // Total columns allocated STColumn columns[]; } STSchema; #define schemaNCols(s) ((s)->numOfCols) +#define schemaTCols(s) ((s)->totalCols) #define schemaColAt(s, i) ((s)->columns + i) STSchema *tdNewSchema(int32_t nCols); +int tdSchemaAppendCol(STSchema *pSchema, int8_t type, int16_t colId, int16_t bytes); STSchema *tdDupSchema(STSchema *pSchema); -void tdFreeSchema(STSchema *pSchema); -void tdUpdateSchema(STSchema *pSchema); +void tdFreeSchema(STSchema *pSchema); +void tdUpdateSchema(STSchema *pSchema); // ----------------- Data row structure diff --git a/src/common/src/dataformat.c b/src/common/src/dataformat.c index 064cb3ff29404b43e6beed99696a5dac33abdd17..ce07afd17d082787fd77ebb16b4eb95ffc54ebc2 100644 --- a/src/common/src/dataformat.c +++ b/src/common/src/dataformat.c @@ -89,13 +89,40 @@ void tdSetCol(STColumn *pCol, int8_t type, int16_t colId, int32_t bytes) { STSchema *tdNewSchema(int32_t nCols) { int32_t size = sizeof(STSchema) + sizeof(STColumn) * nCols; - STSchema *pSchema = (STSchema *)calloc(1, size); + STSchema *pSchema = (STSchema *)malloc(size); if (pSchema == NULL) return NULL; - pSchema->numOfCols = nCols; + pSchema->numOfCols = 0; + pSchema->totalCols = nCols; return pSchema; } +/** + * Append a column to the schema + */ +int tdSchemaAppendCol(STSchema *pSchema, int8_t type, int16_t colId, int16_t bytes) { + if (pSchema->numOfCols >= pSchema->totalCols) return -1; + if (!isValidDataType(type, 0)) return -1; + + STColumn *pCol = schemaColAt(pSchema, schemaNCols(pSchema)); + colSetType(pCol, type); + colSetColId(pCol, colId); + colSetOffset(pCol, -1); + switch (type) { + case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_NCHAR: + colSetBytes(pCol, bytes); + break; + default: + colSetBytes(pCol, TYPE_BYTES[type]); + break; + } + + pSchema->numOfCols++; + + return 0; +} + /** * Duplicate the schema and return a new object */ diff --git a/src/vnode/tsdb/CMakeLists.txt b/src/vnode/tsdb/CMakeLists.txt index 1317e32b51cd88bee64ca8e56ae15d4da9c50c46..8a7c7a1a5197e3e47ed7e36cdb2ebcdcef2d6b49 100644 --- a/src/vnode/tsdb/CMakeLists.txt +++ b/src/vnode/tsdb/CMakeLists.txt @@ -15,5 +15,5 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM)) TARGET_LINK_LIBRARIES(tsdb common tutil) # Someone has no gtest directory, so comment it - #ADD_SUBDIRECTORY(tests) + ADD_SUBDIRECTORY(tests) ENDIF () diff --git a/src/vnode/tsdb/src/tsdbMain.c b/src/vnode/tsdb/src/tsdbMain.c index 2842f40466dba8d6818283dcae3eec54ad945512..147dcff2a5a24eaf59ceacdc1ece069c566a39aa 100644 --- a/src/vnode/tsdb/src/tsdbMain.c +++ b/src/vnode/tsdb/src/tsdbMain.c @@ -347,7 +347,7 @@ int tsdbInitTableCfg(STableCfg *config, TSDB_TABLE_TYPE type, int64_t uid, int32 config->superUid = TSDB_INVALID_SUPER_TABLE_ID; config->tableId.uid = uid; config->tableId.tid = tid; - return -1; + return 0; } /** diff --git a/src/vnode/tsdb/tests/tsdbTests.cpp b/src/vnode/tsdb/tests/tsdbTests.cpp index 9e88e156a9a1cb2e80d840fc85aeaec4f46b3326..757fd10017355ec0435323ebd9792c7851ec6ded 100644 --- a/src/vnode/tsdb/tests/tsdbTests.cpp +++ b/src/vnode/tsdb/tests/tsdbTests.cpp @@ -3,92 +3,36 @@ #include "tsdb.h" #include "dataformat.h" -#include "tsdbMeta.h" TEST(TsdbTest, createRepo) { STsdbCfg config; - // Create a tsdb repository + // 1. Create a tsdb repository tsdbSetDefaultCfg(&config); tsdb_repo_t *pRepo = tsdbCreateRepo("/home/ubuntu/work/ttest/vnode0", &config, NULL); ASSERT_NE(pRepo, nullptr); - // // create a normal table in this repository - // STableCfg config; - // config.tableId.tid = 0; - // config.tableId.uid = 98868728187539L; - // config.numOfCols = 5; - // config.schema = tdNewSchema(config.numOfCols); - // STColumn *pCol = tdNewCol(TSDB_DATA_TYPE_TIMESTAMP, 0, 0); - // tdColCpy(schemaColAt(config.schema, 0), pCol); - // tdFreeCol(pCol); - // for (int i = 1; i < schemaNCols(config.schema); i++) { - // pCol = tdNewCol(TSDB_DATA_TYPE_BIGINT, i, 0); - // tdColCpy(schemaColAt(config.schema, i), pCol); - // tdFreeCol(pCol); - // } - - // tsdbCreateTable(pRepo, &config); - // Write some data - - // int32_t size = sizeof(SSubmitMsg) + sizeof(SSubmitBlock) + tdMaxRowDataBytes(config.schema) * 10 + sizeof(int32_t); - - // tdUpdateSchema(config.schema); - - // SSubmitMsg *pMsg = (SSubmitMsg *)malloc(size); - // pMsg->numOfTables = 1; // TODO: use api - - // SSubmitBlock *pBlock = (SSubmitBlock *)pMsg->data; - // pBlock->tableId = {.uid = 98868728187539L, .tid = 0}; - // pBlock->sversion = 0; - // pBlock->len = sizeof(SSubmitBlock); - - // SDataRows rows = pBlock->data; - // dataRowsInit(rows); - - // SDataRow row = tdNewDataRow(tdMaxRowDataBytes(config.schema)); - // int64_t ttime = 1583508800000; - // for (int i = 0; i < 10; i++) { // loop over rows - // ttime += (10000 * i); - // tdDataRowReset(row); - // for (int j = 0; j < schemaNCols(config.schema); j++) { - // if (j == 0) { // set time stamp - // tdAppendColVal(row, (void *)(&ttime), schemaColAt(config.schema, j), 40); - // } else { // set other fields - // int32_t val = 10; - // tdAppendColVal(row, (void *)(&val), schemaColAt(config.schema, j), 40); - // } - // } - - // tdDataRowsAppendRow(rows, row); - // } + // 2. Create a normal table + STableCfg tCfg; + ASSERT_EQ(tsdbInitTableCfg(&tCfg, TSDB_SUPER_TABLE, 987607499877672L, 0), -1); + ASSERT_EQ(tsdbInitTableCfg(&tCfg, TSDB_NTABLE, 987607499877672L, 0), 0); + + int nCols = 5; + STSchema *schema = tdNewSchema(nCols); + + for (int i = 0; i < nCols; i++) + { + if (i == 0) { + tdSchemaAppendCol(schema, TSDB_DATA_TYPE_TIMESTAMP, i, -1); + } else { + tdSchemaAppendCol(schema, TSDB_DATA_TYPE_INT, i, -1); + } + } - // tsdbInsertData(pRepo, pMsg); + tsdbTableSetSchema(&tCfg, schema, true); - // tdFreeDataRow(row); + tsdbCreateTable(pRepo, &tCfg); - // tdFreeSchema(config.schema); - // tsdbDropRepo(pRepo); + // 3. Loop to write some simple data } -TEST(TsdbTest, DISABLED_createTable) { - STsdbMeta *pMeta = tsdbInitMeta(100); - ASSERT_NE(pMeta, nullptr); - - STableCfg config; - config.tableId.tid = 0; - config.tableId.uid = 98868728187539L; - config.numOfCols = 5; - config.schema = tdNewSchema(config.numOfCols); - for (int i = 0; i < schemaNCols(config.schema); i++) { - STColumn *pCol = tdNewCol(TSDB_DATA_TYPE_BIGINT, i, 0); - tdColCpy(schemaColAt(config.schema, i), pCol); - tdFreeCol(pCol); - } - config.tagValues = nullptr; - - tsdbCreateTableImpl(pMeta, &config); - - STable *pTable = tsdbGetTableByUid(pMeta, config.tableId.uid); - ASSERT_NE(pTable, nullptr); -}