From 88783e1ec28c326974f808d91c1531391d38acb5 Mon Sep 17 00:00:00 2001 From: zhao liwei Date: Tue, 20 Apr 2021 10:32:54 +0800 Subject: [PATCH] refactor: add some base classes to refactor pegasus_value_schema (#709) --- src/base/pegasus_value_schema.h | 29 +++++++++++++++ src/base/value_field.h | 34 +++++++++++++++++ src/base/value_schema_manager.cpp | 62 +++++++++++++++++++++++++++++++ src/base/value_schema_manager.h | 43 +++++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 src/base/value_field.h create mode 100644 src/base/value_schema_manager.cpp create mode 100644 src/base/value_schema_manager.h diff --git a/src/base/pegasus_value_schema.h b/src/base/pegasus_value_schema.h index e82a22c4cd..76f6c354a0 100644 --- a/src/base/pegasus_value_schema.h +++ b/src/base/pegasus_value_schema.h @@ -32,6 +32,8 @@ #include #include +#include "value_field.h" + namespace pegasus { constexpr int PEGASUS_DATA_VERSION_MAX = 1u; @@ -234,4 +236,31 @@ class pegasus_value_generator std::vector _write_slices; }; +enum data_version +{ + /// TBD(zlw) +}; + +struct value_params +{ + std::map> fields; + /// TBD(zlw) +}; + +class value_schema +{ +public: + virtual ~value_schema() = default; + + virtual std::unique_ptr extract_field(dsn::string_view value, + value_field_type type) = 0; + /// Extracts user value from the raw rocksdb value. + /// In order to avoid data copy, the ownership of `raw_value` will be transferred + /// into the returned blob value. + virtual dsn::blob extract_user_data(std::string &&value) = 0; + virtual void update_field(std::string &value, std::unique_ptr field) = 0; + virtual rocksdb::SliceParts generate_value(const value_params ¶ms) = 0; + + virtual data_version version() const = 0; +}; } // namespace pegasus diff --git a/src/base/value_field.h b/src/base/value_field.h new file mode 100644 index 0000000000..0f39991a45 --- /dev/null +++ b/src/base/value_field.h @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +namespace pegasus { + +enum value_field_type +{ + /// TBD(zlw) +}; + +struct value_field +{ + virtual ~value_field() = default; + virtual value_field_type type() = 0; +}; +} // namespace pegasus diff --git a/src/base/value_schema_manager.cpp b/src/base/value_schema_manager.cpp new file mode 100644 index 0000000000..870e2b8d5e --- /dev/null +++ b/src/base/value_schema_manager.cpp @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "value_schema_manager.h" + +namespace pegasus { + +void value_schema_manager::register_schema(value_schema *schema) +{ + /// TBD(zlw) +} + +value_schema *value_schema_manager::get_value_schema(uint32_t meta_cf_data_version, + dsn::string_view value) const +{ + /// TBD(zlw) + return nullptr; +} + +value_schema *value_schema_manager::get_value_schema(uint32_t version) const +{ + /// TBD(zlw) + return nullptr; +} + +value_schema *value_schema_manager::get_latest_value_schema() const +{ + /// TBD(zlw) + return nullptr; +} + +/** + * If someone wants to add a new data version, he only need to implement the new value schema, + * and register it here. + */ +void register_value_schemas() +{ + /// TBD(zlw) +} + +struct value_schemas_registerer +{ + value_schemas_registerer() { register_value_schemas(); } +}; +static value_schemas_registerer value_schemas_reg; +} // namespace pegasus diff --git a/src/base/value_schema_manager.h b/src/base/value_schema_manager.h new file mode 100644 index 0000000000..00a22fbdc2 --- /dev/null +++ b/src/base/value_schema_manager.h @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#pragma once + +#include "pegasus_value_schema.h" +#include + +namespace pegasus { + +class value_schema_manager : public dsn::utils::singleton +{ +public: + void register_schema(value_schema *schema); + /// using the raw value in rocksdb and data version stored in meta column family to get data + /// version + value_schema *get_value_schema(uint32_t meta_cf_data_version, dsn::string_view value) const; + value_schema *get_value_schema(uint32_t version) const; + value_schema *get_latest_value_schema() const; + +private: + value_schema_manager() = default; + friend class dsn::utils::singleton; + + std::array _schemas; +}; +} // namespace pegasus