Skip to content

Commit

Permalink
refactor: add some base classes to refactor pegasus_value_schema (#709)
Browse files Browse the repository at this point in the history
  • Loading branch information
levy5307 authored Apr 20, 2021
1 parent c248f02 commit 88783e1
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/base/pegasus_value_schema.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -234,4 +236,31 @@ class pegasus_value_generator
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
34 changes: 34 additions & 0 deletions src/base/value_field.h
Original file line number Diff line number Diff line change
@@ -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
62 changes: 62 additions & 0 deletions src/base/value_schema_manager.cpp
Original file line number Diff line number Diff line change
@@ -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
43 changes: 43 additions & 0 deletions src/base/value_schema_manager.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 88783e1

Please sign in to comment.