Skip to content

Commit 7559acf

Browse files
author
Ivan Dlugos
committed
query.find() - large array support on 32-bit systems
1 parent 989cfd4 commit 7559acf

File tree

3 files changed

+40
-10
lines changed

3 files changed

+40
-10
lines changed

lib/src/bindings/signatures.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ typedef obx_box_is_empty_native_t = Int32 Function(Pointer<Void> box, Pointer<Ui
7979
// typedef Pointer<Int8> -> char[]
8080
// typedef Pointer<Int32> -> int (e.g. obx_qb_cond);
8181

82-
// query builider
82+
// query builder
8383
typedef obx_query_builder_native_t = Pointer<Void> Function(Pointer<Void> store, Uint32 entity_id);
8484
typedef obx_query_builder_dart_t = Pointer<Void> Function(Pointer<Void> store, int entity_id);
8585

@@ -150,10 +150,10 @@ typedef obx_query_count_dart_t = int Function(Pointer<Void> query, Pointer<Uint6
150150

151151
typedef obx_query_describe_t = Pointer<Utf8> Function(Pointer<Void> query);
152152

153-
typedef obx_query_visit_native_t = Int32 Function(
154-
Pointer<Void> query, Pointer<Void> visitor, Pointer<Void> user_data, Uint64 offset, Uint64 limit);
155-
typedef obx_query_visit_dart_t = int Function(
156-
Pointer<Void> query, Pointer<Void> visitor, Pointer<Void> user_data, int offset, int limit);
153+
typedef obx_query_visit_native_t = Int32 Function(Pointer<Void> query,
154+
Pointer<NativeFunction<obx_data_visitor_native_t>> visitor, Pointer<Void> user_data, Uint64 offset, Uint64 limit);
155+
typedef obx_query_visit_dart_t = int Function(Pointer<Void> query,
156+
Pointer<NativeFunction<obx_data_visitor_native_t>> visitor, Pointer<Void> user_data, int offset, int limit);
157157

158158
// Utilities
159159

lib/src/query/query.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import "../store.dart";
77
import "../common.dart";
88
import "../bindings/bindings.dart";
99
import "../bindings/constants.dart";
10+
import "../bindings/data_visitor.dart";
1011
import "../bindings/flatbuffers.dart";
1112
import "../bindings/helpers.dart";
1213
import "../bindings/structs.dart";
@@ -571,11 +572,25 @@ class Query<T> {
571572

572573
List<T> find({int offset = 0, int limit = 0}) {
573574
return _store.runInTransaction(TxMode.Read, () {
574-
final bytesArray = checkObxPtr(bindings.obx_query_find(_cQuery, offset, limit), "find");
575-
try {
576-
return _fbManager.unmarshalArray(bytesArray);
577-
} finally {
578-
bindings.obx_bytes_array_free(bytesArray);
575+
if (bindings.obx_supports_bytes_array() == 1) {
576+
final bytesArray = checkObxPtr(bindings.obx_query_find(_cQuery, offset, limit), "find");
577+
try {
578+
return _fbManager.unmarshalArray(bytesArray);
579+
} finally {
580+
bindings.obx_bytes_array_free(bytesArray);
581+
}
582+
} else {
583+
final results = <T>[];
584+
final visitor = DataVisitor((Pointer<Uint8> dataPtr, int length) {
585+
final bytes = dataPtr.asTypedList(length);
586+
results.add(_fbManager.unmarshal(bytes));
587+
return true;
588+
});
589+
590+
final err = bindings.obx_query_visit(_cQuery, visitor.fn, visitor.userData, offset, limit);
591+
visitor.close();
592+
checkObx(err);
593+
return results;
579594
}
580595
});
581596
}

test/query_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,21 @@ void main() {
204204
q.close();
205205
});
206206

207+
test(".find works on large arrays", () {
208+
// This would fail on 32-bit system if objectbox-c obx_supports_bytes_array() wasn't respected
209+
final length = 10 * 1000;
210+
final largeString = 'A' * length;
211+
expect(largeString.length, length);
212+
213+
box.put(TestEntity(tString: largeString));
214+
box.put(TestEntity(tString: largeString));
215+
216+
List<TestEntity> items = box.query(TestEntity_.id.greaterThan(0)).build().find();
217+
expect(items.length, 2);
218+
expect(items[0].tString, largeString);
219+
expect(items[1].tString, largeString);
220+
});
221+
207222
test(".count items after grouping with and/or", () {
208223
box.put(TestEntity(tString: "Hello"));
209224
box.put(TestEntity(tString: "Goodbye"));

0 commit comments

Comments
 (0)