From 30efd33c4204c76221469be5144c0acfd5b8f8d3 Mon Sep 17 00:00:00 2001 From: Korbi Date: Sun, 20 Oct 2019 21:28:59 +0200 Subject: [PATCH 1/2] implemented .count(), .isEmpty(), .removeAll(); ready for PR --- lib/src/bindings/bindings.dart | 10 ++++++++++ lib/src/bindings/signatures.dart | 3 +++ lib/src/box.dart | 24 ++++++++++++++++++++++++ test/box_test.dart | 12 ++++++++++++ 4 files changed, 49 insertions(+) diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index c1cbc5f9..ffda7c56 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -58,6 +58,11 @@ class _ObjectBoxBindings { int Function(Pointer box, int id, Pointer data, int size, int mode) obx_box_put; int Function(Pointer box, Pointer objects, Pointer ids, int mode) obx_box_put_many; int Function(Pointer box, int id) obx_box_remove; + int Function(Pointer box, Pointer removed) obx_box_remove_all; + + // box analytics + int Function(Pointer box, int limit, Pointer count) obx_box_count; + int Function(Pointer box, Pointer is_empty) obx_box_is_empty; // TODO return .asFunction() -> requires properly determined static return type Pointer> _fn(String name) { @@ -126,6 +131,11 @@ class _ObjectBoxBindings { obx_box_put = _fn("obx_box_put").asFunction(); obx_box_put_many = _fn("obx_box_put_many").asFunction(); obx_box_remove = _fn("obx_box_remove").asFunction(); + obx_box_remove_all = _fn("obx_box_remove_all").asFunction(); + + // box analytics + obx_box_count = _fn("obx_box_count").asFunction(); + obx_box_is_empty = _fn("obx_box_is_empty").asFunction(); } } diff --git a/lib/src/bindings/signatures.dart b/lib/src/bindings/signatures.dart index fba6f3ec..eb246568 100644 --- a/lib/src/bindings/signatures.dart +++ b/lib/src/bindings/signatures.dart @@ -55,3 +55,6 @@ typedef obx_box_put_native_t = Int32 Function(Pointer box, Uint64 id, Poin typedef obx_box_put_many_native_t = Int32 Function( Pointer box, Pointer objects, Pointer ids, Int32 mode); typedef obx_box_remove_native_t = Int32 Function(Pointer box, Uint64 id); +typedef obx_box_remove_all_native_t = Int32 Function(Pointer box, Pointer removed); +typedef obx_box_count_native_t = Int32 Function(Pointer box, Uint64 limit, Pointer _count); +typedef obx_box_is_empty_native_t = Int32 Function(Pointer box, Pointer is_empty); diff --git a/lib/src/box.dart b/lib/src/box.dart index dfd64024..3c12a135 100644 --- a/lib/src/box.dart +++ b/lib/src/box.dart @@ -166,5 +166,29 @@ class Box { return _getMany(() => checkObxPtr(bindings.obx_box_get_all(_cBox), "failed to get all objects from box", true)); } + // same as calling maxCount with limit := 0 + int count() { + return maxCount(limit: 0); + } + + int maxCount({int limit}) { + Pointer _count = Pointer.allocate(); + checkObx(bindings.obx_box_count(_cBox, limit, _count)); + return _count.load(); + } + + bool isEmpty() { + Pointer _isEmpty = Pointer.allocate(); + checkObx(bindings.obx_box_is_empty(_cBox, _isEmpty)); + return _isEmpty.load() > 0 ? true : false; + } + + int removeAll() { + Pointer _removedItems = Pointer.allocate(); + checkObx(bindings.obx_box_remove_all(_cBox, _removedItems)); + return _removedItems.load(); + } + get ptr => _cBox; + } diff --git a/test/box_test.dart b/test/box_test.dart index 424c402e..ccd0cffd 100644 --- a/test/box_test.dart +++ b/test/box_test.dart @@ -93,6 +93,18 @@ void main() { expect(fetchedItems[2].text, equals("Two")); }); + test(".count(), .isEmpty(), .removeAll() works", () { + final List items = ["One", "Two"].map((s) => TestEntity.construct(s)).toList(); + final List ids = box.putMany(items); + + int count = box.count(); + expect(count, greaterThanOrEqualTo(0)); + bool isEmpty = box.isEmpty(); + expect(isEmpty, equals(false)); + int removed = box.removeAll(); + expect(removed, greaterThan(0)); + }); + tearDown(() { if (store != null) store.close(); store = null; From 7758a143fbba16e8681620f230ffeb0e848307b8 Mon Sep 17 00:00:00 2001 From: Korbi Date: Mon, 21 Oct 2019 16:02:57 +0200 Subject: [PATCH 2/2] added .remove(), .removeMany() methods and seperate unit tests --- lib/src/bindings/bindings.dart | 2 ++ lib/src/bindings/signatures.dart | 1 + lib/src/box.dart | 53 ++++++++++++++++++++++++-------- lib/src/common.dart | 5 +-- test/box_test.dart | 53 ++++++++++++++++++++++++++++---- 5 files changed, 94 insertions(+), 20 deletions(-) diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index ffda7c56..06a4f117 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -59,6 +59,7 @@ class _ObjectBoxBindings { int Function(Pointer box, Pointer objects, Pointer ids, int mode) obx_box_put_many; int Function(Pointer box, int id) obx_box_remove; int Function(Pointer box, Pointer removed) obx_box_remove_all; + int Function(Pointer box, Pointer ids, Pointer removed) obx_box_remove_many; // box analytics int Function(Pointer box, int limit, Pointer count) obx_box_count; @@ -132,6 +133,7 @@ class _ObjectBoxBindings { obx_box_put_many = _fn("obx_box_put_many").asFunction(); obx_box_remove = _fn("obx_box_remove").asFunction(); obx_box_remove_all = _fn("obx_box_remove_all").asFunction(); + obx_box_remove_many = _fn("obx_box_remove_many").asFunction(); // box analytics obx_box_count = _fn("obx_box_count").asFunction(); diff --git a/lib/src/bindings/signatures.dart b/lib/src/bindings/signatures.dart index eb246568..962b5709 100644 --- a/lib/src/bindings/signatures.dart +++ b/lib/src/bindings/signatures.dart @@ -56,5 +56,6 @@ typedef obx_box_put_many_native_t = Int32 Function( Pointer box, Pointer objects, Pointer ids, Int32 mode); typedef obx_box_remove_native_t = Int32 Function(Pointer box, Uint64 id); typedef obx_box_remove_all_native_t = Int32 Function(Pointer box, Pointer removed); +typedef obx_box_remove_many_native_t = Int32 Function(Pointer box, Pointer ids, Pointer removed); typedef obx_box_count_native_t = Int32 Function(Pointer box, Uint64 limit, Pointer _count); typedef obx_box_is_empty_native_t = Int32 Function(Pointer box, Pointer is_empty); diff --git a/lib/src/box.dart b/lib/src/box.dart index 3c12a135..a0ce989c 100644 --- a/lib/src/box.dart +++ b/lib/src/box.dart @@ -1,5 +1,7 @@ import "dart:ffi"; +import 'package:objectbox/src/common.dart'; + import "store.dart"; import "bindings/bindings.dart"; import "bindings/constants.dart"; @@ -166,27 +168,54 @@ class Box { return _getMany(() => checkObxPtr(bindings.obx_box_get_all(_cBox), "failed to get all objects from box", true)); } - // same as calling maxCount with limit := 0 - int count() { - return maxCount(limit: 0); - } - - int maxCount({int limit}) { + int count({int limit: 0}) { Pointer _count = Pointer.allocate(); - checkObx(bindings.obx_box_count(_cBox, limit, _count)); - return _count.load(); + try { + checkObx(bindings.obx_box_count(_cBox, limit, _count)); + return _count.load(); + } finally { + _count.free(); + } } bool isEmpty() { Pointer _isEmpty = Pointer.allocate(); - checkObx(bindings.obx_box_is_empty(_cBox, _isEmpty)); - return _isEmpty.load() > 0 ? true : false; + try { + checkObx(bindings.obx_box_is_empty(_cBox, _isEmpty)); + return _isEmpty.load() > 0 ? true : false; + } finally { + _isEmpty.free(); + } + } + + bool remove(int id) { + try { + checkObx(bindings.obx_box_remove(_cBox, id)); + } on ObjectBoxException catch (ex) { + if (ex.raw_msg == "code 404") return false; + else throw(ex); + } + return true; + } + + int removeMany(List ids) { + Pointer _removedIds = Pointer.allocate(); + try { + checkObx(bindings.obx_box_remove_many(_cBox, IDArray(ids).ptr, _removedIds)); + return _removedIds.load(); + } finally { + _removedIds.free(); + } } int removeAll() { Pointer _removedItems = Pointer.allocate(); - checkObx(bindings.obx_box_remove_all(_cBox, _removedItems)); - return _removedItems.load(); + try { + checkObx(bindings.obx_box_remove_all(_cBox, _removedItems)); + return _removedItems.load(); + } finally { + _removedItems.free(); + } } get ptr => _cBox; diff --git a/lib/src/common.dart b/lib/src/common.dart index 45e54b00..3da811ba 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -27,10 +27,11 @@ Version versionLib() { } } -class ObjectBoxException { +class ObjectBoxException implements Exception { final String message; + final String raw_msg; - ObjectBoxException(msg) : message = "ObjectBoxException: " + msg; + ObjectBoxException(msg) : message = "ObjectBoxException: " + msg, raw_msg = msg; String toString() => message; } diff --git a/test/box_test.dart b/test/box_test.dart index ccd0cffd..c66a9154 100644 --- a/test/box_test.dart +++ b/test/box_test.dart @@ -19,6 +19,8 @@ void main() { Store store; Box box; + final List simple_items = ["One", "Two", "Three", "Four", "Five", "Six"].map((s) => TestEntity.construct(s)).toList(); + group("box", () { setUp(() { store = Store([TestEntity_OBXDefs]); @@ -93,16 +95,55 @@ void main() { expect(fetchedItems[2].text, equals("Two")); }); - test(".count(), .isEmpty(), .removeAll() works", () { - final List items = ["One", "Two"].map((s) => TestEntity.construct(s)).toList(); - final List ids = box.putMany(items); - + test(".count() works", () { + List ids = box.putMany(simple_items); int count = box.count(); - expect(count, greaterThanOrEqualTo(0)); + expect(count, equals(6)); + //add more + ids.addAll(box.putMany(simple_items)); + count = box.count(); + expect(count, equals(12)); + }); + + test(".isEmpty() works", () { bool isEmpty = box.isEmpty(); + expect(isEmpty, equals(true)); + //check complementary + final List ids = box.putMany(simple_items); + isEmpty = box.isEmpty(); expect(isEmpty, equals(false)); + }); + + test(".remove(id) works", () { + final List ids = box.putMany(simple_items); + //check if single id remove works + box.remove(ids[1]); + expect(box.count(), equals(5)); + //check what happens if id already deleted -> throws OBJBOXEX 404 + bool success = box.remove(ids[1]); + expect(box.count(), equals(5)); + expect(success, equals(false)); + }); + + test(".removeMany(ids) works", () { + final List ids = box.putMany(simple_items); + expect(box.count(), equals(6)); + box.removeMany(ids.sublist(4)); + expect(box.count(), equals(4)); + //again test what happens if ids already deleted + box.removeMany(ids.sublist(4)); + expect(box.count(), equals(4)); + }); + + test(".removeAll() works", () { + List ids = box.putMany(simple_items); int removed = box.removeAll(); - expect(removed, greaterThan(0)); + expect(removed, equals(6)); + //try with different number of items + List items = ["one", "two", "three"].map((s) => TestEntity.construct(s)).toList(); + ids.addAll(box.putMany(items)); + removed = box.removeAll(); + expect(removed, equals(3)); }); tearDown(() {