ValueType Object::get_property_value_impl(ContextType& ctx, const Property &property) { verify_attached(); size_t column = property.table_column; if (is_nullable(property.type) && m_row.is_null(column)) return ctx.null_value(); if (is_array(property.type) && property.type != PropertyType::LinkingObjects) return ctx.box(List(m_realm, *m_row.get_table(), column, m_row.get_index())); switch (property.type & ~PropertyType::Flags) { case PropertyType::Bool: return ctx.box(m_row.get_bool(column)); case PropertyType::Int: return ctx.box(m_row.get_int(column)); case PropertyType::Float: return ctx.box(m_row.get_float(column)); case PropertyType::Double: return ctx.box(m_row.get_double(column)); case PropertyType::String: return ctx.box(m_row.get_string(column)); case PropertyType::Data: return ctx.box(m_row.get_binary(column)); case PropertyType::Date: return ctx.box(m_row.get_timestamp(column)); case PropertyType::Any: return ctx.box(m_row.get_mixed(column)); case PropertyType::Object: { auto linkObjectSchema = m_realm->schema().find(property.object_type); TableRef table = ObjectStore::table_for_object_type(m_realm->read_group(), property.object_type); return ctx.box(Object(m_realm, *linkObjectSchema, table->get(m_row.get_link(column)))); } case PropertyType::LinkingObjects: { auto target_object_schema = m_realm->schema().find(property.object_type); auto link_property = target_object_schema->property_for_name(property.link_origin_property_name); TableRef table = ObjectStore::table_for_object_type(m_realm->read_group(), target_object_schema->name); auto tv = m_row.get_table()->get_backlink_view(m_row.get_index(), table.get(), link_property->table_column); return ctx.box(Results(m_realm, std::move(tv))); } default: REALM_UNREACHABLE(); } }
void Object::set_property_value(ContextType& ctx, StringData prop_name, ValueType value, bool try_update) { verify_attached(); m_realm->verify_in_write(); auto& property = property_for_name(prop_name); // Modifying primary keys is allowed in migrations to make it possible to // add a new primary key to a type (or change the property type), but it // is otherwise considered the immutable identity of the row if (property.is_primary && !m_realm->is_in_migration()) throw std::logic_error("Cannot modify primary key after creation"); set_property_value_impl(ctx, property, value, try_update); }
ValueType Object::get_property_value(ContextType& ctx, StringData prop_name) { return get_property_value_impl<ValueType>(ctx, property_for_name(prop_name)); }
const Property *primary_key_property() const { return property_for_name(primary_key); }