Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/ios.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarinofaggiana <marino@marinofaggiana.com>2020-07-22 19:17:30 +0300
committermarinofaggiana <marino@marinofaggiana.com>2020-07-22 19:17:30 +0300
commitda30429efbcba72b5f9bea305b7a50416fcd102f (patch)
tree5f2f9bf2db8414880d72f3fc1cd688767a05b1b8 /Carthage
parent789aa9ec8e14743260b8c80037c65d21976553ca (diff)
coding
Diffstat (limited to 'Carthage')
-rw-r--r--Carthage/Checkouts/realm-cocoa/.gitignore2
-rw-r--r--Carthage/Checkouts/realm-cocoa/.jenkins.yml165
-rw-r--r--Carthage/Checkouts/realm-cocoa/.travis.yml2
-rw-r--r--Carthage/Checkouts/realm-cocoa/CHANGELOG.md98
-rw-r--r--Carthage/Checkouts/realm-cocoa/Jenkinsfile.releasability2
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/dependencies.list4
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.cpp17
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.hpp1
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object_accessor.hpp105
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/property.hpp13
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/thread_safe_reference.cpp15
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/tests/migrations.cpp208
-rw-r--r--Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist4
-rwxr-xr-xCarthage/Checkouts/realm-cocoa/build.sh2
-rw-r--r--Carthage/Checkouts/realm-cocoa/dependencies.list6
-rwxr-xr-xCarthage/Checkouts/realm-cocoa/examples/installation/build.sh18
-rwxr-xr-xCarthage/Checkouts/realm-cocoa/scripts/package_examples.rb2
17 files changed, 582 insertions, 82 deletions
diff --git a/Carthage/Checkouts/realm-cocoa/.gitignore b/Carthage/Checkouts/realm-cocoa/.gitignore
index 158877276..f460e8092 100644
--- a/Carthage/Checkouts/realm-cocoa/.gitignore
+++ b/Carthage/Checkouts/realm-cocoa/.gitignore
@@ -117,3 +117,5 @@ Realm/ObjectServerTests/node_modules
.swiftpm
.build
Package.resolved
+
+examples/installation/ios/swift/SwiftPackageManagerExample/SwiftPackageManagerExample.xcodeproj
diff --git a/Carthage/Checkouts/realm-cocoa/.jenkins.yml b/Carthage/Checkouts/realm-cocoa/.jenkins.yml
index df5a470b9..192222ec9 100644
--- a/Carthage/Checkouts/realm-cocoa/.jenkins.yml
+++ b/Carthage/Checkouts/realm-cocoa/.jenkins.yml
@@ -7,6 +7,7 @@ xcode_version:
- 11.3
- 11.4.1
- 11.5
+ - 11.6
- 12.0
target:
- docs
@@ -62,6 +63,14 @@ exclude:
target: docs
configuration: Release
+ - xcode_version: 11.6
+ target: docs
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: docs
+ configuration: Release
+
- xcode_version: 12.0
target: docs
configuration: Debug
@@ -90,6 +99,14 @@ exclude:
target: swiftlint
configuration: Release
+ - xcode_version: 11.6
+ target: swiftlint
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: swiftlint
+ configuration: Release
+
- xcode_version: 12.0
target: swiftlint
configuration: Debug
@@ -114,6 +131,14 @@ exclude:
target: osx-encryption
configuration: Release
+ - xcode_version: 11.6
+ target: osx-encryption
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: osx-encryption
+ configuration: Release
+
- xcode_version: 12.0
target: osx-encryption
configuration: Debug
@@ -138,6 +163,14 @@ exclude:
target: osx-object-server
configuration: Release
+ - xcode_version: 11.6
+ target: osx-object-server
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: osx-object-server
+ configuration: Release
+
- xcode_version: 12.0
target: osx-object-server
configuration: Debug
@@ -162,6 +195,14 @@ exclude:
target: ios-static
configuration: Release
+ - xcode_version: 11.6
+ target: ios-static
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: ios-static
+ configuration: Release
+
- xcode_version: 12.0
target: ios-static
configuration: Debug
@@ -186,6 +227,14 @@ exclude:
target: ios-dynamic
configuration: Release
+ - xcode_version: 11.6
+ target: ios-dynamic
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: ios-dynamic
+ configuration: Release
+
- xcode_version: 12.0
target: ios-dynamic
configuration: Debug
@@ -210,6 +259,14 @@ exclude:
target: watchos
configuration: Release
+ - xcode_version: 11.6
+ target: watchos
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: watchos
+ configuration: Release
+
- xcode_version: 12.0
target: watchos
configuration: Debug
@@ -234,6 +291,14 @@ exclude:
target: tvos
configuration: Release
+ - xcode_version: 11.6
+ target: tvos
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: tvos
+ configuration: Release
+
- xcode_version: 12.0
target: tvos
configuration: Debug
@@ -258,6 +323,14 @@ exclude:
target: ios-swift
configuration: Release
+ - xcode_version: 11.6
+ target: ios-swift
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: ios-swift
+ configuration: Release
+
- xcode_version: 12.0
target: ios-swift
configuration: Debug
@@ -282,6 +355,14 @@ exclude:
target: tvos-swift
configuration: Release
+ - xcode_version: 11.6
+ target: tvos-swift
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: tvos-swift
+ configuration: Release
+
- xcode_version: 12.0
target: tvos-swift
configuration: Debug
@@ -306,6 +387,14 @@ exclude:
target: catalyst
configuration: Release
+ - xcode_version: 11.6
+ target: catalyst
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: catalyst
+ configuration: Release
+
- xcode_version: 12.0
target: catalyst
configuration: Debug
@@ -330,6 +419,14 @@ exclude:
target: catalyst-swift
configuration: Release
+ - xcode_version: 11.6
+ target: catalyst-swift
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: catalyst-swift
+ configuration: Release
+
- xcode_version: 12.0
target: catalyst-swift
configuration: Debug
@@ -358,6 +455,14 @@ exclude:
target: xcframework
configuration: Release
+ - xcode_version: 11.6
+ target: xcframework
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: xcframework
+ configuration: Release
+
- xcode_version: 12.0
target: xcframework
configuration: Debug
@@ -374,6 +479,10 @@ exclude:
target: cocoapods-osx
configuration: Debug
+ - xcode_version: 11.6
+ target: cocoapods-osx
+ configuration: Debug
+
- xcode_version: 12.0
target: cocoapods-osx
configuration: Debug
@@ -398,6 +507,14 @@ exclude:
target: cocoapods-ios
configuration: Release
+ - xcode_version: 11.6
+ target: cocoapods-ios
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: cocoapods-ios
+ configuration: Release
+
- xcode_version: 12.0
target: cocoapods-ios
configuration: Debug
@@ -422,6 +539,14 @@ exclude:
target: cocoapods-ios-dynamic
configuration: Release
+ - xcode_version: 11.6
+ target: cocoapods-ios-dynamic
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: cocoapods-ios-dynamic
+ configuration: Release
+
- xcode_version: 12.0
target: cocoapods-ios-dynamic
configuration: Debug
@@ -446,6 +571,14 @@ exclude:
target: cocoapods-watchos
configuration: Release
+ - xcode_version: 11.6
+ target: cocoapods-watchos
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: cocoapods-watchos
+ configuration: Release
+
- xcode_version: 12.0
target: cocoapods-watchos
configuration: Debug
@@ -470,6 +603,14 @@ exclude:
target: swiftpm
configuration: Release
+ - xcode_version: 11.6
+ target: swiftpm
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: swiftpm
+ configuration: Release
+
- xcode_version: 12.0
target: swiftpm
configuration: Debug
@@ -498,6 +639,14 @@ exclude:
target: swiftpm-address
configuration: Release
+ - xcode_version: 11.6
+ target: swiftpm-address
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: swiftpm-address
+ configuration: Release
+
- xcode_version: 12.0
target: swiftpm-address
configuration: Debug
@@ -526,6 +675,14 @@ exclude:
target: swiftpm-thread
configuration: Release
+ - xcode_version: 11.6
+ target: swiftpm-thread
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: swiftpm-thread
+ configuration: Release
+
- xcode_version: 12.0
target: swiftpm-thread
configuration: Debug
@@ -554,6 +711,14 @@ exclude:
target: swiftpm-ios
configuration: Release
+ - xcode_version: 11.6
+ target: swiftpm-ios
+ configuration: Debug
+
+ - xcode_version: 11.6
+ target: swiftpm-ios
+ configuration: Release
+
- xcode_version: 12.0
target: swiftpm-ios
configuration: Debug
diff --git a/Carthage/Checkouts/realm-cocoa/.travis.yml b/Carthage/Checkouts/realm-cocoa/.travis.yml
index b9f2ee418..99c5f1b53 100644
--- a/Carthage/Checkouts/realm-cocoa/.travis.yml
+++ b/Carthage/Checkouts/realm-cocoa/.travis.yml
@@ -1,5 +1,5 @@
language: objective-c
-osx_image: xcode10.2
+osx_image: xcode11.6
branches:
only: master
script: placeholder # workaround for https://github.com/travis-ci/travis-ci/issues/4681
diff --git a/Carthage/Checkouts/realm-cocoa/CHANGELOG.md b/Carthage/Checkouts/realm-cocoa/CHANGELOG.md
index 8264dd7bf..095f30b4a 100644
--- a/Carthage/Checkouts/realm-cocoa/CHANGELOG.md
+++ b/Carthage/Checkouts/realm-cocoa/CHANGELOG.md
@@ -1,3 +1,101 @@
+5.3.2 Release notes (2020-07-21)
+=============================================================
+
+### Fixed
+
+* Fix a file format upgrade bug when opening older Realm files.. Could cause
+ assertions like "Assertion failed: ref != 0" during opning of a Realm.
+ ([Core #6644](https://github.com/realm/realm-cocoa/issues/6644), since 5.2.0)
+* A use-after-free would occur if a Realm was compacted, opened on multiple
+ threads prior to the first write, then written to while reads were happening
+ on other threads. This could result in a variety of crashes, often inside
+ realm::util::EncryptedFileMapping::read_barrier.
+ (Since v5.0.0, [#6626](https://github.com/realm/realm-cocoa/issues/6626),
+ [#6628](https://github.com/realm/realm-cocoa/issues/6628),
+ [#6652](https://github.com/realm/realm-cocoa/issues/6652),
+ [#6655](https://github.com/realm/realm-cocoa/issues/6555),
+ [#6656](https://github.com/realm/realm-cocoa/issues/6656)).
+
+### Compatibility
+
+* File format: Generates Realms with format v10 (Reads and upgrades all previous formats)
+* Realm Object Server: 3.21.0 or later.
+* Realm Studio: 3.11 or later.
+* APIs are backwards compatible with all previous releases in the 5.x.y series.
+* Carthage release for Swift is built with Xcode 11.6.
+
+### Internal
+
+* Upgraded realm-core from v6.0.11 to v6.0.12
+* Upgraded realm-sync from v5.0.11 to v5.0.12
+
+5.3.1 Release notes (2020-07-17)
+=============================================================
+
+### Enhancements
+
+* Add prebuilt binary for Xcode 11.6 to the release package.
+
+### Fixed
+
+* Creating an object inside migration which changed that object type's primary
+ key would hit an assertion failure mentioning primary_key_col
+ ([#6613](https://github.com/realm/realm-cocoa/issues/6613), since 5.0.0).
+* Modifying the value of a string primary key property inside a migration with
+ a Realm file which was upgraded from pre-5.0 would corrupt the property's
+ index, typically resulting in crashes. ([Core #3765](https://github.com/realm/realm-core/issues/3765), since 5.0.0).
+* Some Realm files which hit assertion failures when upgrading from the pre-5.0
+ file format should now upgrade correctly (Since 5.0.0).
+
+### Compatibility
+
+* File format: Generates Realms with format v10 (Reads and upgrades all previous formats)
+* Realm Object Server: 3.21.0 or later.
+* Realm Studio: 3.11 or later.
+* APIs are backwards compatible with all previous releases in the 5.x.y series.
+* Carthage release for Swift is built with Xcode 11.6.
+
+### Internal
+
+* Upgraded realm-core from v6.0.9 to v6.0.11
+* Upgraded realm-sync from v5.0.8 to v5.0.11
+
+5.3.0 Release notes (2020-07-14)
+=============================================================
+
+### Enhancements
+
+* Add `Realm.objectWillChange`, which is a Combine publisher that will emit a
+ notification each time the Realm is refreshed or a write transaction is
+ commited.
+
+### Fixed
+
+* Fix the spelling of `ObjectKeyIdentifiable`. The old spelling is available
+ and deprecated for compatiblity.
+* Rename `RealmCollection.publisher` to `RealmCollection.collectionPublisher`.
+ The old name interacted with the `publisher` defined by `Sequence` in very
+ confusing ways, so we need to use a different name. The `publisher` name is
+ still available for compatiblity. ([#6516](https://github.com/realm/realm-cocoa/issues/6516))
+* Work around "xcodebuild timed out while trying to read
+ SwiftPackageManagerExample.xcodeproj" errors when installing Realm via
+ Carthage. ([#6549](https://github.com/realm/realm-cocoa/issues/6549)).
+* Fix a performance regression when using change notifications. (Since 5.0.0,
+ [#6629](https://github.com/realm/realm-cocoa/issues/6629)).
+
+### Compatibility
+
+* File format: Generates Realms with format v10 (Reads and upgrades all previous formats)
+* Realm Object Server: 3.21.0 or later.
+* Realm Studio: 3.11 or later.
+* APIs are backwards compatible with all previous releases in the 5.x.y series.
+* Carthage release for Swift is built with Xcode 11.5.
+
+### Internal
+
+* Upgraded realm-core from v6.0.8 to v6.0.9
+* Upgraded realm-sync from v5.0.7 to v5.0.8
+
5.2.0 Release notes (2020-06-30)
=============================================================
diff --git a/Carthage/Checkouts/realm-cocoa/Jenkinsfile.releasability b/Carthage/Checkouts/realm-cocoa/Jenkinsfile.releasability
index cd77baf83..7e9aac3d4 100644
--- a/Carthage/Checkouts/realm-cocoa/Jenkinsfile.releasability
+++ b/Carthage/Checkouts/realm-cocoa/Jenkinsfile.releasability
@@ -1,4 +1,4 @@
-xcodeVersions = ['11.3', '11.4.1', '11.5']
+xcodeVersions = ['11.3', '11.4.1', '11.5', '11.6']
platforms = ['osx', 'ios', 'watchos', 'tvos', 'catalyst']
carthagePlatforms = ['osx', 'ios', 'watchos', 'tvos']
platformNames = ['osx': 'macOS', 'ios': 'iOS', 'watchos': 'watchOS', 'tvos': 'tvOS', 'catalyst': 'Catalyst']
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/dependencies.list b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/dependencies.list
index 7f117e376..9710b0a6d 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/dependencies.list
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/dependencies.list
@@ -1,4 +1,4 @@
-REALM_CORE_VERSION=6.0.6
-REALM_SYNC_VERSION=5.0.5
+REALM_CORE_VERSION=6.0.10
+REALM_SYNC_VERSION=5.0.9
REALM_CORE_PACKAGING=2
OPENSSL_VERSION=1.1.1b
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.cpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.cpp
index 11699290f..318da0c80 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.cpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.cpp
@@ -124,6 +124,23 @@ Property const& Object::property_for_name(StringData prop_name) const
return *prop;
}
+void Object::validate_property_for_setter(Property const& property) const
+{
+ verify_attached();
+ m_realm->verify_in_write();
+
+ // 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) {
+ if (!m_realm->is_in_migration())
+ throw ModifyPrimaryKeyException(m_object_schema->name, property.name);
+ // Modifying the PK property while it's the PK will corrupt the table,
+ // so remove it and then restore it at the end of the migration (which will rebuild the table)
+ m_obj.get_table()->set_primary_key_column({});
+ }
+}
+
#if REALM_ENABLE_SYNC
void Object::ensure_user_in_everyone_role()
{
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.hpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.hpp
index 06cea3a1b..1f2751a2f 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.hpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object.hpp
@@ -146,6 +146,7 @@ private:
void verify_attached() const;
Property const& property_for_name(StringData prop_name) const;
+ void validate_property_for_setter(Property const&) const;
};
struct InvalidatedObjectException : public std::logic_error {
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object_accessor.hpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object_accessor.hpp
index c49897ff3..f02b6f901 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object_accessor.hpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/object_accessor.hpp
@@ -43,16 +43,8 @@ template <typename ValueType, typename ContextType>
void Object::set_property_value(ContextType& ctx, StringData prop_name,
ValueType value, CreatePolicy policy)
{
- 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 ModifyPrimaryKeyException(m_object_schema->name, property.name);
-
+ validate_property_for_setter(property);
set_property_value_impl(ctx, property, value, policy, false);
}
@@ -186,75 +178,91 @@ Object Object::create(ContextType& ctx, std::shared_ptr<Realm> const& realm,
}
template<typename ValueType, typename ContextType>
+Mixed as_mixed(ContextType& ctx, ValueType& value, PropertyType type)
+{
+ if (!value)
+ return {};
+ return switch_on_type(type, [&](auto* t) {
+ return Mixed(ctx.template unbox<NonObjTypeT<decltype(*t)>>(*value));
+ });
+}
+
+template<typename ValueType, typename ContextType>
Object Object::create(ContextType& ctx, std::shared_ptr<Realm> const& realm,
ObjectSchema const& object_schema, ValueType value,
CreatePolicy policy, ObjKey current_obj, Obj* out_row)
{
realm->verify_in_write();
- // get or create our accessor
+ // When setting each property, we normally want to skip over the primary key
+ // as that's set as part of object creation. However, during migrations the
+ // property marked as the primary key in the schema may not currently be
+ // considered a primary key by core, and so will need to be set.
+ bool skip_primary = true;
+ // If the input value is missing values for any of the properties we want to
+ // set the propery to the default value for new objects, but leave it
+ // untouched for existing objects.
bool created = false;
- // try to get existing row if updating
Obj obj;
auto table = realm->read_group().get_table(object_schema.table_key);
- bool skip_primary = true;
+ // If there's a primary key, we need to first check if an object with the
+ // same primary key already exists. If it does, we either update that object
+ // or throw an exception if updating is disabled.
if (auto primary_prop = object_schema.primary_key_property()) {
- // search for existing object based on primary key type
auto primary_value = ctx.value_for_property(value, *primary_prop,
primary_prop - &object_schema.persisted_properties[0]);
if (!primary_value)
primary_value = ctx.default_value_for_property(object_schema, *primary_prop);
- if (!primary_value) {
- if (!is_nullable(primary_prop->type))
- throw MissingPropertyValueException(object_schema.name, primary_prop->name);
- primary_value = ctx.null_value();
- }
- auto key = get_for_primary_key_impl(ctx, *table, *primary_prop, *primary_value);
- if (key) {
- if (policy != CreatePolicy::ForceCreate)
- obj = table->get_object(key);
- else if (realm->is_in_migration()) {
- // Creating objects with duplicate primary keys is allowed in migrations
- // as long as there are no duplicates at the end, as adding an entirely
- // new column which is the PK will inherently result in duplicates at first
- obj = table->create_object();
- created = true;
- skip_primary = false;
- }
- else {
- throw std::logic_error(util::format("Attempting to create an object of type '%1' with an existing primary key value '%2'.",
- object_schema.name, ctx.print(*primary_value)));
+ if (!primary_value && !is_nullable(primary_prop->type))
+ throw MissingPropertyValueException(object_schema.name, primary_prop->name);
+
+ // When changing the primary key of a table, we remove the existing pk (if any), call
+ // the migration function, then add the new pk (if any). This means that we can't call
+ // create_object_with_primary_key(), and creating duplicate primary keys is allowed as
+ // long as they're unique by the end of the migration.
+ if (table->get_primary_key_column() == ColKey{}) {
+ REALM_ASSERT(realm->is_in_migration());
+ if (policy != CreatePolicy::ForceCreate) {
+ if (auto key = get_for_primary_key_impl(ctx, *table, *primary_prop, *primary_value))
+ obj = table->get_object(key);
}
+ if (!obj)
+ skip_primary = false;
}
else {
- created = true;
- Mixed primary_key;
- if (primary_prop->type == PropertyType::Int) {
- primary_key = ctx.template unbox<util::Optional<int64_t>>(*primary_value);
- }
- else if (primary_prop->type == PropertyType::String) {
- primary_key = ctx.template unbox<StringData>(*primary_value);
- }
- else {
- REALM_TERMINATE("Unsupported primary key type.");
+ obj = table->create_object_with_primary_key(as_mixed(ctx, primary_value, primary_prop->type), &created);
+ if (!created && policy == CreatePolicy::ForceCreate) {
+ if (!realm->is_in_migration()) {
+ throw std::logic_error(util::format("Attempting to create an object of type '%1' with an existing primary key value '%2'.",
+ object_schema.name, ctx.print(*primary_value)));
+ }
+ table->set_primary_key_column(ColKey{});
+ skip_primary = false;
+ obj = {};
}
- obj = table->create_object_with_primary_key(primary_key);
}
}
- else {
+
+ // No primary key (possibly temporarily due to migrations). If we're
+ // currently performing a recursive update on an existing object tree then
+ // an object key was passed in that we need to look up, and otherwise we
+ // need to create the new object.
+ if (!obj) {
if (policy == CreatePolicy::UpdateModified && current_obj) {
obj = table->get_object(current_obj);
}
else {
- obj = table->create_object();
+ obj = table->create_object();
created = true;
}
}
- // populate
Object object(realm, object_schema, obj);
+ // KVO in Cocoa requires that the obj ivar on the wrapper object be set
+ // *before* we start setting the properties, so it passes in a pointer to
+ // that.
if (out_row)
*out_row = obj;
for (size_t i = 0; i < object_schema.persisted_properties.size(); ++i) {
@@ -271,6 +279,9 @@ Object Object::create(ContextType& ctx, std::shared_ptr<Realm> const& realm,
v = ctx.default_value_for_property(object_schema, prop);
is_default = true;
}
+ // We consider null or a missing value to be equivalent to an empty
+ // array for historical reasons; the original implementation did this
+ // accidentally and it's not worth changing.
if ((!v || ctx.is_null(*v)) && !is_nullable(prop.type) && !is_array(prop.type)) {
if (prop.is_primary || !ctx.allow_missing(value))
throw MissingPropertyValueException(object_schema.name, prop.name);
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/property.hpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/property.hpp
index 9905c0b03..72198ae08 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/property.hpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/property.hpp
@@ -173,6 +173,19 @@ inline constexpr bool is_nullable(PropertyType a)
return to_underlying(a & PropertyType::Nullable) == to_underlying(PropertyType::Nullable);
}
+// Some of the places we use switch_on_type() the Obj version isn't instantiatable
+// or reachable, so we want to map it to a valid type to let the unreachable code compile
+template<typename T>
+struct NonObjType {
+ using type = std::remove_reference_t<T>;
+};
+template<>
+struct NonObjType<Obj&> {
+ using type = int64_t;
+};
+template<typename T>
+using NonObjTypeT = typename NonObjType<T>::type;
+
template<typename ObjType=Obj, typename Fn>
static auto switch_on_type(PropertyType type, Fn&& fn)
{
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/thread_safe_reference.cpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/thread_safe_reference.cpp
index 80c6ec313..ecae494ae 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/thread_safe_reference.cpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/src/thread_safe_reference.cpp
@@ -109,19 +109,6 @@ private:
std::string m_object_schema_name;
};
-template<typename T>
-struct ListType {
- using type = Lst<std::remove_reference_t<T>>;
-};
-
-// The code path which would instantiate List<Obj> isn't reachable, but still
-// produces errors about the type not being instantiable so we instead map it
-// to an arbitrary valid type
-template<>
-struct ListType<Obj&> {
- using type = Lst<int64_t>;
-};
-
template<>
class ThreadSafeReference::PayloadImpl<Results> : public ThreadSafeReference::Payload {
public:
@@ -161,7 +148,7 @@ public:
// match what happens for other types of handover where the
// object doesn't exist.
switch_on_type(ObjectSchema::from_core_type(*table, m_col_key), [&](auto* t) -> void {
- list = std::make_unique<typename ListType<decltype(*t)>::type>();
+ list = std::make_unique<Lst<NonObjTypeT<decltype(*t)>>>();
});
}
return Results(r, std::move(list), m_ordering);
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/tests/migrations.cpp b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/tests/migrations.cpp
index c944e4be5..5f4ca60b5 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/tests/migrations.cpp
+++ b/Carthage/Checkouts/realm-cocoa/Realm/ObjectStore/tests/migrations.cpp
@@ -716,6 +716,14 @@ TEST_CASE("migration: Automatic") {
{"array target", {
{"value", PropertyType::Int},
}},
+ {"int pk", {
+ {"pk", PropertyType::Int, Property::IsPrimary{true}},
+ {"value", PropertyType::Int},
+ }},
+ {"string pk", {
+ {"pk", PropertyType::String, Property::IsPrimary{true}},
+ {"value", PropertyType::Int},
+ }},
};
InMemoryTestFile config;
@@ -909,10 +917,22 @@ TEST_CASE("migration: Automatic") {
});
}
+ SECTION("upsert in new realm after modifying primary key") {
+ realm->update_schema(schema, 2, [&values](auto, auto new_realm, Schema&) {
+ get_table(new_realm, "all types")->set_primary_key_column(ColKey());
+ REQUIRE(new_realm->is_in_transaction());
+ CppContext ctx(new_realm);
+ any_cast<AnyDict&>(values)["bool"] = false;
+ Object obj = Object::create(ctx, new_realm, "all types", values, CreatePolicy::UpdateAll);
+ REQUIRE(get_table(new_realm, "all types")->size() == 1);
+ REQUIRE(get_table(new_realm, "link target")->size() == 2);
+ REQUIRE(get_table(new_realm, "array target")->size() == 2);
+ REQUIRE(any_cast<bool>(obj.get_property_value<util::Any>(ctx, "bool")) == false);
+ });
+ }
+
SECTION("change primary key property type") {
schema = set_type(schema, "all types", "pk", PropertyType::String);
- // FIXME: changing the primary key of a type with binary columns currently crashes in core
- schema = remove_property(schema, "all types", "data");
realm->update_schema(schema, 2, [](auto, auto new_realm, auto&) {
Object obj(new_realm, "all types", 0);
@@ -943,6 +963,169 @@ TEST_CASE("migration: Automatic") {
REQUIRE_NOTHROW(realm->update_schema(schema, 2, good_migration));
REQUIRE(get_table(realm, "all types")->size() == 2);
}
+
+ SECTION("modify existing int primary key values in migration") {
+ // Create several more objects to increase the chance of things
+ // actually breaking if we're doing invalid things
+ CppContext ctx(realm);
+ auto object_schema = realm->schema().find("all types");
+ realm->begin_transaction();
+ for (int i = 1; i < 10; ++i) {
+ any_cast<AnyDict&>(values)["pk"] = INT64_C(1) + i;
+ any_cast<AnyDict&>(values)["int"] = INT64_C(5) + i;
+ Object::create(ctx, realm, *object_schema, values);
+ }
+ realm->commit_transaction();
+
+ // Increase the PK of each object by one in a migration
+ realm->update_schema(schema, 2, [](auto, auto new_realm, Schema&) {
+ CppContext ctx(new_realm);
+ Results results(new_realm, get_table(new_realm, "all types"));
+ for (size_t i = 0, count = results.size(); i < count; ++i) {
+ Object obj(new_realm, results.get<Obj>(i));
+ util::Any v = 1 + any_cast<int64_t>(obj.get_property_value<util::Any>(ctx, "pk"));
+ obj.set_property_value(ctx, "pk", v);
+ }
+ });
+
+ // Create a new object with the no-longer-used pk of 1
+ realm->begin_transaction();
+ any_cast<AnyDict&>(values)["pk"] = INT64_C(1);
+ any_cast<AnyDict&>(values)["int"] = INT64_C(4);
+ object_schema = realm->schema().find("all types");
+ Object::create(ctx, realm, *object_schema, values);
+ realm->commit_transaction();
+
+ // Verify results
+ auto table = get_table(realm, "all types");
+ REQUIRE(table->size() == 11);
+ REQUIRE(table->get_primary_key_column() == table->get_column_key("pk"));
+ for (int i = 0; i < 10; ++i) {
+ auto obj = table->get_object(i);
+ REQUIRE(obj.get<int64_t>("pk") == i + 2);
+ REQUIRE(obj.get<int64_t>("int") == i + 5);
+ }
+ auto obj = table->get_object(10);
+ REQUIRE(obj.get<int64_t>("pk") == 1);
+ REQUIRE(obj.get<int64_t>("int") == 4);
+ }
+
+ SECTION("modify existing string primary key values in migration") {
+ // Create several objects to increase the chance of things
+ // actually breaking if we're doing invalid things
+ CppContext ctx(realm);
+ auto object_schema = realm->schema().find("string pk");
+ realm->begin_transaction();
+ for (int64_t i = 0; i < 10; ++i) {
+ util::Any values = AnyDict{
+ {"pk", util::to_string(i)},
+ {"value", i + 1},
+ };
+ Object::create(ctx, realm, *object_schema, values);
+ }
+ realm->commit_transaction();
+
+ // Increase the PK of each object by one in a migration
+ realm->update_schema(schema, 2, [](auto, auto new_realm, Schema&) {
+ CppContext ctx(new_realm);
+ Results results(new_realm, get_table(new_realm, "string pk"));
+ for (size_t i = 0, count = results.size(); i < count; ++i) {
+ Object obj(new_realm, results.get<Obj>(i));
+ util::Any v = util::to_string(any_cast<int64_t>(obj.get_property_value<util::Any>(ctx, "value")));
+ obj.set_property_value(ctx, "pk", v);
+ }
+ });
+
+ // Create a new object with the no-longer-used pk of 0
+ realm->begin_transaction();
+ util::Any values = AnyDict{
+ {"pk", "0"s},
+ {"value", INT64_C(0)},
+ };
+ object_schema = realm->schema().find("string pk");
+ Object::create(ctx, realm, *object_schema, values);
+ realm->commit_transaction();
+
+ // Verify results
+ auto table = get_table(realm, "string pk");
+ REQUIRE(table->size() == 11);
+ REQUIRE(table->get_primary_key_column() == table->get_column_key("pk"));
+ for (auto& obj : *table) {
+ REQUIRE(util::to_string(obj.get<int64_t>("value")).c_str() == obj.get<StringData>("pk"));
+ }
+ }
+
+ SECTION("create and modify int primary key inside migration") {
+ SECTION("with index") {
+ realm->begin_transaction();
+ auto table = get_table(realm, "int pk");
+ table->add_search_index(table->get_column_key("pk"));
+ realm->commit_transaction();
+ }
+ SECTION("no index") {
+ }
+
+ realm->update_schema(schema, 2, [](auto, auto new_realm, Schema&) {
+ CppContext ctx(new_realm);
+ for (int64_t i = 0; i < 10; ++i) {
+ auto obj = Object::create(ctx, new_realm, *new_realm->schema().find("int pk"),
+ util::Any(AnyDict{
+ {"pk", INT64_C(0)},
+ {"value", i}
+ }));
+ obj.set_property_value(ctx, "pk", util::Any(i));
+ }
+ });
+
+ auto table = get_table(realm, "int pk");
+ REQUIRE(table->size() == 10);
+ REQUIRE(table->get_primary_key_column() == table->get_column_key("pk"));
+ for (int i = 0; i < 10; ++i) {
+ auto obj = table->get_object(i);
+ REQUIRE(obj.get<int64_t>("pk") == i);
+ REQUIRE(obj.get<int64_t>("value") == i);
+ }
+ }
+
+ SECTION("create and modify string primary key inside migration") {
+ SECTION("with index") {
+ realm->begin_transaction();
+ auto table = get_table(realm, "string pk");
+ table->add_search_index(table->get_column_key("pk"));
+ realm->commit_transaction();
+ }
+ SECTION("no index") {
+ }
+
+ realm->update_schema(schema, 2, [](auto, auto new_realm, Schema&) {
+ CppContext ctx(new_realm);
+ for (int64_t i = 0; i < 10; ++i) {
+ auto obj = Object::create(ctx, new_realm, *new_realm->schema().find("string pk"),
+ util::Any(AnyDict{
+ {"pk", ""s},
+ {"value", i}
+ }));
+ obj.set_property_value(ctx, "pk", util::Any(util::to_string(i)));
+ }
+ });
+
+ auto table = get_table(realm, "string pk");
+ REQUIRE(table->size() == 10);
+ REQUIRE(table->get_primary_key_column() == table->get_column_key("pk"));
+ for (auto& obj : *table)
+ REQUIRE(obj.get<StringData>("pk") == util::to_string(obj.get<int64_t>("value")).c_str());
+ }
+
+ SECTION("create object after adding primary key") {
+ schema = set_primary_key(schema, "all types", "");
+ realm->update_schema(schema, 2);
+ schema = set_primary_key(schema, "all types", "pk");
+ REQUIRE_NOTHROW(realm->update_schema(schema, 3, [&](auto, auto new_realm, Schema&) {
+ CppContext ctx(new_realm);
+ any_cast<AnyDict&>(values)["pk"] = INT64_C(2);
+ Object::create(ctx, realm, "all types", values);
+ }));
+ }
}
SECTION("property renaming") {
@@ -1132,6 +1315,27 @@ TEST_CASE("migration: Automatic") {
schema = set_indexed(schema, "object", "value", true);
SUCCESSFUL_RENAME(schema, schema2, {"object", "value", "new"});
}
+
+ SECTION("create object inside migration after renaming pk") {
+ schema = set_primary_key(schema, "object", "value");
+ auto new_schema = set_primary_key(rename_value(schema), "object", "new");
+ init(schema);
+ REQUIRE_NOTHROW(realm->update_schema(new_schema, 2, [](auto, auto realm, Schema& schema) {
+ ObjectStore::rename_property(realm->read_group(), schema,
+ "object", "value", "new");
+
+ CppContext ctx(realm);
+ util::Any values = AnyDict{{"new", INT64_C(11)}};
+ Object::create(ctx, realm, "object", values);
+ }));
+ REQUIRE(realm->schema() == new_schema);
+ VERIFY_SCHEMA(*realm, false);
+ auto table = ObjectStore::table_for_object_type(realm->read_group(), "object");
+ auto key = table->get_column_keys()[0];
+ auto it = table->begin();
+ REQUIRE(it->get<int64_t>(key) == 10);
+ REQUIRE((++it)->get<int64_t>(key) == 11);
+ }
}
}
diff --git a/Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist b/Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist
index 9b175f919..d02e33db9 100644
--- a/Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist
+++ b/Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
- <string>5.2.0</string>
+ <string>5.3.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
- <string>5.2.0</string>
+ <string>5.3.2</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Realm. All rights reserved.</string>
<key>NSPrincipalClass</key>
diff --git a/Carthage/Checkouts/realm-cocoa/build.sh b/Carthage/Checkouts/realm-cocoa/build.sh
index f65bea368..8cd328465 100755
--- a/Carthage/Checkouts/realm-cocoa/build.sh
+++ b/Carthage/Checkouts/realm-cocoa/build.sh
@@ -1551,7 +1551,7 @@ x.y.z Release notes (yyyy-MM-dd)
* Realm Object Server: 3.21.0 or later.
* Realm Studio: 3.11 or later.
* APIs are backwards compatible with all previous releases in the 5.x.y series.
-* Carthage release for Swift is built with Xcode 11.5.
+* Carthage release for Swift is built with Xcode 11.6.
### Internal
* Upgraded realm-core from ? to ?
diff --git a/Carthage/Checkouts/realm-cocoa/dependencies.list b/Carthage/Checkouts/realm-cocoa/dependencies.list
index 876eb6eb8..3355050ec 100644
--- a/Carthage/Checkouts/realm-cocoa/dependencies.list
+++ b/Carthage/Checkouts/realm-cocoa/dependencies.list
@@ -1,4 +1,4 @@
-VERSION=5.2.0
-REALM_CORE_VERSION=6.0.8
-REALM_SYNC_VERSION=5.0.7
+VERSION=5.3.2
+REALM_CORE_VERSION=6.0.12
+REALM_SYNC_VERSION=5.0.12
REALM_OBJECT_SERVER_VERSION=3.28.5
diff --git a/Carthage/Checkouts/realm-cocoa/examples/installation/build.sh b/Carthage/Checkouts/realm-cocoa/examples/installation/build.sh
index 88363d502..10de66d68 100755
--- a/Carthage/Checkouts/realm-cocoa/examples/installation/build.sh
+++ b/Carthage/Checkouts/realm-cocoa/examples/installation/build.sh
@@ -40,9 +40,6 @@ command:
test-watchos-swift-xcframework: tests watchOS Swift xcframework example.
test-watchos-swift-cocoapods: tests watchOS Swift CocoaPods example.
test-watchos-swift-carthage: tests watchOS Swift Carthage example.
- test-watchos-spm: tests watchOS Swift Package Manager example.
-
- test-tvos-spm: tests tvOS Swift Package Manager example.
EOF
}
@@ -167,11 +164,9 @@ case "$COMMAND" in
for target in ios-swift-dynamic ios-swift-cocoapods osx-swift-dynamic ios-swift-carthage osx-swift-carthage; do
./build.sh test-$target || exit 1
done
- if (( $(xcode_version_major) >= 11 )); then
- for target in ios osx watchos tvos; do
- ./build.sh test-$target-spm || exit 1
- done
- fi
+ for target in ios osx; do
+ ./build.sh test-$target-spm || exit 1
+ done
;;
test-*-*-cocoapods)
@@ -199,6 +194,13 @@ case "$COMMAND" in
;;
test-ios-spm)
+ # We have to "hide" the spm example from carthage because otherwise
+ # it'll fetch the example's package dependencies as part of deciding
+ # what to build from this repo.
+ if ! [ -L ios/swift/SwiftPackageManagerExample/SwiftPackageManagerExample.xcodeproj/project.pbxproj ]; then
+ mkdir -p ios/swift/SwiftPackageManagerExample/SwiftPackageManagerExample.xcodeproj
+ ln -s ../project.pbxproj ios/swift/SwiftPackageManagerExample/SwiftPackageManagerExample.xcodeproj
+ fi
xctest "$PLATFORM" swift SwiftPackageManagerExample
;;
diff --git a/Carthage/Checkouts/realm-cocoa/scripts/package_examples.rb b/Carthage/Checkouts/realm-cocoa/scripts/package_examples.rb
index 986ce90c8..d383a2a5f 100755
--- a/Carthage/Checkouts/realm-cocoa/scripts/package_examples.rb
+++ b/Carthage/Checkouts/realm-cocoa/scripts/package_examples.rb
@@ -41,7 +41,7 @@ base_examples = [
"examples/tvos/swift",
]
-xcode_versions = %w(11.3 11.4.1 11.5)
+xcode_versions = %w(11.3 11.4.1 11.5 11.6)
# Remove reference to Realm.xcodeproj from all example workspaces.
base_examples.each do |example|