Skip to content

Commit 4ace62d

Browse files
committed
Experiments
1 parent 17e92c2 commit 4ace62d

File tree

24 files changed

+840
-26
lines changed

24 files changed

+840
-26
lines changed

packages/cinterop/src/commonMain/kotlin/io/realm/kotlin/internal/interop/RealmInterop.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ expect object RealmInterop {
200200
fun realm_config_set_automatic_backlink_handling(config: RealmConfigurationPointer, enabled: Boolean)
201201
fun realm_config_set_data_initialization_function(config: RealmConfigurationPointer, callback: DataInitializationCallback)
202202
fun realm_config_set_in_memory(config: RealmConfigurationPointer, inMemory: Boolean)
203+
fun realm_config_set_relaxed_schema(config: RealmConfigurationPointer, relaxedSchema: Boolean)
203204
fun realm_schema_validate(schema: RealmSchemaPointer, mode: SchemaValidationMode): Boolean
204205

205206
fun realm_create_scheduler(): RealmSchedulerPointer
@@ -299,12 +300,21 @@ expect object RealmInterop {
299300
fun realm_get_col_key(realm: RealmPointer, classKey: ClassKey, col: String): PropertyKey
300301

301302
fun MemAllocator.realm_get_value(obj: RealmObjectPointer, key: PropertyKey): RealmValue
303+
fun MemAllocator.realm_get_value_by_name(obj: RealmObjectPointer, name: String): RealmValue
302304
fun realm_set_value(
303305
obj: RealmObjectPointer,
304306
key: PropertyKey,
305307
value: RealmValue,
306308
isDefault: Boolean
307309
)
310+
fun realm_set_value_by_name(
311+
obj: RealmObjectPointer,
312+
name: String,
313+
value: RealmValue,
314+
)
315+
fun realm_has_property(obj: RealmObjectPointer, name: String): Boolean
316+
fun realm_get_additional_properties(obj: RealmObjectPointer): List<String>
317+
fun realm_erase_property(obj: RealmObjectPointer, key: String): Boolean
308318
fun realm_set_embedded(obj: RealmObjectPointer, key: PropertyKey): RealmObjectPointer
309319
fun realm_set_list(obj: RealmObjectPointer, key: PropertyKey): RealmListPointer
310320
fun realm_set_dictionary(obj: RealmObjectPointer, key: PropertyKey): RealmMapPointer

packages/cinterop/src/jvm/kotlin/io/realm/kotlin/internal/interop/RealmInterop.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ actual object RealmInterop {
216216
realmc.realm_config_set_in_memory(config.cptr(), inMemory)
217217
}
218218

219+
actual fun realm_config_set_relaxed_schema(config: RealmConfigurationPointer, relaxedSchema: Boolean) {
220+
realmc.realm_config_set_flexible_schema(config.cptr(), relaxedSchema)
221+
}
222+
219223
actual fun realm_create_scheduler(): RealmSchedulerPointer =
220224
LongPointerWrapper(realmc.realm_create_generic_scheduler())
221225

@@ -489,6 +493,15 @@ actual object RealmInterop {
489493
return RealmValue(struct)
490494
}
491495

496+
actual fun MemAllocator.realm_get_value_by_name(
497+
obj: RealmObjectPointer,
498+
name: String,
499+
): RealmValue {
500+
val struct = allocRealmValueT()
501+
realmc.realm_get_value_by_name((obj as LongPointerWrapper).ptr, name, struct)
502+
return RealmValue(struct)
503+
}
504+
492505
actual fun realm_set_value(
493506
obj: RealmObjectPointer,
494507
key: PropertyKey,
@@ -498,6 +511,29 @@ actual object RealmInterop {
498511
realmc.realm_set_value(obj.cptr(), key.key, value.value, isDefault)
499512
}
500513

514+
actual fun realm_set_value_by_name(
515+
obj: RealmObjectPointer,
516+
name: String,
517+
value: RealmValue,
518+
) {
519+
realmc.realm_set_value_by_name(obj.cptr(), name, value.value)
520+
}
521+
522+
actual fun realm_has_property(obj: RealmObjectPointer, name: String): Boolean {
523+
val found = BooleanArray(1)
524+
realmc.realm_has_property(obj.cptr(), name, found)
525+
return found[0]
526+
}
527+
528+
actual fun realm_get_additional_properties(obj: RealmObjectPointer): List<String> {
529+
@Suppress("UNCHECKED_CAST")
530+
val properties = realmc.realm_get_additional_properties_helper(obj.cptr()) as Array<String>
531+
return properties.asList()
532+
}
533+
actual fun realm_erase_property(obj: RealmObjectPointer, key: String): Boolean {
534+
return realmc.realm_erase_property(obj.cptr(), key)
535+
}
536+
501537
actual fun realm_set_embedded(obj: RealmObjectPointer, key: PropertyKey): RealmObjectPointer {
502538
return LongPointerWrapper(realmc.realm_set_embedded(obj.cptr(), key.key))
503539
}

packages/external/core

Submodule core updated 241 files

packages/jni-swig-stub/realm.i

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ import static io.realm.kotlin.internal.interop.realm_errno_e.*;
377377
bool* erased, bool* out_erased, bool* did_refresh, bool* did_run,
378378
bool* found, bool* out_collection_was_cleared, bool* did_compact,
379379
bool* collection_was_cleared, bool* out_collection_was_deleted,
380-
bool* out_was_deleted};
380+
bool* out_was_deleted, bool* out_has_property };
381381

382382
// uint64_t output parameter for realm_get_num_versions
383383
%apply int64_t* OUTPUT { uint64_t* out_versions_count };

packages/jni-swig-stub/src/main/jni/realm_api_helpers.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,3 +1403,25 @@ jobjectArray realm_get_log_category_names() {
14031403

14041404
return array;
14051405
}
1406+
1407+
jobjectArray realm_get_additional_properties_helper(realm_object_t* obj) {
1408+
JNIEnv* env = get_env(true);
1409+
1410+
size_t count = 0;
1411+
realm_get_additional_properties(obj, nullptr, 0xffffff, &count);
1412+
1413+
const char** properties = new const char*[count];
1414+
realm_get_additional_properties(obj, properties, count, &count);
1415+
// FIXME Guard count != count
1416+
1417+
auto array = env->NewObjectArray(count, JavaClassGlobalDef::java_lang_string(), nullptr);
1418+
1419+
for(size_t i = 0; i < count; i++) {
1420+
jstring string = env->NewStringUTF(properties[i]);
1421+
env->SetObjectArrayElement(array, i, string);
1422+
}
1423+
1424+
delete[] properties;
1425+
1426+
return array;
1427+
}

packages/jni-swig-stub/src/main/jni/realm_api_helpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,6 @@ bool realm_sync_websocket_message(int64_t observer_ptr, jbyteArray data, size_t
162162
void realm_sync_websocket_closed(int64_t observer_ptr, bool was_clean, int error_code, const char* reason);
163163

164164
jobjectArray realm_get_log_category_names();
165+
jobjectArray realm_get_additional_properties_helper(realm_object_t* obj);
165166

166167
#endif //TEST_REALM_API_HELPERS_H

packages/library-base/src/commonMain/kotlin/io/realm/kotlin/BaseRealm.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public interface BaseRealm : Versioned {
3131
* @return the schema of the realm.
3232
*/
3333
public fun schema(): RealmSchema
34+
// public fun schema(fullSchema: Boolean = false): RealmSchema
3435

3536
/**
3637
* Returns the schema version of the realm.

packages/library-base/src/commonMain/kotlin/io/realm/kotlin/Configuration.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ public interface Configuration {
170170
*/
171171
public val initialRealmFileConfiguration: InitialRealmFileConfiguration?
172172

173+
// FIXME DOCS
174+
public val relaxedSchema: Boolean
175+
173176
/**
174177
* Base class for configuration builders that holds properties available to both
175178
* [RealmConfiguration] and [SyncConfiguration].
@@ -209,6 +212,7 @@ public interface Configuration {
209212
protected var initialDataCallback: InitialDataCallback? = null
210213
protected var inMemory: Boolean = false
211214
protected var initialRealmFileConfiguration: InitialRealmFileConfiguration? = null
215+
protected var relaxedSchema: Boolean = false
212216

213217
/**
214218
* Sets the filename of the realm file.
@@ -399,6 +403,12 @@ public interface Configuration {
399403
return this as S
400404
}
401405

406+
// FIXME Docs
407+
public fun relaxedSchema(relaxedSchema: Boolean): S {
408+
this.relaxedSchema = relaxedSchema
409+
return this as S
410+
}
411+
402412
protected fun validateEncryptionKey(encryptionKey: ByteArray): ByteArray {
403413
if (encryptionKey.size != Realm.ENCRYPTION_KEY_LENGTH) {
404414
throw IllegalArgumentException("The provided key must be ${Realm.ENCRYPTION_KEY_LENGTH} bytes. The provided key was ${encryptionKey.size} bytes.")

packages/library-base/src/commonMain/kotlin/io/realm/kotlin/RealmConfiguration.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ public interface RealmConfiguration : Configuration {
181181
initialDataCallback,
182182
inMemory,
183183
initialRealmFileConfiguration,
184+
relaxedSchema,
184185
realmLogger
185186
)
186187
}

packages/library-base/src/commonMain/kotlin/io/realm/kotlin/internal/ConfigurationImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public open class ConfigurationImpl(
6565
override val isFlexibleSyncConfiguration: Boolean,
6666
inMemory: Boolean,
6767
initialRealmFileConfiguration: InitialRealmFileConfiguration?,
68+
relaxedSchema: Boolean,
6869
override val logger: ContextLogger
6970
) : InternalConfiguration {
7071

@@ -96,6 +97,7 @@ public open class ConfigurationImpl(
9697
final override val initialDataCallback: InitialDataCallback?
9798
final override val inMemory: Boolean
9899
final override val initialRealmFileConfiguration: InitialRealmFileConfiguration?
100+
final override val relaxedSchema: Boolean
99101

100102
override fun createNativeConfiguration(): RealmConfigurationPointer {
101103
val nativeConfig: RealmConfigurationPointer = RealmInterop.realm_config_new()
@@ -141,6 +143,7 @@ public open class ConfigurationImpl(
141143
this.initialDataCallback = initialDataCallback
142144
this.inMemory = inMemory
143145
this.initialRealmFileConfiguration = initialRealmFileConfiguration
146+
this.relaxedSchema = relaxedSchema
144147

145148
// We need to freeze `compactOnLaunchCallback` reference on initial thread for Kotlin Native
146149
val compactCallback = compactOnLaunchCallback?.let { callback ->
@@ -225,6 +228,8 @@ public open class ConfigurationImpl(
225228

226229
RealmInterop.realm_config_set_in_memory(nativeConfig, inMemory)
227230

231+
RealmInterop.realm_config_set_relaxed_schema(nativeConfig, relaxedSchema)
232+
228233
nativeConfig
229234
}
230235

packages/library-base/src/commonMain/kotlin/io/realm/kotlin/internal/RealmConfigurationImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ internal class RealmConfigurationImpl(
4545
initialDataCallback: InitialDataCallback?,
4646
inMemory: Boolean,
4747
initialRealmFileConfiguration: InitialRealmFileConfiguration?,
48+
relaxedSchema: Boolean,
4849
logger: ContextLogger
4950
) : ConfigurationImpl(
5051
directory,
@@ -66,6 +67,7 @@ internal class RealmConfigurationImpl(
6667
false,
6768
inMemory,
6869
initialRealmFileConfiguration,
70+
relaxedSchema,
6971
logger
7072
),
7173
RealmConfiguration

0 commit comments

Comments
 (0)