Merge pull request #99 from realm/al-os

Object store cleanup
This commit is contained in:
Ari Lazier 2015-10-26 15:39:37 -07:00
commit 6db449ef06
16 changed files with 202 additions and 100 deletions

View File

@ -9,16 +9,12 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
02258FB31BC6E2D00075F13A /* RealmRPC.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02258FB11BC6E2D00075F13A /* RealmRPC.hpp */; settings = {ATTRIBUTES = (Public, ); }; }; 02258FB31BC6E2D00075F13A /* RealmRPC.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02258FB11BC6E2D00075F13A /* RealmRPC.hpp */; settings = {ATTRIBUTES = (Public, ); }; };
02258FB41BC6E2D00075F13A /* RealmRPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02258FB21BC6E2D00075F13A /* RealmRPC.cpp */; }; 02258FB41BC6E2D00075F13A /* RealmRPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02258FB21BC6E2D00075F13A /* RealmRPC.cpp */; };
02409DC21BCF11D6005F3B3E /* RealmJSCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */; settings = {ASSET_TAGS = (); }; }; 02409DC21BCF11D6005F3B3E /* RealmJSCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */; };
02601F031BA0F0C4007C91FF /* external_commit_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F011BA0F0C4007C91FF /* external_commit_helper.cpp */; };
02601F041BA0F0C4007C91FF /* external_commit_helper.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F021BA0F0C4007C91FF /* external_commit_helper.hpp */; };
02601F081BA0F0CD007C91FF /* index_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F051BA0F0CD007C91FF /* index_set.cpp */; }; 02601F081BA0F0CD007C91FF /* index_set.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F051BA0F0CD007C91FF /* index_set.cpp */; };
02601F091BA0F0CD007C91FF /* index_set.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F061BA0F0CD007C91FF /* index_set.hpp */; }; 02601F091BA0F0CD007C91FF /* index_set.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F061BA0F0CD007C91FF /* index_set.hpp */; };
02601F0A1BA0F0CD007C91FF /* realm_delegate.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F071BA0F0CD007C91FF /* realm_delegate.hpp */; }; 02601F0A1BA0F0CD007C91FF /* realm_delegate.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F071BA0F0CD007C91FF /* realm_delegate.hpp */; };
02601F0D1BA0F3A7007C91FF /* schema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F0B1BA0F3A7007C91FF /* schema.cpp */; }; 02601F0D1BA0F3A7007C91FF /* schema.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F0B1BA0F3A7007C91FF /* schema.cpp */; };
02601F0E1BA0F3A7007C91FF /* schema.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F0C1BA0F3A7007C91FF /* schema.hpp */; }; 02601F0E1BA0F3A7007C91FF /* schema.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F0C1BA0F3A7007C91FF /* schema.hpp */; };
02601F111BA10228007C91FF /* transact_log_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02601F0F1BA10228007C91FF /* transact_log_handler.cpp */; };
02601F121BA10228007C91FF /* transact_log_handler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02601F101BA10228007C91FF /* transact_log_handler.hpp */; };
0270BC4C1B7CFC0D00010E03 /* RealmJS.h in Headers */ = {isa = PBXBuildFile; fileRef = 0270BC3E1B7CFC0D00010E03 /* RealmJS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0270BC4C1B7CFC0D00010E03 /* RealmJS.h in Headers */ = {isa = PBXBuildFile; fileRef = 0270BC3E1B7CFC0D00010E03 /* RealmJS.h */; settings = {ATTRIBUTES = (Public, ); }; };
0270BC4D1B7CFC0D00010E03 /* RealmJS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */; }; 0270BC4D1B7CFC0D00010E03 /* RealmJS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */; };
0270BC4E1B7CFC0D00010E03 /* RJSList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC401B7CFC0D00010E03 /* RJSList.cpp */; }; 0270BC4E1B7CFC0D00010E03 /* RJSList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0270BC401B7CFC0D00010E03 /* RJSList.cpp */; };
@ -52,20 +48,24 @@
0270BC871B7D023200010E03 /* RealmJS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; }; 0270BC871B7D023200010E03 /* RealmJS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; };
0270BCD11B7D067300010E03 /* RealmReact.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BCD01B7D067300010E03 /* RealmReact.mm */; }; 0270BCD11B7D067300010E03 /* RealmReact.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0270BCD01B7D067300010E03 /* RealmReact.mm */; };
0291DBD21BD994F700E3852C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; 0291DBD21BD994F700E3852C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; };
029445931BDEDF40006D1617 /* transact_log_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029445911BDEDF40006D1617 /* transact_log_handler.cpp */; };
029445941BDEDF40006D1617 /* transact_log_handler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 029445921BDEDF40006D1617 /* transact_log_handler.hpp */; };
029445971BDEDF46006D1617 /* external_commit_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 029445951BDEDF46006D1617 /* external_commit_helper.cpp */; };
029445981BDEDF46006D1617 /* external_commit_helper.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 029445961BDEDF46006D1617 /* external_commit_helper.hpp */; };
02B29A311B7CF86D008A7E6B /* RealmJS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; }; 02B29A311B7CF86D008A7E6B /* RealmJS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; };
02B58CCE1AE99D4D009B348C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; 02B58CCE1AE99D4D009B348C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; };
02C0864E1BCDB27000942F9C /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02C0864C1BCDB27000942F9C /* list.cpp */; settings = {ASSET_TAGS = (); }; }; 02C0864E1BCDB27000942F9C /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02C0864C1BCDB27000942F9C /* list.cpp */; };
02C0864F1BCDB27000942F9C /* list.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02C0864D1BCDB27000942F9C /* list.hpp */; settings = {ASSET_TAGS = (); }; }; 02C0864F1BCDB27000942F9C /* list.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 02C0864D1BCDB27000942F9C /* list.hpp */; };
02D456DA1B7E59A500EE1299 /* ArrayTests.js in Resources */ = {isa = PBXBuildFile; fileRef = 02D456D91B7E59A500EE1299 /* ArrayTests.js */; }; 02D456DA1B7E59A500EE1299 /* ArrayTests.js in Resources */ = {isa = PBXBuildFile; fileRef = 02D456D91B7E59A500EE1299 /* ArrayTests.js */; };
02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; }; 02D8D1F71B601984006DB49D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CCD1AE99D4D009B348C /* JavaScriptCore.framework */; };
F636F6C81BCDB3570023F35C /* RealmReact.h in Headers */ = {isa = PBXBuildFile; fileRef = 0270BCCF1B7D067300010E03 /* RealmReact.h */; settings = {ATTRIBUTES = (Public, ); }; }; F636F6C81BCDB3570023F35C /* RealmReact.h in Headers */ = {isa = PBXBuildFile; fileRef = 0270BCCF1B7D067300010E03 /* RealmReact.h */; settings = {ATTRIBUTES = (Public, ); }; };
F64426C51BCDB1E200A81210 /* RealmJS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F64426C51BCDB1E200A81210 /* RealmJS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02B58CB11AE99CEC009B348C /* RealmJS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
F64E1EF11BC3510E00E0E150 /* util.js in Resources */ = {isa = PBXBuildFile; fileRef = F64E1EF01BC3510E00E0E150 /* util.js */; settings = {ASSET_TAGS = (); }; }; F64E1EF11BC3510E00E0E150 /* util.js in Resources */ = {isa = PBXBuildFile; fileRef = F64E1EF01BC3510E00E0E150 /* util.js */; };
F67191381BCE231100AD0939 /* GCDWebServers.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02A3C7941BC4317A00B1A7BE /* GCDWebServers.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F67191381BCE231100AD0939 /* GCDWebServers.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02A3C7941BC4317A00B1A7BE /* GCDWebServers.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
F68A278C1BC2722A0063D40A /* RJSModuleLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = F68A278B1BC2722A0063D40A /* RJSModuleLoader.m */; settings = {ASSET_TAGS = (); }; }; F68A278C1BC2722A0063D40A /* RJSModuleLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = F68A278B1BC2722A0063D40A /* RJSModuleLoader.m */; };
F68A278E1BC30F0A0063D40A /* index.js in Resources */ = {isa = PBXBuildFile; fileRef = F68A278D1BC30F0A0063D40A /* index.js */; settings = {ASSET_TAGS = (); }; }; F68A278E1BC30F0A0063D40A /* index.js in Resources */ = {isa = PBXBuildFile; fileRef = F68A278D1BC30F0A0063D40A /* index.js */; };
F6B3963D1BCE2430008BDC39 /* GCDWebServers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02A3C7941BC4317A00B1A7BE /* GCDWebServers.framework */; }; F6B3963D1BCE2430008BDC39 /* GCDWebServers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02A3C7941BC4317A00B1A7BE /* GCDWebServers.framework */; };
F6F405F81BCF0C1A00A1E24F /* base-test.js in Resources */ = {isa = PBXBuildFile; fileRef = F6F405F71BCF0C1A00A1E24F /* base-test.js */; settings = {ASSET_TAGS = (); }; }; F6F405F81BCF0C1A00A1E24F /* base-test.js in Resources */ = {isa = PBXBuildFile; fileRef = F6F405F71BCF0C1A00A1E24F /* base-test.js */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -160,15 +160,11 @@
02258FB11BC6E2D00075F13A /* RealmRPC.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RealmRPC.hpp; path = src/RealmRPC.hpp; sourceTree = "<group>"; }; 02258FB11BC6E2D00075F13A /* RealmRPC.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RealmRPC.hpp; path = src/RealmRPC.hpp; sourceTree = "<group>"; };
02258FB21BC6E2D00075F13A /* RealmRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RealmRPC.cpp; path = src/RealmRPC.cpp; sourceTree = "<group>"; }; 02258FB21BC6E2D00075F13A /* RealmRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RealmRPC.cpp; path = src/RealmRPC.cpp; sourceTree = "<group>"; };
02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RealmJSCoreTests.m; path = tests/RealmJSCoreTests.m; sourceTree = SOURCE_ROOT; }; 02409DC11BCF11D6005F3B3E /* RealmJSCoreTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RealmJSCoreTests.m; path = tests/RealmJSCoreTests.m; sourceTree = SOURCE_ROOT; };
02601F011BA0F0C4007C91FF /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = external_commit_helper.cpp; path = "src/object-store/apple/external_commit_helper.cpp"; sourceTree = "<group>"; };
02601F021BA0F0C4007C91FF /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = external_commit_helper.hpp; path = "src/object-store/apple/external_commit_helper.hpp"; sourceTree = "<group>"; };
02601F051BA0F0CD007C91FF /* index_set.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = index_set.cpp; path = "src/object-store/index_set.cpp"; sourceTree = "<group>"; }; 02601F051BA0F0CD007C91FF /* index_set.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = index_set.cpp; path = "src/object-store/index_set.cpp"; sourceTree = "<group>"; };
02601F061BA0F0CD007C91FF /* index_set.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = index_set.hpp; path = "src/object-store/index_set.hpp"; sourceTree = "<group>"; }; 02601F061BA0F0CD007C91FF /* index_set.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = index_set.hpp; path = "src/object-store/index_set.hpp"; sourceTree = "<group>"; };
02601F071BA0F0CD007C91FF /* realm_delegate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = realm_delegate.hpp; path = "src/object-store/realm_delegate.hpp"; sourceTree = "<group>"; }; 02601F071BA0F0CD007C91FF /* realm_delegate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = realm_delegate.hpp; path = "src/object-store/realm_delegate.hpp"; sourceTree = "<group>"; };
02601F0B1BA0F3A7007C91FF /* schema.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = schema.cpp; path = "src/object-store/schema.cpp"; sourceTree = "<group>"; }; 02601F0B1BA0F3A7007C91FF /* schema.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = schema.cpp; path = "src/object-store/schema.cpp"; sourceTree = "<group>"; };
02601F0C1BA0F3A7007C91FF /* schema.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = schema.hpp; path = "src/object-store/schema.hpp"; sourceTree = "<group>"; }; 02601F0C1BA0F3A7007C91FF /* schema.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = schema.hpp; path = "src/object-store/schema.hpp"; sourceTree = "<group>"; };
02601F0F1BA10228007C91FF /* transact_log_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = transact_log_handler.cpp; path = "src/object-store/transact_log_handler.cpp"; sourceTree = "<group>"; };
02601F101BA10228007C91FF /* transact_log_handler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = transact_log_handler.hpp; path = "src/object-store/transact_log_handler.hpp"; sourceTree = "<group>"; };
0270BC3E1B7CFC0D00010E03 /* RealmJS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealmJS.h; path = src/RealmJS.h; sourceTree = "<group>"; }; 0270BC3E1B7CFC0D00010E03 /* RealmJS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealmJS.h; path = src/RealmJS.h; sourceTree = "<group>"; };
0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RealmJS.mm; path = src/RealmJS.mm; sourceTree = "<group>"; }; 0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RealmJS.mm; path = src/RealmJS.mm; sourceTree = "<group>"; };
0270BC401B7CFC0D00010E03 /* RJSList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RJSList.cpp; path = src/RJSList.cpp; sourceTree = "<group>"; }; 0270BC401B7CFC0D00010E03 /* RJSList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RJSList.cpp; path = src/RJSList.cpp; sourceTree = "<group>"; };
@ -204,6 +200,10 @@
0270BC7F1B7D020100010E03 /* schemas.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = schemas.js; path = tests/schemas.js; sourceTree = SOURCE_ROOT; }; 0270BC7F1B7D020100010E03 /* schemas.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = schemas.js; path = tests/schemas.js; sourceTree = SOURCE_ROOT; };
0270BCCF1B7D067300010E03 /* RealmReact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealmReact.h; path = ReactNative/RealmReact.h; sourceTree = "<group>"; }; 0270BCCF1B7D067300010E03 /* RealmReact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealmReact.h; path = ReactNative/RealmReact.h; sourceTree = "<group>"; };
0270BCD01B7D067300010E03 /* RealmReact.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RealmReact.mm; path = ReactNative/RealmReact.mm; sourceTree = "<group>"; }; 0270BCD01B7D067300010E03 /* RealmReact.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RealmReact.mm; path = ReactNative/RealmReact.mm; sourceTree = "<group>"; };
029445911BDEDF40006D1617 /* transact_log_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = transact_log_handler.cpp; path = "src/object-store/impl/transact_log_handler.cpp"; sourceTree = "<group>"; };
029445921BDEDF40006D1617 /* transact_log_handler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = transact_log_handler.hpp; path = "src/object-store/impl/transact_log_handler.hpp"; sourceTree = "<group>"; };
029445951BDEDF46006D1617 /* external_commit_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = external_commit_helper.cpp; path = "src/object-store/impl/apple/external_commit_helper.cpp"; sourceTree = "<group>"; };
029445961BDEDF46006D1617 /* external_commit_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = external_commit_helper.hpp; path = "src/object-store/impl/apple/external_commit_helper.hpp"; sourceTree = "<group>"; };
02A3C7841BC4317A00B1A7BE /* GCDWebServer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GCDWebServer.xcodeproj; path = vendor/GCDWebServer/GCDWebServer.xcodeproj; sourceTree = "<group>"; }; 02A3C7841BC4317A00B1A7BE /* GCDWebServer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GCDWebServer.xcodeproj; path = vendor/GCDWebServer/GCDWebServer.xcodeproj; sourceTree = "<group>"; };
02A3C7A41BC4341500B1A7BE /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 02A3C7A41BC4341500B1A7BE /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
02B29A161B7CF7C9008A7E6B /* RealmReact.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RealmReact.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 02B29A161B7CF7C9008A7E6B /* RealmReact.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RealmReact.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@ -265,17 +265,17 @@
0270BC641B7CFC1C00010E03 /* results.hpp */, 0270BC641B7CFC1C00010E03 /* results.hpp */,
0270BC651B7CFC1C00010E03 /* shared_realm.cpp */, 0270BC651B7CFC1C00010E03 /* shared_realm.cpp */,
0270BC661B7CFC1C00010E03 /* shared_realm.hpp */, 0270BC661B7CFC1C00010E03 /* shared_realm.hpp */,
02601F011BA0F0C4007C91FF /* external_commit_helper.cpp */,
02601F021BA0F0C4007C91FF /* external_commit_helper.hpp */,
02601F051BA0F0CD007C91FF /* index_set.cpp */, 02601F051BA0F0CD007C91FF /* index_set.cpp */,
02601F061BA0F0CD007C91FF /* index_set.hpp */, 02601F061BA0F0CD007C91FF /* index_set.hpp */,
02C0864C1BCDB27000942F9C /* list.cpp */, 02C0864C1BCDB27000942F9C /* list.cpp */,
02C0864D1BCDB27000942F9C /* list.hpp */, 02C0864D1BCDB27000942F9C /* list.hpp */,
02601F0B1BA0F3A7007C91FF /* schema.cpp */, 02601F0B1BA0F3A7007C91FF /* schema.cpp */,
02601F0C1BA0F3A7007C91FF /* schema.hpp */, 02601F0C1BA0F3A7007C91FF /* schema.hpp */,
02601F0F1BA10228007C91FF /* transact_log_handler.cpp */,
02601F101BA10228007C91FF /* transact_log_handler.hpp */,
02601F071BA0F0CD007C91FF /* realm_delegate.hpp */, 02601F071BA0F0CD007C91FF /* realm_delegate.hpp */,
029445911BDEDF40006D1617 /* transact_log_handler.cpp */,
029445921BDEDF40006D1617 /* transact_log_handler.hpp */,
029445951BDEDF46006D1617 /* external_commit_helper.cpp */,
029445961BDEDF46006D1617 /* external_commit_helper.hpp */,
0270BC3E1B7CFC0D00010E03 /* RealmJS.h */, 0270BC3E1B7CFC0D00010E03 /* RealmJS.h */,
0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */, 0270BC3F1B7CFC0D00010E03 /* RealmJS.mm */,
02258FB11BC6E2D00075F13A /* RealmRPC.hpp */, 02258FB11BC6E2D00075F13A /* RealmRPC.hpp */,
@ -399,11 +399,11 @@
02601F0E1BA0F3A7007C91FF /* schema.hpp in Headers */, 02601F0E1BA0F3A7007C91FF /* schema.hpp in Headers */,
0270BC6C1B7CFC1C00010E03 /* object_store.hpp in Headers */, 0270BC6C1B7CFC1C00010E03 /* object_store.hpp in Headers */,
02601F0A1BA0F0CD007C91FF /* realm_delegate.hpp in Headers */, 02601F0A1BA0F0CD007C91FF /* realm_delegate.hpp in Headers */,
02601F121BA10228007C91FF /* transact_log_handler.hpp in Headers */,
0270BC681B7CFC1C00010E03 /* object_accessor.hpp in Headers */, 0270BC681B7CFC1C00010E03 /* object_accessor.hpp in Headers */,
029445941BDEDF40006D1617 /* transact_log_handler.hpp in Headers */,
0270BC711B7CFC1C00010E03 /* shared_realm.hpp in Headers */, 0270BC711B7CFC1C00010E03 /* shared_realm.hpp in Headers */,
029445981BDEDF46006D1617 /* external_commit_helper.hpp in Headers */,
0270BC6A1B7CFC1C00010E03 /* object_schema.hpp in Headers */, 0270BC6A1B7CFC1C00010E03 /* object_schema.hpp in Headers */,
02601F041BA0F0C4007C91FF /* external_commit_helper.hpp in Headers */,
02601F091BA0F0CD007C91FF /* index_set.hpp in Headers */, 02601F091BA0F0CD007C91FF /* index_set.hpp in Headers */,
0270BC6D1B7CFC1C00010E03 /* property.hpp in Headers */, 0270BC6D1B7CFC1C00010E03 /* property.hpp in Headers */,
02C0864F1BCDB27000942F9C /* list.hpp in Headers */, 02C0864F1BCDB27000942F9C /* list.hpp in Headers */,
@ -643,15 +643,15 @@
0270BC511B7CFC0D00010E03 /* RJSObject.mm in Sources */, 0270BC511B7CFC0D00010E03 /* RJSObject.mm in Sources */,
0270BC4D1B7CFC0D00010E03 /* RealmJS.mm in Sources */, 0270BC4D1B7CFC0D00010E03 /* RealmJS.mm in Sources */,
02601F081BA0F0CD007C91FF /* index_set.cpp in Sources */, 02601F081BA0F0CD007C91FF /* index_set.cpp in Sources */,
029445931BDEDF40006D1617 /* transact_log_handler.cpp in Sources */,
02258FB41BC6E2D00075F13A /* RealmRPC.cpp in Sources */, 02258FB41BC6E2D00075F13A /* RealmRPC.cpp in Sources */,
02601F111BA10228007C91FF /* transact_log_handler.cpp in Sources */,
0270BC591B7CFC0D00010E03 /* RJSUtil.mm in Sources */, 0270BC591B7CFC0D00010E03 /* RJSUtil.mm in Sources */,
0270BC551B7CFC0D00010E03 /* RJSResults.mm in Sources */, 0270BC551B7CFC0D00010E03 /* RJSResults.mm in Sources */,
02C0864E1BCDB27000942F9C /* list.cpp in Sources */, 02C0864E1BCDB27000942F9C /* list.cpp in Sources */,
02601F031BA0F0C4007C91FF /* external_commit_helper.cpp in Sources */,
0270BC6B1B7CFC1C00010E03 /* object_store.cpp in Sources */, 0270BC6B1B7CFC1C00010E03 /* object_store.cpp in Sources */,
0270BC701B7CFC1C00010E03 /* shared_realm.cpp in Sources */, 0270BC701B7CFC1C00010E03 /* shared_realm.cpp in Sources */,
0270BC4E1B7CFC0D00010E03 /* RJSList.cpp in Sources */, 0270BC4E1B7CFC0D00010E03 /* RJSList.cpp in Sources */,
029445971BDEDF46006D1617 /* external_commit_helper.cpp in Sources */,
0270BC531B7CFC0D00010E03 /* RJSRealm.mm in Sources */, 0270BC531B7CFC0D00010E03 /* RJSRealm.mm in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

@ -32,7 +32,7 @@ static inline List * RJSVerifiedList(JSObjectRef object) {
static inline List * RJSVerifiedMutableList(JSObjectRef object) { static inline List * RJSVerifiedMutableList(JSObjectRef object) {
List *list = RJSVerifiedList(object); List *list = RJSVerifiedList(object);
if (!list->realm->is_in_transaction()) { if (!list->realm()->is_in_transaction()) {
throw std::runtime_error("Can only mutate lists within a transaction."); throw std::runtime_error("Can only mutate lists within a transaction.");
} }
return list; return list;
@ -49,7 +49,7 @@ JSValueRef ListGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef pro
return JSValueMakeNumber(ctx, size); return JSValueMakeNumber(ctx, size);
} }
return RJSObjectCreate(ctx, Object(list->realm, list->object_schema, list->get(RJSValidatedPositiveIndex(indexStr)))); return RJSObjectCreate(ctx, Object(list->realm(), list->object_schema, list->get(RJSValidatedPositiveIndex(indexStr))));
} }
catch (std::out_of_range &exp) { catch (std::out_of_range &exp) {
// getters for nonexistent properties in JS should always return undefined // getters for nonexistent properties in JS should always return undefined
@ -75,7 +75,7 @@ bool ListSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyN
throw std::runtime_error("The 'length' property is readonly."); throw std::runtime_error("The 'length' property is readonly.");
} }
list->set(RJSValidatedPositiveIndex(indexStr), RJSAccessor::to_object_index(ctx, list->realm, const_cast<JSValueRef &>(value), list->object_schema.name, false)); list->set(RJSValidatedPositiveIndex(indexStr), RJSAccessor::to_object_index(ctx, list->realm(), const_cast<JSValueRef &>(value), list->object_schema.name, false));
return true; return true;
} }
catch (std::invalid_argument &exp) { catch (std::invalid_argument &exp) {
@ -108,9 +108,9 @@ JSValueRef ListPush(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObje
List *array = RJSVerifiedMutableList(thisObject); List *array = RJSVerifiedMutableList(thisObject);
RJSValidateArgumentCountIsAtLeast(argumentCount, 1); RJSValidateArgumentCountIsAtLeast(argumentCount, 1);
for (size_t i = 0; i < argumentCount; i++) { for (size_t i = 0; i < argumentCount; i++) {
array->link_view->add(RJSAccessor::to_object_index(ctx, array->realm, const_cast<JSValueRef &>(arguments[i]), array->object_schema.name, false)); array->link_view()->add(RJSAccessor::to_object_index(ctx, array->realm(), const_cast<JSValueRef &>(arguments[i]), array->object_schema.name, false));
} }
return JSValueMakeNumber(ctx, array->link_view->size()); return JSValueMakeNumber(ctx, array->link_view()->size());
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { if (jsException) {
@ -130,8 +130,8 @@ JSValueRef ListPop(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObjec
return JSValueMakeUndefined(ctx); return JSValueMakeUndefined(ctx);
} }
size_t index = size - 1; size_t index = size - 1;
JSValueRef obj = RJSObjectCreate(ctx, Object(list->realm, list->object_schema, list->get(index))); JSValueRef obj = RJSObjectCreate(ctx, Object(list->realm(), list->object_schema, list->get(index)));
list->link_view->remove(index); list->link_view()->remove(index);
return obj; return obj;
} }
catch (std::exception &exp) { catch (std::exception &exp) {
@ -147,9 +147,9 @@ JSValueRef ListUnshift(JSContextRef ctx, JSObjectRef function, JSObjectRef thisO
List *array = RJSVerifiedMutableList(thisObject); List *array = RJSVerifiedMutableList(thisObject);
RJSValidateArgumentCountIsAtLeast(argumentCount, 1); RJSValidateArgumentCountIsAtLeast(argumentCount, 1);
for (size_t i = 0; i < argumentCount; i++) { for (size_t i = 0; i < argumentCount; i++) {
array->link_view->insert(i, RJSAccessor::to_object_index(ctx, array->realm, const_cast<JSValueRef &>(arguments[i]), array->object_schema.name, false)); array->link_view()->insert(i, RJSAccessor::to_object_index(ctx, array->realm(), const_cast<JSValueRef &>(arguments[i]), array->object_schema.name, false));
} }
return JSValueMakeNumber(ctx, array->link_view->size()); return JSValueMakeNumber(ctx, array->link_view()->size());
} }
catch (std::exception &exp) { catch (std::exception &exp) {
if (jsException) { if (jsException) {
@ -166,8 +166,8 @@ JSValueRef ListShift(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObj
if (list->size() == 0) { if (list->size() == 0) {
return JSValueMakeUndefined(ctx); return JSValueMakeUndefined(ctx);
} }
JSValueRef obj = RJSObjectCreate(ctx, Object(list->realm, list->object_schema, list->get(0))); JSValueRef obj = RJSObjectCreate(ctx, Object(list->realm(), list->object_schema, list->get(0)));
list->link_view->remove(0); list->link_view()->remove(0);
return obj; return obj;
} }
catch (std::exception &exp) { catch (std::exception &exp) {
@ -194,11 +194,11 @@ JSValueRef ListSplice(JSContextRef ctx, JSObjectRef function, JSObjectRef thisOb
std::vector<JSObjectRef> removedObjects(remove); std::vector<JSObjectRef> removedObjects(remove);
for (size_t i = 0; i < remove; i++) { for (size_t i = 0; i < remove; i++) {
removedObjects[i] = RJSObjectCreate(ctx, Object(list->realm, list->object_schema, list->get(index))); removedObjects[i] = RJSObjectCreate(ctx, Object(list->realm(), list->object_schema, list->get(index)));
list->link_view->remove(index); list->link_view()->remove(index);
} }
for (size_t i = 2; i < argumentCount; i++) { for (size_t i = 2; i < argumentCount; i++) {
list->link_view->insert(index + i - 2, RJSAccessor::to_object_index(ctx, list->realm, const_cast<JSValueRef &>(arguments[i]), list->object_schema.name, false)); list->link_view()->insert(index + i - 2, RJSAccessor::to_object_index(ctx, list->realm(), const_cast<JSValueRef &>(arguments[i]), list->object_schema.name, false));
} }
return JSObjectMakeArray(ctx, remove, removedObjects.data(), jsException); return JSObjectMakeArray(ctx, remove, removedObjects.data(), jsException);
} }

View File

@ -64,7 +64,7 @@ JSClassRef RJSObjectClass() {
} }
JSObjectRef RJSObjectCreate(JSContextRef ctx, Object object) { JSObjectRef RJSObjectCreate(JSContextRef ctx, Object object) {
JSValueRef prototype = RJSPrototypes(object.realm.get())[object.object_schema.name]; JSValueRef prototype = RJSPrototypes(object.realm().get())[object.object_schema.name];
JSObjectRef jsObject = RJSWrapObject(ctx, RJSObjectClass(), new Object(object), prototype); JSObjectRef jsObject = RJSWrapObject(ctx, RJSObjectClass(), new Object(object), prototype);
return jsObject; return jsObject;
} }
@ -155,10 +155,10 @@ template<> JSValueRef RJSAccessor::from_datetime(JSContextRef ctx, DateTime dt)
extern JSObjectRef RJSDictForPropertyArray(JSContextRef ctx, ObjectSchema &object_schema, JSObjectRef array); extern JSObjectRef RJSDictForPropertyArray(JSContextRef ctx, ObjectSchema &object_schema, JSObjectRef array);
template<> size_t RJSAccessor::to_object_index(JSContextRef ctx, SharedRealm &realm, JSValueRef &val, std::string &type, bool try_update) { template<> size_t RJSAccessor::to_object_index(JSContextRef ctx, SharedRealm realm, JSValueRef &val, const std::string &type, bool try_update) {
JSObjectRef object = RJSValidatedValueToObject(ctx, val); JSObjectRef object = RJSValidatedValueToObject(ctx, val);
if (JSValueIsObjectOfClass(ctx, val, RJSObjectClass())) { if (JSValueIsObjectOfClass(ctx, val, RJSObjectClass())) {
return RJSGetInternal<Object *>(object)->row.get_index(); return RJSGetInternal<Object *>(object)->row().get_index();
} }
auto object_schema = realm->config().schema->find(type); auto object_schema = realm->config().schema->find(type);
@ -167,7 +167,7 @@ template<> size_t RJSAccessor::to_object_index(JSContextRef ctx, SharedRealm &re
} }
Object child = Object::create<JSValueRef>(ctx, realm, *object_schema, (JSValueRef)object, try_update); Object child = Object::create<JSValueRef>(ctx, realm, *object_schema, (JSValueRef)object, try_update);
return child.row.get_index(); return child.row().get_index();
} }
template<> JSValueRef RJSAccessor::from_object(JSContextRef ctx, Object object) { template<> JSValueRef RJSAccessor::from_object(JSContextRef ctx, Object object) {
return RJSObjectCreate(ctx, object); return RJSObjectCreate(ctx, object);

View File

@ -339,7 +339,7 @@ JSValueRef RealmDelete(JSContextRef ctx, JSObjectRef function, JSObjectRef thisO
} }
realm::TableRef table = ObjectStore::table_for_object_type(realm->read_group(), object->object_schema.name); realm::TableRef table = ObjectStore::table_for_object_type(realm->read_group(), object->object_schema.name);
table->move_last_over(object->row.get_index()); table->move_last_over(object->row().get_index());
return NULL; return NULL;
} }

View File

@ -241,7 +241,7 @@ json RPCServer::serialize_json_value(JSValueRef value) {
return { return {
{"type", RJSTypeGet(realm::PropertyTypeArray)}, {"type", RJSTypeGet(realm::PropertyTypeArray)},
{"id", store_object(js_object)}, {"id", store_object(js_object)},
{"size", list->link_view->size()}, {"size", list->link_view()->size()},
{"schema", serialize_object_schema(list->object_schema)} {"schema", serialize_object_schema(list->object_schema)}
}; };
} }
@ -277,7 +277,7 @@ json RPCServer::serialize_json_value(JSValueRef value) {
assert(0); assert(0);
} }
json RPCServer::serialize_object_schema(realm::ObjectSchema &object_schema) { json RPCServer::serialize_object_schema(const realm::ObjectSchema &object_schema) {
json properties = json::array(); json properties = json::array();
for (realm::Property prop : object_schema.properties) { for (realm::Property prop : object_schema.properties) {
properties.push_back({ properties.push_back({

View File

@ -48,7 +48,7 @@ class RPCServer {
json serialize_json_value(JSValueRef value); json serialize_json_value(JSValueRef value);
JSValueRef deserialize_json_value(const json dict); JSValueRef deserialize_json_value(const json dict);
json serialize_object_schema(realm::ObjectSchema &objectSchema); json serialize_object_schema(const realm::ObjectSchema &objectSchema);
}; };
} }

View File

@ -30,6 +30,7 @@
#include <sstream> #include <sstream>
using namespace realm; using namespace realm;
using namespace realm::_impl;
namespace { namespace {
// Write a byte to a pipe to notify anyone waiting for data on the pipe // Write a byte to a pipe to notify anyone waiting for data on the pipe

View File

@ -26,6 +26,7 @@
namespace realm { namespace realm {
class Realm; class Realm;
namespace _impl {
class ExternalCommitHelper { class ExternalCommitHelper {
public: public:
ExternalCommitHelper(Realm* realm); ExternalCommitHelper(Realm* realm);
@ -87,6 +88,7 @@ private:
FdHolder m_shutdown_write_fd; FdHolder m_shutdown_write_fd;
}; };
} // namespace _impl
} // namespace realm } // namespace realm
#endif /* REALM_EXTERNAL_COMMIT_HELPER_HPP */ #endif /* REALM_EXTERNAL_COMMIT_HELPER_HPP */

View File

@ -316,6 +316,7 @@ public:
} // anonymous namespace } // anonymous namespace
namespace realm { namespace realm {
namespace _impl {
namespace transaction { namespace transaction {
void advance(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate) { void advance(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate) {
TransactLogHandler(delegate, sg, [&](auto&&... args) { TransactLogHandler(delegate, sg, [&](auto&&... args) {
@ -344,4 +345,5 @@ void cancel(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate) {
} }
} // namespace transaction } // namespace transaction
} // namespace _impl
} // namespace realm } // namespace realm

View File

@ -24,6 +24,7 @@ class RealmDelegate;
class SharedGroup; class SharedGroup;
class ClientHistory; class ClientHistory;
namespace _impl {
namespace transaction { namespace transaction {
// Advance the read transaction version, with change notifications sent to delegate // Advance the read transaction version, with change notifications sent to delegate
// Must not be called from within a write transaction. // Must not be called from within a write transaction.
@ -41,6 +42,7 @@ void commit(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate);
// for reverting to the old values sent to delegate // for reverting to the old values sent to delegate
void cancel(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate); void cancel(SharedGroup& sg, ClientHistory& history, RealmDelegate* delegate);
} // namespace transaction } // namespace transaction
} // namespace _impl
} // namespace realm } // namespace realm
#endif /* REALM_TRANSACT_LOG_HANDLER_HPP */ #endif /* REALM_TRANSACT_LOG_HANDLER_HPP */

View File

@ -22,29 +22,29 @@
using namespace realm; using namespace realm;
size_t List::size() { size_t List::size() {
return link_view->size(); return m_link_view->size();
} }
Row List::get(std::size_t row_ndx) { Row List::get(std::size_t row_ndx) {
verify_valid_row(row_ndx); verify_valid_row(row_ndx);
return link_view->get(row_ndx); return m_link_view->get(row_ndx);
} }
void List::set(std::size_t row_ndx, std::size_t target_row_ndx) { void List::set(std::size_t row_ndx, std::size_t target_row_ndx) {
verify_valid_row(row_ndx); verify_valid_row(row_ndx);
link_view->set(row_ndx, target_row_ndx); m_link_view->set(row_ndx, target_row_ndx);
} }
void List::verify_valid_row(std::size_t row_ndx) { void List::verify_valid_row(std::size_t row_ndx) {
size_t size = link_view->size(); size_t size = m_link_view->size();
if (row_ndx >= size) { if (row_ndx >= size) {
throw std::out_of_range(std::string("Index ") + std::to_string(row_ndx) + " is outside of range 0..." + std::to_string(size) + "."); throw std::out_of_range(std::string("Index ") + std::to_string(row_ndx) + " is outside of range 0..." + std::to_string(size) + ".");
} }
} }
void List::verify_attached() { void List::verify_attached() {
if (!link_view->is_attached()) { if (!m_link_view->is_attached()) {
throw std::runtime_error("Tableview is not attached"); throw std::runtime_error("Tableview is not attached");
} }
link_view->sync_if_needed(); m_link_view->sync_if_needed();
} }

View File

@ -23,18 +23,24 @@
#import <realm/link_view.hpp> #import <realm/link_view.hpp>
namespace realm { namespace realm {
struct List { class List {
List(SharedRealm &r, ObjectSchema &s, LinkViewRef l) : realm(r), object_schema(s), link_view(l) {} public:
// FIXME - all should be const List(SharedRealm &r, const ObjectSchema &s, LinkViewRef l) : m_realm(r), object_schema(s), m_link_view(l) {}
SharedRealm realm;
ObjectSchema &object_schema; const ObjectSchema &object_schema;
LinkViewRef link_view; SharedRealm realm() { return m_realm; }
LinkViewRef link_view() { return m_link_view; }
size_t size(); size_t size();
Row get(std::size_t row_ndx); Row get(std::size_t row_ndx);
void set(std::size_t row_ndx, std::size_t target_row_ndx); void set(std::size_t row_ndx, std::size_t target_row_ndx);
void verify_valid_row(std::size_t row_ndx); void verify_valid_row(std::size_t row_ndx);
void verify_attached(); void verify_attached();
private:
SharedRealm m_realm;
LinkViewRef m_link_view;
}; };
} }

View File

@ -27,11 +27,7 @@ namespace realm {
class Object { class Object {
public: public:
Object(SharedRealm &r, ObjectSchema &s, Row o) : realm(r), object_schema(s), row(o) {} Object(SharedRealm r, const ObjectSchema &s, Row o) : m_realm(r), object_schema(s), m_row(o) {}
// FIXME - all should be const
SharedRealm realm;
ObjectSchema &object_schema;
Row row;
// property getter/setter // property getter/setter
template<typename ValueType, typename ContextType> template<typename ValueType, typename ContextType>
@ -43,12 +39,19 @@ namespace realm {
// create an Object from a native representation // create an Object from a native representation
template<typename ValueType, typename ContextType> template<typename ValueType, typename ContextType>
static inline Object create(ContextType ctx, SharedRealm realm, ObjectSchema &object_schema, ValueType value, bool try_update); static inline Object create(ContextType ctx, SharedRealm realm, ObjectSchema &object_schema, ValueType value, bool try_update);
const ObjectSchema &object_schema;
SharedRealm realm() { return m_realm; }
Row row() { return m_row; }
private: private:
SharedRealm m_realm;
Row m_row;
template<typename ValueType, typename ContextType> template<typename ValueType, typename ContextType>
inline void set_property_value_impl(ContextType ctx, Property &property, ValueType value, bool try_update); inline void set_property_value_impl(ContextType ctx, const Property &property, ValueType value, bool try_update);
template<typename ValueType, typename ContextType> template<typename ValueType, typename ContextType>
inline ValueType get_property_value_impl(ContextType ctx, Property &property); inline ValueType get_property_value_impl(ContextType ctx, const Property &property);
}; };
// //
@ -82,7 +85,7 @@ namespace realm {
// convert value to persisted object // convert value to persisted object
// for existing objects return the existing row index // for existing objects return the existing row index
// for new/updated objects return the row index // for new/updated objects return the row index
static size_t to_object_index(ContextType ctx, SharedRealm &realm, ValueType &val, std::string &type, bool try_update); static size_t to_object_index(ContextType ctx, SharedRealm realm, ValueType &val, const std::string &type, bool try_update);
static ValueType from_object(ContextType ctx, Object); static ValueType from_object(ContextType ctx, Object);
// list value acessors // list value acessors
@ -102,7 +105,7 @@ namespace realm {
template <typename ValueType, typename ContextType> template <typename ValueType, typename ContextType>
inline void Object::set_property_value(ContextType ctx, std::string prop_name, ValueType value, bool try_update) inline void Object::set_property_value(ContextType ctx, std::string prop_name, ValueType value, bool try_update)
{ {
Property *prop = object_schema.property_for_name(prop_name); const Property *prop = object_schema.property_for_name(prop_name);
if (!prop) { if (!prop) {
throw std::runtime_error("Setting invalid property '" + prop_name + "' on object '" + object_schema.name + "'."); throw std::runtime_error("Setting invalid property '" + prop_name + "' on object '" + object_schema.name + "'.");
} }
@ -112,7 +115,7 @@ namespace realm {
template <typename ValueType, typename ContextType> template <typename ValueType, typename ContextType>
inline ValueType Object::get_property_value(ContextType ctx, std::string prop_name) inline ValueType Object::get_property_value(ContextType ctx, std::string prop_name)
{ {
Property *prop = object_schema.property_for_name(prop_name); const Property *prop = object_schema.property_for_name(prop_name);
if (!prop) { if (!prop) {
throw std::runtime_error("Setting invalid property '" + prop_name + "' on object '" + object_schema.name + "'."); throw std::runtime_error("Setting invalid property '" + prop_name + "' on object '" + object_schema.name + "'.");
} }
@ -120,56 +123,56 @@ namespace realm {
}; };
template <typename ValueType, typename ContextType> template <typename ValueType, typename ContextType>
inline void Object::set_property_value_impl(ContextType ctx, Property &property, ValueType value, bool try_update) inline void Object::set_property_value_impl(ContextType ctx, const Property &property, ValueType value, bool try_update)
{ {
using Accessor = NativeAccessor<ValueType, ContextType>; using Accessor = NativeAccessor<ValueType, ContextType>;
if (!realm->is_in_transaction()) { if (!m_realm->is_in_transaction()) {
throw std::runtime_error("Can only set property values within a transaction."); throw std::runtime_error("Can only set property values within a transaction.");
} }
size_t column = property.table_column; size_t column = property.table_column;
switch (property.type) { switch (property.type) {
case PropertyTypeBool: case PropertyTypeBool:
row.set_bool(column, Accessor::to_bool(ctx, value)); m_row.set_bool(column, Accessor::to_bool(ctx, value));
break; break;
case PropertyTypeInt: case PropertyTypeInt:
row.set_int(column, Accessor::to_long(ctx, value)); m_row.set_int(column, Accessor::to_long(ctx, value));
break; break;
case PropertyTypeFloat: case PropertyTypeFloat:
row.set_float(column, Accessor::to_float(ctx, value)); m_row.set_float(column, Accessor::to_float(ctx, value));
break; break;
case PropertyTypeDouble: case PropertyTypeDouble:
row.set_double(column, Accessor::to_double(ctx, value)); m_row.set_double(column, Accessor::to_double(ctx, value));
break; break;
case PropertyTypeString: case PropertyTypeString:
row.set_string(column, Accessor::to_string(ctx, value)); m_row.set_string(column, Accessor::to_string(ctx, value));
break; break;
case PropertyTypeData: case PropertyTypeData:
row.set_binary(column, BinaryData(Accessor::to_string(ctx, value))); m_row.set_binary(column, BinaryData(Accessor::to_string(ctx, value)));
break; break;
case PropertyTypeAny: case PropertyTypeAny:
row.set_mixed(column, Accessor::to_mixed(ctx, value)); m_row.set_mixed(column, Accessor::to_mixed(ctx, value));
break; break;
case PropertyTypeDate: case PropertyTypeDate:
row.set_datetime(column, Accessor::to_datetime(ctx, value)); m_row.set_datetime(column, Accessor::to_datetime(ctx, value));
break; break;
case PropertyTypeObject: { case PropertyTypeObject: {
if (Accessor::is_null(ctx, value)) { if (Accessor::is_null(ctx, value)) {
row.nullify_link(column); m_row.nullify_link(column);
} }
else { else {
row.set_link(column, Accessor::to_object_index(ctx, realm, value, property.object_type, try_update)); m_row.set_link(column, Accessor::to_object_index(ctx, m_realm, value, property.object_type, try_update));
} }
break; break;
} }
case PropertyTypeArray: { case PropertyTypeArray: {
realm::LinkViewRef link_view = row.get_linklist(column); realm::LinkViewRef link_view = m_row.get_linklist(column);
link_view->clear(); link_view->clear();
size_t count = Accessor::list_size(ctx, value); size_t count = Accessor::list_size(ctx, value);
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
ValueType element = Accessor::list_value_at_index(ctx, value, i); ValueType element = Accessor::list_value_at_index(ctx, value, i);
link_view->add(Accessor::to_object_index(ctx, realm, element, property.object_type, try_update)); link_view->add(Accessor::to_object_index(ctx, m_realm, element, property.object_type, try_update));
} }
break; break;
} }
@ -177,39 +180,39 @@ namespace realm {
} }
template <typename ValueType, typename ContextType> template <typename ValueType, typename ContextType>
inline ValueType Object::get_property_value_impl(ContextType ctx, Property &property) inline ValueType Object::get_property_value_impl(ContextType ctx, const Property &property)
{ {
using Accessor = NativeAccessor<ValueType, ContextType>; using Accessor = NativeAccessor<ValueType, ContextType>;
size_t column = property.table_column; size_t column = property.table_column;
switch (property.type) { switch (property.type) {
case PropertyTypeBool: case PropertyTypeBool:
return Accessor::from_bool(ctx, row.get_bool(column)); return Accessor::from_bool(ctx, m_row.get_bool(column));
case PropertyTypeInt: case PropertyTypeInt:
return Accessor::from_long(ctx, row.get_int(column)); return Accessor::from_long(ctx, m_row.get_int(column));
case PropertyTypeFloat: case PropertyTypeFloat:
return Accessor::from_float(ctx, row.get_float(column)); return Accessor::from_float(ctx, m_row.get_float(column));
case PropertyTypeDouble: case PropertyTypeDouble:
return Accessor::from_double(ctx, row.get_double(column)); return Accessor::from_double(ctx, m_row.get_double(column));
case PropertyTypeString: case PropertyTypeString:
return Accessor::from_string(ctx, row.get_string(column)); return Accessor::from_string(ctx, m_row.get_string(column));
case PropertyTypeData: case PropertyTypeData:
return Accessor::from_string(ctx, (std::string)row.get_binary(column)); return Accessor::from_string(ctx, (std::string)m_row.get_binary(column));
case PropertyTypeAny: case PropertyTypeAny:
throw "Any not supported"; throw "Any not supported";
case PropertyTypeDate: case PropertyTypeDate:
return Accessor::from_datetime(ctx, row.get_datetime(column)); return Accessor::from_datetime(ctx, m_row.get_datetime(column));
case PropertyTypeObject: { case PropertyTypeObject: {
auto linkObjectSchema = realm->config().schema->find(property.object_type); auto linkObjectSchema = m_realm->config().schema->find(property.object_type);
TableRef table = ObjectStore::table_for_object_type(realm->read_group(), linkObjectSchema->name); TableRef table = ObjectStore::table_for_object_type(m_realm->read_group(), linkObjectSchema->name);
if (row.is_null_link(property.table_column)) { if (m_row.is_null_link(property.table_column)) {
return Accessor::null_value(ctx); return Accessor::null_value(ctx);
} }
return Accessor::from_object(ctx, std::move(Object(realm, *linkObjectSchema, table->get(row.get_link(column))))); return Accessor::from_object(ctx, std::move(Object(m_realm, *linkObjectSchema, table->get(m_row.get_link(column)))));
} }
case PropertyTypeArray: { case PropertyTypeArray: {
auto arrayObjectSchema = realm->config().schema->find(property.object_type); auto arrayObjectSchema = m_realm->config().schema->find(property.object_type);
return Accessor::from_list(ctx, std::move(List(realm, *arrayObjectSchema, static_cast<LinkViewRef>(row.get_linklist(column))))); return Accessor::from_list(ctx, std::move(List(m_realm, *arrayObjectSchema, static_cast<LinkViewRef>(m_row.get_linklist(column)))));
} }
} }
} }
@ -229,7 +232,7 @@ namespace realm {
// try to get existing row if updating // try to get existing row if updating
size_t row_index = realm::not_found; size_t row_index = realm::not_found;
realm::TableRef table = ObjectStore::table_for_object_type(realm->read_group(), object_schema.name); realm::TableRef table = ObjectStore::table_for_object_type(realm->read_group(), object_schema.name);
Property *primary_prop = object_schema.primary_key_property(); const Property *primary_prop = object_schema.primary_key_property();
if (primary_prop) { if (primary_prop) {
// search for existing object based on primary key type // search for existing object based on primary key type
ValueType primary_value = Accessor::dict_value_for_key(ctx, value, object_schema.primary_key); ValueType primary_value = Accessor::dict_value_for_key(ctx, value, object_schema.primary_key);

View File

@ -149,6 +149,13 @@ static inline bool property_has_changed(Property const& p1, Property const& p2)
|| p1.is_nullable != p2.is_nullable; || p1.is_nullable != p2.is_nullable;
} }
static inline bool property_can_be_migrated_to_nullable(const Property& old_property, const Property& new_property) {
return old_property.type == new_property.type
&& !old_property.is_nullable
&& new_property.is_nullable
&& new_property.name == old_property.name;
}
void ObjectStore::verify_schema(Schema const& actual_schema, Schema& target_schema, bool allow_missing_tables) { void ObjectStore::verify_schema(Schema const& actual_schema, Schema& target_schema, bool allow_missing_tables) {
std::vector<ObjectSchemaValidationException> errors; std::vector<ObjectSchemaValidationException> errors;
for (auto &object_schema : target_schema) { for (auto &object_schema : target_schema) {
@ -205,6 +212,45 @@ std::vector<ObjectSchemaValidationException> ObjectStore::verify_object_schema(O
return exceptions; return exceptions;
} }
template <typename T>
static void copy_property_values(const Property& old_property, const Property& new_property, Table& table,
T (Table::*getter)(std::size_t, std::size_t) const noexcept,
void (Table::*setter)(std::size_t, std::size_t, T)) {
size_t old_column = old_property.table_column, new_column = new_property.table_column;
size_t count = table.size();
for (size_t i = 0; i < count; i++) {
(table.*setter)(new_column, i, (table.*getter)(old_column, i));
}
}
static void copy_property_values(const Property& source, const Property& destination, Table& table) {
switch (destination.type) {
case PropertyTypeInt:
copy_property_values(source, destination, table, &Table::get_int, &Table::set_int);
break;
case PropertyTypeBool:
copy_property_values(source, destination, table, &Table::get_bool, &Table::set_bool);
break;
case PropertyTypeFloat:
copy_property_values(source, destination, table, &Table::get_float, &Table::set_float);
break;
case PropertyTypeDouble:
copy_property_values(source, destination, table, &Table::get_double, &Table::set_double);
break;
case PropertyTypeString:
copy_property_values(source, destination, table, &Table::get_string, &Table::set_string);
break;
case PropertyTypeData:
copy_property_values(source, destination, table, &Table::get_binary, &Table::set_binary);
break;
case PropertyTypeDate:
copy_property_values(source, destination, table, &Table::get_datetime, &Table::set_datetime);
break;
default:
break;
}
}
// set references to tables on targetSchema and create/update any missing or out-of-date tables // set references to tables on targetSchema and create/update any missing or out-of-date tables
// if update existing is true, updates existing tables, otherwise validates existing tables // if update existing is true, updates existing tables, otherwise validates existing tables
// NOTE: must be called from within write transaction // NOTE: must be called from within write transaction
@ -230,13 +276,40 @@ bool ObjectStore::create_tables(Group *group, Schema &target_schema, bool update
ObjectSchema current_schema(group, target_object_schema->name); ObjectSchema current_schema(group, target_object_schema->name);
std::vector<Property> &target_props = target_object_schema->properties; std::vector<Property> &target_props = target_object_schema->properties;
// handle columns changing from required to optional
for (auto& current_prop : current_schema.properties) {
auto target_prop = target_object_schema->property_for_name(current_prop.name);
if (!target_prop || !property_can_be_migrated_to_nullable(current_prop, *target_prop))
continue;
target_prop->table_column = current_prop.table_column;
current_prop.table_column = current_prop.table_column + 1;
table->insert_column(target_prop->table_column, DataType(target_prop->type), target_prop->name, target_prop->is_nullable);
copy_property_values(current_prop, *target_prop, *table);
table->remove_column(current_prop.table_column);
current_prop.table_column = target_prop->table_column;
changed = true;
}
bool inserted_placeholder_column = false;
// remove extra columns // remove extra columns
size_t deleted = 0; size_t deleted = 0;
for (auto& current_prop : current_schema.properties) { for (auto& current_prop : current_schema.properties) {
current_prop.table_column -= deleted; current_prop.table_column -= deleted;
auto target_prop = target_object_schema->property_for_name(current_prop.name); auto target_prop = target_object_schema->property_for_name(current_prop.name);
if (!target_prop || property_has_changed(current_prop, *target_prop)) { if (!target_prop || (property_has_changed(current_prop, *target_prop)
&& !property_can_be_migrated_to_nullable(current_prop, *target_prop))) {
if (deleted == current_schema.properties.size() - 1) {
// We're about to remove the last column from the table. Insert a placeholder column to preserve
// the number of rows in the table for the addition of new columns below.
table->add_column(type_Bool, "placeholder");
inserted_placeholder_column = true;
}
table->remove_column(current_prop.table_column); table->remove_column(current_prop.table_column);
++deleted; ++deleted;
current_prop.table_column = npos; current_prop.table_column = npos;
@ -273,6 +346,15 @@ bool ObjectStore::create_tables(Group *group, Schema &target_schema, bool update
} }
} }
if (inserted_placeholder_column) {
// We inserted a placeholder due to removing all columns from the table. Remove it, and update the indices
// of any columns that we inserted after it.
table->remove_column(0);
for (auto& target_prop : target_props) {
target_prop.table_column--;
}
}
// update table metadata // update table metadata
if (target_object_schema->primary_key.length()) { if (target_object_schema->primary_key.length()) {
// if there is a primary key set, check if it is the same as the old key // if there is a primary key set, check if it is the same as the old key

View File

@ -29,6 +29,7 @@
#include <mutex> #include <mutex>
using namespace realm; using namespace realm;
using namespace realm::_impl;
RealmCache Realm::s_global_cache; RealmCache Realm::s_global_cache;

View File

@ -28,13 +28,16 @@
namespace realm { namespace realm {
class ClientHistory; class ClientHistory;
class ExternalCommitHelper;
class Realm; class Realm;
class RealmCache; class RealmCache;
class RealmDelegate; class RealmDelegate;
typedef std::shared_ptr<Realm> SharedRealm; typedef std::shared_ptr<Realm> SharedRealm;
typedef std::weak_ptr<Realm> WeakRealm; typedef std::weak_ptr<Realm> WeakRealm;
namespace _impl {
class ExternalCommitHelper;
}
class Realm : public std::enable_shared_from_this<Realm> class Realm : public std::enable_shared_from_this<Realm>
{ {
public: public:
@ -115,7 +118,7 @@ namespace realm {
Group *m_group = nullptr; Group *m_group = nullptr;
std::shared_ptr<ExternalCommitHelper> m_notifier; std::shared_ptr<_impl::ExternalCommitHelper> m_notifier;
public: public:
std::unique_ptr<RealmDelegate> m_delegate; std::unique_ptr<RealmDelegate> m_delegate;