761417898 commented on code in PR #522: URL: https://github.com/apache/tsfile/pull/522#discussion_r2163283090
########## cpp/src/file/tsfile_io_reader.cc: ########## @@ -478,36 +521,97 @@ int TsFileIOReader::search_from_internal_node( if (RET_FAIL(read_file_->read(index_entry->get_offset(), data_buf, read_size, ret_read_len))) { } else if (read_size != ret_read_len) { - ret = E_TSFILE_CORRUPTED; - } else if (RET_FAIL(cur_level_index_node->device_deserialize_from( - data_buf, read_size))) { + return E_TSFILE_CORRUPTED; + } + if (!is_device) { + ret = cur_level_index_node->deserialize_from(data_buf, read_size); } else { - if (cur_level_index_node->node_type_ == LEAF_DEVICE) { + ret = cur_level_index_node->device_deserialize_from(data_buf, read_size); + } + if (ret != E_OK) { + return ret; + } + if (cur_level_index_node->node_type_ == LEAF_DEVICE) { ret = cur_level_index_node->binary_search_children( target_name, /*exact=*/true, ret_index_entry, ret_end_offset); cur_level_index_node->destroy(); return ret; //// FIXME - } else if (cur_level_index_node->node_type_ == LEAF_MEASUREMENT) { + } else if (cur_level_index_node->node_type_ == LEAF_MEASUREMENT) { ret = cur_level_index_node->binary_search_children( target_name, /*exact=*/false, ret_index_entry, ret_end_offset); cur_level_index_node->destroy(); return ret; //// FIXME - } else { + } else { ret = cur_level_index_node->binary_search_children( target_name, /*exact=*/false, index_entry, end_offset); cur_level_index_node->destroy(); - } } } return ret; } +bool TsFileIOReader::is_aligned_device(std::shared_ptr<MetaIndexNode> measurement_node) { + auto entry = measurement_node->children_[0]; + return entry->get_name().is_null() || entry->get_name().to_std_string() == ""; +} + +int TsFileIOReader::get_time_column_metadata( + std::shared_ptr<MetaIndexNode> measurement_node, + TimeseriesIndex*& ret_timeseries_index, PageArena& pa) { + int ret = E_OK; + if (!is_aligned_device(measurement_node)) { + return ret; + } + char* ti_buf = nullptr; + int start_idx = 0, end_idx = 0; + int ret_read_len = 0; + if (measurement_node->node_type_ == LEAF_MEASUREMENT) { + ByteStream buffer; + if (measurement_node->children_.size() > 1) { + start_idx = measurement_node->children_[0]->get_offset(); + end_idx = measurement_node->children_[1]->get_offset(); + ti_buf = pa.alloc(end_idx - start_idx); + if (RET_FAIL( + read_file_->read(start_idx, ti_buf, end_idx - start_idx, + ret_read_len))) { + return ret; + } Review Comment: The memory is automatically freed when PageArena's destructor runs. If ret fails, the PageArena's owner ensures to destroy it. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@tsfile.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org