Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
nielsenko committed Apr 17, 2024
1 parent 6082d4a commit bfd85df
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 114 deletions.
2 changes: 1 addition & 1 deletion packages/realm_dart/lib/src/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class ManagedRealmList<T extends Object?> with RealmEntity, ListMixin<T> impleme
late RealmObjectMetadata targetMetadata;
late Type type;
if (T == RealmValue) {
(type, targetMetadata) = realm.metadata.getByClassKey(value.getClassKey());
(type, targetMetadata) = realm.metadata.getByClassKey(value.classKey);
} else {
targetMetadata = _metadata!;
type = T;
Expand Down
2 changes: 1 addition & 1 deletion packages/realm_dart/lib/src/map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class ManagedRealmMap<T extends Object?> with RealmEntity, MapMixin<String, T> i
late RealmObjectMetadata targetMetadata;
late Type type;
if (T == RealmValue) {
(type, targetMetadata) = realm.metadata.getByClassKey(value.getClassKey());
(type, targetMetadata) = realm.metadata.getByClassKey(value.classKey);
} else {
targetMetadata = _metadata!;
type = T;
Expand Down
75 changes: 63 additions & 12 deletions packages/realm_dart/lib/src/native/object_handle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,67 @@ class ObjectHandle extends RootedHandleBase<realm_object> {
return ObjectHandle._(objectPtr, _root);
}

int getClassKey() => realmLib.realm_object_get_table(pointer);
int get classKey => realmLib.realm_object_get_table(pointer);

/*
Object? getProperty(int propertyKey) {
bool get isValid => realmLib.realm_object_is_valid(pointer);

// TODO: avoid taking the [realm] parameter
Object? getValue(Realm realm, int propertyKey) {
return using((Arena arena) {
final realmValue = arena<realm_value_t>();
invokeGetBool(() => realmLib.realm_get_value(pointer, propertyKey, realmValue));
return realmValue.toDartValue(
object.realm,
realm,
() => realmLib.realm_get_list(pointer, propertyKey),
() => realmLib.realm_get_dictionary(pointer, propertyKey),
);
});
}
*/

void setProperty(int propertyKey, Object? value, bool isDefault) {
// TODO: value should be RealmValue, and perhaps this method should be combined
// with setCollection?
void setValue(int propertyKey, Object? value, bool isDefault) {
using((Arena arena) {
final realmValue = _toRealmValue(value, arena);
invokeGetBool(() => realmLib.realm_set_value(pointer, propertyKey, realmValue.ref, isDefault));
invokeGetBool(
() => realmLib.realm_set_value(
pointer,
propertyKey,
realmValue.ref,
isDefault,
),
);
});
}

/*
void objectSetCollection(int propertyKey, RealmValue value) {
_createCollection(object.realm, value, () => realmLib.realm_set_list(pointer, propertyKey),
() => realmLib.realm_set_dictionary(pointer, propertyKey));
ListHandle getList(int propertyKey) {
final ptr = invokeGetPointer(() => realmLib.realm_get_list(pointer, propertyKey));
return ListHandle._(ptr, _root);
}

SetHandle getSet(int propertyKey) {
final ptr = invokeGetPointer(() => realmLib.realm_get_set(pointer, propertyKey));
return SetHandle._(ptr, _root);
}

MapHandle getMap(int propertyKey) {
final ptr = invokeGetPointer(() => realmLib.realm_get_dictionary(pointer, propertyKey));
return MapHandle._(ptr, _root);
}

ResultsHandle getBacklinks(int sourceTableKey, int propertyKey) {
final ptr = invokeGetPointer(() => realmLib.realm_get_backlinks(pointer, sourceTableKey, propertyKey));
return ResultsHandle._(ptr, _root);
}

void setCollection(Realm realm, int propertyKey, RealmValue value) {
_createCollection(
realm,
value,
() => realmLib.realm_set_list(pointer, propertyKey),
() => realmLib.realm_set_dictionary(pointer, propertyKey),
);
}
*/

String objectToString() {
return realmLib.realm_object_to_string(pointer).cast<Utf8>().toRealmDartString(freeRealmMemory: true)!;
Expand All @@ -48,4 +80,23 @@ class ObjectHandle extends RootedHandleBase<realm_object> {
void delete() {
invokeGetBool(() => realmLib.realm_object_delete(pointer));
}

ObjectHandle? resolveIn(RealmHandle frozenRealm) {
return using((Arena arena) {
final resultPtr = arena<Pointer<realm_object>>();
invokeGetBool(() => realmLib.realm_object_resolve_in(pointer, frozenRealm.pointer, resultPtr));
return resultPtr == nullptr ? null : ObjectHandle._(resultPtr.value, frozenRealm);
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
final ptr = invokeGetPointer(() => realmLib.realm_object_add_notification_callback(
pointer,
controller.toPersistentHandle(),
realmLib.addresses.realm_dart_delete_persistent_handle,
nullptr,
Pointer.fromFunction(object_change_callback),
));
return RealmNotificationTokenHandle._(ptr, _root);
}
}
73 changes: 0 additions & 73 deletions packages/realm_dart/lib/src/native/realm_core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -522,12 +522,6 @@ class _RealmCore {
realmLib.realm_scheduler_perform_work(queuePointer);
}

RealmHandle openRealm(Configuration config) {
final configHandle = ConfigHandle(config);
final realmPtr = invokeGetPointer(() => realmLib.realm_open(configHandle.pointer), "Error opening realm at path ${config.path}");
return RealmHandle._(realmPtr);
}

RealmAsyncOpenTaskHandle createRealmAsyncOpenTask(FlexibleSyncConfiguration config) {
final configHandle = ConfigHandle(config);
final asyncOpenTaskPtr = invokeGetPointer(() => realmLib.realm_open_synchronized(configHandle.pointer), "Error opening realm at path ${config.path}");
Expand Down Expand Up @@ -718,29 +712,6 @@ class _RealmCore {
});
}

Object? getProperty(RealmObjectBase object, int propertyKey) {
return using((Arena arena) {
final realm_value = arena<realm_value_t>();
invokeGetBool(() => realmLib.realm_get_value(object.handle.pointer, propertyKey, realm_value));
return realm_value.toDartValue(object.realm, () => realmLib.realm_get_list(object.handle.pointer, propertyKey),
() => realmLib.realm_get_dictionary(object.handle.pointer, propertyKey));
});
}

void setProperty(RealmObjectBase object, int propertyKey, Object? value, bool isDefault) {
using((Arena arena) {
final realm_value = _toRealmValue(value, arena);
invokeGetBool(() => realmLib.realm_set_value(object.handle.pointer, propertyKey, realm_value.ref, isDefault));
});
}

void objectSetCollection(RealmObjectBase object, int propertyKey, RealmValue value) {
_createCollection(object.realm, value, () => realmLib.realm_set_list(object.handle.pointer, propertyKey),
() => realmLib.realm_set_dictionary(object.handle.pointer, propertyKey));
}

String objectToString(RealmObjectBase object) => object.handle.objectToString();

// For debugging
// ignore: unused_element
int get _threadId => realmLib.realm_dart_get_thread_id();
Expand Down Expand Up @@ -888,26 +859,6 @@ class _RealmCore {
return ObjectHandle._(pointer, realm.handle);
}

ListHandle getListProperty(RealmObjectBase object, int propertyKey) {
final pointer = invokeGetPointer(() => realmLib.realm_get_list(object.handle.pointer, propertyKey));
return ListHandle._(pointer, object.realm.handle);
}

ResultsHandle getBacklinks(RealmObjectBase object, int sourceTableKey, int propertyKey) {
final pointer = invokeGetPointer(() => realmLib.realm_get_backlinks(object.handle.pointer, sourceTableKey, propertyKey));
return ResultsHandle._(pointer, object.realm.handle);
}

SetHandle getSetProperty(RealmObjectBase object, int propertyKey) {
final pointer = invokeGetPointer(() => realmLib.realm_get_set(object.handle.pointer, propertyKey));
return SetHandle._(pointer, object.realm.handle);
}

MapHandle getMapProperty(RealmObjectBase object, int propertyKey) {
final pointer = invokeGetPointer(() => realmLib.realm_get_dictionary(object.handle.pointer, propertyKey));
return MapHandle._(pointer, object.realm.handle);
}

bool _equals<T extends NativeType>(HandleBase<T> first, HandleBase<T> second) {
return realmLib.realm_equals(first.pointer.cast(), second.pointer.cast());
}
Expand All @@ -925,10 +876,6 @@ class _RealmCore {
return hashCode;
}

bool objectIsValid(RealmObjectBase object) {
return realmLib.realm_object_is_valid(object.handle.pointer);
}

RealmNotificationTokenHandle subscribeResultsNotifications(RealmResults results, NotificationsController controller) {
final pointer = invokeGetPointer(() => realmLib.realm_results_add_notification_callback(
results.handle.pointer,
Expand All @@ -941,18 +888,6 @@ class _RealmCore {
return RealmNotificationTokenHandle._(pointer, results.realm.handle);
}

RealmNotificationTokenHandle subscribeObjectNotifications(RealmObjectBase object, NotificationsController controller) {
final pointer = invokeGetPointer(() => realmLib.realm_object_add_notification_callback(
object.handle.pointer,
controller.toPersistentHandle(),
realmLib.addresses.realm_dart_delete_persistent_handle,
nullptr,
Pointer.fromFunction(object_change_callback),
));

return RealmNotificationTokenHandle._(pointer, object.realm.handle);
}

UserNotificationTokenHandle subscribeUserNotifications(UserNotificationsController controller) {
final callback = Pointer.fromFunction<Void Function(Handle, Int32)>(user_change_callback);
final userdata = realmLib.realm_dart_userdata_async_new(controller, callback.cast(), scheduler.handle.pointer);
Expand Down Expand Up @@ -1091,14 +1026,6 @@ class _RealmCore {

ResultsHandle resolveResults(RealmResults realmResults, Realm frozenRealm) => realmResults.handle.resolveIn(frozenRealm.handle);

ObjectHandle? resolveObject(RealmObjectBase object, Realm frozenRealm) {
return using((Arena arena) {
final resultPtr = arena<Pointer<realm_object>>();
invokeGetBool(() => realmLib.realm_object_resolve_in(object.handle.pointer, frozenRealm.handle.pointer, resultPtr));
return resultPtr == nullptr ? null : ObjectHandle._(resultPtr.value, frozenRealm.handle);
});
}

ListHandle? resolveList(ManagedRealmList list, Realm frozenRealm) {
return using((Arena arena) {
final resultPtr = arena<Pointer<realm_list>>();
Expand Down
6 changes: 6 additions & 0 deletions packages/realm_dart/lib/src/native/realm_handle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ class RealmHandle extends HandleBase<shared_realm> {

RealmHandle._unowned(super.pointer) : super.unowned();

factory RealmHandle.open(Configuration config) {
final configHandle = ConfigHandle(config);
final realmPtr = invokeGetPointer(() => realmLib.realm_open(configHandle.pointer), 'Error opening realm at path ${config.path}');
return RealmHandle._(realmPtr);
}

int addChild(RootedHandleBase child) {
final id = _counter++;
_children[id] = WeakReference(child);
Expand Down
18 changes: 9 additions & 9 deletions packages/realm_dart/lib/src/realm_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ class Realm implements Finalizable {

static RealmHandle _openRealm(Configuration config) {
_ensureDirectory(config);
return realmCore.openRealm(config);
return RealmHandle.open(config);
}

static void _ensureDirectory(Configuration config) {
Expand Down Expand Up @@ -780,8 +780,8 @@ extension RealmInternal on Realm {
/// This should only be used for testing
RealmResults<T> allEmbedded<T extends EmbeddedObject>() {
final metadata = _metadata.getByType(T);
final handle = this.handle.findAll(metadata.classKey);
return RealmResultsInternal.create<T>(handle, this, metadata);
final resultsHandle = handle.findAll(metadata.classKey);
return RealmResultsInternal.create<T>(resultsHandle, this, metadata);
}

T? resolveObject<T extends RealmObjectBase>(T object) {
Expand All @@ -793,23 +793,23 @@ extension RealmInternal on Realm {
throw RealmStateError("Can't resolve invalidated (deleted) objects");
}

final handle = realmCore.resolveObject(object, this);
if (handle == null) {
final newHandle = object.handle.resolveIn(handle);
if (newHandle == null) {
return null;
}

final metadata = (object.accessor as RealmCoreAccessor).metadata;

return RealmObjectInternal.create(T, this, handle, RealmCoreAccessor(metadata, _isInMigration)) as T;
return RealmObjectInternal.create(T, this, newHandle, RealmCoreAccessor(metadata, _isInMigration)) as T;
}

RealmList<T>? resolveList<T extends Object?>(ManagedRealmList<T> list) {
final handle = realmCore.resolveList(list, this);
if (handle == null) {
final resultHandle = realmCore.resolveList(list, this);
if (resultHandle == null) {
return null;
}

return createList<T>(handle, list.metadata);
return createList<T>(resultHandle, list.metadata);
}

RealmResults<T> resolveResults<T extends Object?>(RealmResults<T> results) {
Expand Down
Loading

0 comments on commit bfd85df

Please sign in to comment.