don't validate when we only need an updated column mapping

This commit is contained in:
Ari Lazier 2015-06-05 13:13:08 -07:00
parent b5372a40e9
commit 094192a869
2 changed files with 21 additions and 9 deletions

View File

@ -20,6 +20,7 @@
#include <realm/link_view.hpp> #include <realm/link_view.hpp>
#include <realm/table_view.hpp> #include <realm/table_view.hpp>
#include <realm/util/assert.hpp>
using namespace realm; using namespace realm;
using namespace std; using namespace std;
@ -127,7 +128,7 @@ realm::TableRef ObjectStore::table_for_object_type_create_if_needed(realm::Group
return group->get_or_add_table(table_name_for_object_type(object_type), &created); return group->get_or_add_table(table_name_for_object_type(object_type), &created);
} }
std::vector<std::string> ObjectStore::validate_schema_and_update_column_mapping(realm::Group *group, ObjectSchema &target_schema) { std::vector<std::string> ObjectStore::validate_schema(realm::Group *group, ObjectSchema &target_schema) {
vector<string> validation_errors; vector<string> validation_errors;
ObjectSchema table_schema(group, target_schema.name); ObjectSchema table_schema(group, target_schema.name);
@ -176,6 +177,16 @@ std::vector<std::string> ObjectStore::validate_schema_and_update_column_mapping(
return validation_errors; return validation_errors;
} }
void ObjectStore::update_column_mapping(Group *group, ObjectSchema &target_schema) {
ObjectSchema table_schema(group, target_schema.name);
for (auto& target_prop:target_schema.properties) {
auto table_prop = table_schema.property_for_name(target_prop.name);
REALM_ASSERT_DEBUG(table_prop);
target_prop.table_column = table_prop->table_column;
}
}
static inline bool property_has_changed(Property &p1, Property &p2) { static inline bool property_has_changed(Property &p1, Property &p2) {
return p1.type != p2.type || p1.name != p2.name || p1.object_type != p2.object_type; return p1.type != p2.type || p1.name != p2.name || p1.object_type != p2.object_type;
} }
@ -283,7 +294,7 @@ bool ObjectStore::update_realm_with_schema(realm::Group *group,
// read-only realms may be missing tables entirely // read-only realms may be missing tables entirely
if (table) { if (table) {
auto errors = validate_schema_and_update_column_mapping(group, target_schema); auto errors = validate_schema(group, target_schema);
if (errors.size()) { if (errors.size()) {
throw ObjectStoreValidationException(errors, target_schema.name); throw ObjectStoreValidationException(errors, target_schema.name);
} }
@ -325,7 +336,7 @@ bool ObjectStore::indexes_are_up_to_date(Group *group, Schema &schema) {
continue; continue;
} }
validate_schema_and_update_column_mapping(group, object_schema); // FIXME we just need the column mapping update_column_mapping(group, object_schema);
for (auto& property:object_schema.properties) { for (auto& property:object_schema.properties) {
if (property.requires_index() != table->has_search_index(property.table_column)) { if (property.requires_index() != table->has_search_index(property.table_column)) {
return false; return false;

View File

@ -35,8 +35,12 @@ namespace realm {
static bool is_migration_required(realm::Group *group, uint64_t new_version); static bool is_migration_required(realm::Group *group, uint64_t new_version);
// verify a target schema against its table, setting the table_column property on each schema object // verify a target schema against its table, setting the table_column property on each schema object
// updates the column mapping on the target_schema
// returns array of validation errors // returns array of validation errors
static std::vector<std::string> validate_schema_and_update_column_mapping(Group *group, ObjectSchema &target_schema); static std::vector<std::string> validate_schema(Group *group, ObjectSchema &target_schema);
// updates the target_column member for all properties based on the column indexes in the passed in group
static void update_column_mapping(Group *group, ObjectSchema &target_schema);
// updates a Realm to a given target schema/version creating tables and updating indexes as necessary // updates a Realm to a given target schema/version creating tables and updating indexes as necessary
// returns if any changes were made // returns if any changes were made
@ -45,10 +49,7 @@ namespace realm {
// NOTE: must be performed within a write transaction // NOTE: must be performed within a write transaction
typedef std::function<void()> MigrationFunction; typedef std::function<void()> MigrationFunction;
typedef std::vector<ObjectSchema> Schema; typedef std::vector<ObjectSchema> Schema;
static bool update_realm_with_schema(Group *group, static bool update_realm_with_schema(Group *group, uint64_t version, Schema &schema, MigrationFunction migration);
uint64_t version,
Schema &schema,
MigrationFunction migration);
// get a table for an object type // get a table for an object type
static realm::TableRef table_for_object_type(Group *group, StringData object_type); static realm::TableRef table_for_object_type(Group *group, StringData object_type);