refactor: add some base classes to refactor pegasus_value_schema (#709)
diff --git a/src/base/pegasus_value_schema.h b/src/base/pegasus_value_schema.h
index e82a22c..76f6c35 100644
--- a/src/base/pegasus_value_schema.h
+++ b/src/base/pegasus_value_schema.h
@@ -32,6 +32,8 @@
#include <dsn/service_api_c.h>
#include <rocksdb/slice.h>
+#include "value_field.h"
+
namespace pegasus {
constexpr int PEGASUS_DATA_VERSION_MAX = 1u;
@@ -234,4 +236,31 @@
std::vector<rocksdb::Slice> _write_slices;
};
+enum data_version
+{
+ /// TBD(zlw)
+};
+
+struct value_params
+{
+ std::map<value_field_type, std::unique_ptr<value_field>> fields;
+ /// TBD(zlw)
+};
+
+class value_schema
+{
+public:
+ virtual ~value_schema() = default;
+
+ virtual std::unique_ptr<value_field> 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<value_field> 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 0000000..0f39991
--- /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 0000000..870e2b8
--- /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 0000000..00a22fb
--- /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 <dsn/utility/singleton.h>
+
+namespace pegasus {
+
+class value_schema_manager : public dsn::utils::singleton<value_schema_manager>
+{
+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<value_schema_manager>;
+
+ std::array<value_schema *, 2> _schemas;
+};
+} // namespace pegasus