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 &params) = 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