filesbox/app/filesbox_ios/FilesBox/Pods/Realm/include/object.hpp
2023-09-21 10:53:23 +08:00

161 lines
6.1 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2017 Realm Inc.
//
// Licensed 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.
//
////////////////////////////////////////////////////////////////////////////
#ifndef REALM_OS_OBJECT_HPP
#define REALM_OS_OBJECT_HPP
#include "impl/collection_notifier.hpp"
#include <realm/row.hpp>
namespace realm {
class ObjectSchema;
struct Property;
using RowExpr = BasicRowExpr<Table>;
namespace _impl {
class ObjectNotifier;
}
class Object {
public:
Object();
Object(std::shared_ptr<Realm> r, ObjectSchema const& s, RowExpr const& o);
Object(std::shared_ptr<Realm> r, StringData object_type, size_t ndx);
Object(Object const&);
Object(Object&&);
Object& operator=(Object const&);
Object& operator=(Object&&);
~Object();
std::shared_ptr<Realm> const& realm() const { return m_realm; }
ObjectSchema const& get_object_schema() const { return *m_object_schema; }
RowExpr row() const { return m_row; }
bool is_valid() const { return m_row.is_attached(); }
NotificationToken add_notification_callback(CollectionChangeCallback callback) &;
void ensure_user_in_everyone_role();
void ensure_private_role_exists_for_user();
// The following functions require an accessor context which converts from
// the binding's native data types to the core data types. See CppContext
// for a reference implementation of such a context.
//
// The actual definitions of these templated functions is in object_accessor.hpp
// property getter/setter
template<typename ValueType, typename ContextType>
void set_property_value(ContextType& ctx, StringData prop_name,
ValueType value, bool try_update);
template<typename ValueType, typename ContextType>
ValueType get_property_value(ContextType& ctx, StringData prop_name);
template<typename ValueType, typename ContextType>
ValueType get_property_value(ContextType& ctx, const Property& property);
// create an Object from a native representation
template<typename ValueType, typename ContextType>
static Object create(ContextType& ctx, std::shared_ptr<Realm> const& realm,
const ObjectSchema &object_schema, ValueType value,
bool try_update = false, bool update_only_diff = false,
size_t current_row = size_t(-1), Row* = nullptr);
template<typename ValueType, typename ContextType>
static Object create(ContextType& ctx, std::shared_ptr<Realm> const& realm,
StringData object_type, ValueType value,
bool try_update = false, bool update_only_diff = false,
size_t current_row = size_t(-1), Row* = nullptr);
template<typename ValueType, typename ContextType>
static Object get_for_primary_key(ContextType& ctx,
std::shared_ptr<Realm> const& realm,
const ObjectSchema &object_schema,
ValueType primary_value);
template<typename ValueType, typename ContextType>
static Object get_for_primary_key(ContextType& ctx,
std::shared_ptr<Realm> const& realm,
StringData object_type,
ValueType primary_value);
private:
friend class Results;
std::shared_ptr<Realm> m_realm;
const ObjectSchema *m_object_schema;
Row m_row;
_impl::CollectionNotifier::Handle<_impl::ObjectNotifier> m_notifier;
template<typename ValueType, typename ContextType>
void set_property_value_impl(ContextType& ctx, const Property &property,
ValueType value, bool try_update, bool update_only_diff, bool is_default);
template<typename ValueType, typename ContextType>
ValueType get_property_value_impl(ContextType& ctx, const Property &property);
template<typename ValueType, typename ContextType>
static size_t get_for_primary_key_impl(ContextType& ctx, Table const& table,
const Property &primary_prop, ValueType primary_value);
void verify_attached() const;
Property const& property_for_name(StringData prop_name) const;
};
struct InvalidatedObjectException : public std::logic_error {
InvalidatedObjectException(const std::string& object_type);
const std::string object_type;
};
struct InvalidPropertyException : public std::logic_error {
InvalidPropertyException(const std::string& object_type, const std::string& property_name);
const std::string object_type;
const std::string property_name;
};
struct MissingPropertyValueException : public std::logic_error {
MissingPropertyValueException(const std::string& object_type, const std::string& property_name);
const std::string object_type;
const std::string property_name;
};
struct MissingPrimaryKeyException : public std::logic_error {
MissingPrimaryKeyException(const std::string& object_type);
const std::string object_type;
};
struct ReadOnlyPropertyException : public std::logic_error {
ReadOnlyPropertyException(const std::string& object_type, const std::string& property_name);
const std::string object_type;
const std::string property_name;
};
struct ModifyPrimaryKeyException : public std::logic_error {
ModifyPrimaryKeyException(const std::string& object_type, const std::string& property_name);
const std::string object_type;
const std::string property_name;
};
} // namespace realm
#endif // REALM_OS_OBJECT_HPP