Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions bindings/dart/lib/src/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,138 @@ class Database {
}
}

/// Reads all int vectors for a vector attribute from a collection.
List<List<int>> readVectorInts(String collection, String attribute) {
_ensureNotClosed();

final arena = Arena();
try {
final outVectors = arena<Pointer<Pointer<Int64>>>();
final outSizes = arena<Pointer<Size>>();
final outCount = arena<Size>();

final err = bindings.psr_database_read_vector_ints(
_ptr,
collection.toNativeUtf8(allocator: arena).cast(),
attribute.toNativeUtf8(allocator: arena).cast(),
outVectors,
outSizes,
outCount,
);

if (err != psr_error_t.PSR_OK) {
throw DatabaseException.fromError(err, "Failed to read vector ints from '$collection.$attribute'");
}

final count = outCount.value;
if (count == 0 || outVectors.value == nullptr) {
return [];
}

final result = <List<int>>[];
for (var i = 0; i < count; i++) {
final size = outSizes.value[i];
if (size == 0 || outVectors.value[i] == nullptr) {
result.add([]);
} else {
result.add(List<int>.generate(size, (j) => outVectors.value[i][j]));
}
}
bindings.psr_free_int_vectors(outVectors.value, outSizes.value, count);
return result;
} finally {
arena.releaseAll();
}
}

/// Reads all double vectors for a vector attribute from a collection.
List<List<double>> readVectorDoubles(String collection, String attribute) {
_ensureNotClosed();

final arena = Arena();
try {
final outVectors = arena<Pointer<Pointer<Double>>>();
final outSizes = arena<Pointer<Size>>();
final outCount = arena<Size>();

final err = bindings.psr_database_read_vector_doubles(
_ptr,
collection.toNativeUtf8(allocator: arena).cast(),
attribute.toNativeUtf8(allocator: arena).cast(),
outVectors,
outSizes,
outCount,
);

if (err != psr_error_t.PSR_OK) {
throw DatabaseException.fromError(err, "Failed to read vector doubles from '$collection.$attribute'");
}

final count = outCount.value;
if (count == 0 || outVectors.value == nullptr) {
return [];
}

final result = <List<double>>[];
for (var i = 0; i < count; i++) {
final size = outSizes.value[i];
if (size == 0 || outVectors.value[i] == nullptr) {
result.add([]);
} else {
result.add(List<double>.generate(size, (j) => outVectors.value[i][j]));
}
}
bindings.psr_free_double_vectors(outVectors.value, outSizes.value, count);
return result;
} finally {
arena.releaseAll();
}
}

/// Reads all string vectors for a vector attribute from a collection.
List<List<String>> readVectorStrings(String collection, String attribute) {
_ensureNotClosed();

final arena = Arena();
try {
final outVectors = arena<Pointer<Pointer<Pointer<Char>>>>();
final outSizes = arena<Pointer<Size>>();
final outCount = arena<Size>();

final err = bindings.psr_database_read_vector_strings(
_ptr,
collection.toNativeUtf8(allocator: arena).cast(),
attribute.toNativeUtf8(allocator: arena).cast(),
outVectors,
outSizes,
outCount,
);

if (err != psr_error_t.PSR_OK) {
throw DatabaseException.fromError(err, "Failed to read vector strings from '$collection.$attribute'");
}

final count = outCount.value;
if (count == 0 || outVectors.value == nullptr) {
return [];
}

final result = <List<String>>[];
for (var i = 0; i < count; i++) {
final size = outSizes.value[i];
if (size == 0 || outVectors.value[i] == nullptr) {
result.add([]);
} else {
result.add(List<String>.generate(size, (j) => outVectors.value[i][j].cast<Utf8>().toDartString()));
}
}
bindings.psr_free_string_vectors(outVectors.value, outSizes.value, count);
return result;
} finally {
arena.releaseAll();
}
}

/// Closes the database and frees native resources.
void close() {
if (_isClosed) return;
Expand Down
171 changes: 171 additions & 0 deletions bindings/dart/lib/src/ffi/bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,117 @@ class PsrDatabaseBindings {
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>,
ffi.Pointer<ffi.Size>)>();

int psr_database_read_vector_ints(
ffi.Pointer<psr_database_t> db,
ffi.Pointer<ffi.Char> collection,
ffi.Pointer<ffi.Char> attribute,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int64>>> out_vectors,
ffi.Pointer<ffi.Pointer<ffi.Size>> out_sizes,
ffi.Pointer<ffi.Size> out_count,
) {
return _psr_database_read_vector_ints(
db,
collection,
attribute,
out_vectors,
out_sizes,
out_count,
);
}

late final _psr_database_read_vector_intsPtr = _lookup<
ffi.NativeFunction<
ffi.Int32 Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int64>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>>('psr_database_read_vector_ints');
late final _psr_database_read_vector_ints =
_psr_database_read_vector_intsPtr.asFunction<
int Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int64>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>();

int psr_database_read_vector_doubles(
ffi.Pointer<psr_database_t> db,
ffi.Pointer<ffi.Char> collection,
ffi.Pointer<ffi.Char> attribute,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Double>>> out_vectors,
ffi.Pointer<ffi.Pointer<ffi.Size>> out_sizes,
ffi.Pointer<ffi.Size> out_count,
) {
return _psr_database_read_vector_doubles(
db,
collection,
attribute,
out_vectors,
out_sizes,
out_count,
);
}

late final _psr_database_read_vector_doublesPtr = _lookup<
ffi.NativeFunction<
ffi.Int32 Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Double>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>>('psr_database_read_vector_doubles');
late final _psr_database_read_vector_doubles =
_psr_database_read_vector_doublesPtr.asFunction<
int Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Double>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>();

int psr_database_read_vector_strings(
ffi.Pointer<psr_database_t> db,
ffi.Pointer<ffi.Char> collection,
ffi.Pointer<ffi.Char> attribute,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>> out_vectors,
ffi.Pointer<ffi.Pointer<ffi.Size>> out_sizes,
ffi.Pointer<ffi.Size> out_count,
) {
return _psr_database_read_vector_strings(
db,
collection,
attribute,
out_vectors,
out_sizes,
out_count,
);
}

late final _psr_database_read_vector_stringsPtr = _lookup<
ffi.NativeFunction<
ffi.Int32 Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>>('psr_database_read_vector_strings');
late final _psr_database_read_vector_strings =
_psr_database_read_vector_stringsPtr.asFunction<
int Function(
ffi.Pointer<psr_database_t>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>>,
ffi.Pointer<ffi.Pointer<ffi.Size>>,
ffi.Pointer<ffi.Size>)>();

void psr_free_int_array(
ffi.Pointer<ffi.Int64> values,
) {
Expand Down Expand Up @@ -418,6 +529,66 @@ class PsrDatabaseBindings {
late final _psr_free_string_array = _psr_free_string_arrayPtr
.asFunction<void Function(ffi.Pointer<ffi.Pointer<ffi.Char>>, int)>();

void psr_free_int_vectors(
ffi.Pointer<ffi.Pointer<ffi.Int64>> vectors,
ffi.Pointer<ffi.Size> sizes,
int count,
) {
return _psr_free_int_vectors(
vectors,
sizes,
count,
);
}

late final _psr_free_int_vectorsPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Pointer<ffi.Pointer<ffi.Int64>>,
ffi.Pointer<ffi.Size>, ffi.Size)>>('psr_free_int_vectors');
late final _psr_free_int_vectors = _psr_free_int_vectorsPtr.asFunction<
void Function(
ffi.Pointer<ffi.Pointer<ffi.Int64>>, ffi.Pointer<ffi.Size>, int)>();

void psr_free_double_vectors(
ffi.Pointer<ffi.Pointer<ffi.Double>> vectors,
ffi.Pointer<ffi.Size> sizes,
int count,
) {
return _psr_free_double_vectors(
vectors,
sizes,
count,
);
}

late final _psr_free_double_vectorsPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Pointer<ffi.Pointer<ffi.Double>>,
ffi.Pointer<ffi.Size>, ffi.Size)>>('psr_free_double_vectors');
late final _psr_free_double_vectors = _psr_free_double_vectorsPtr.asFunction<
void Function(
ffi.Pointer<ffi.Pointer<ffi.Double>>, ffi.Pointer<ffi.Size>, int)>();

void psr_free_string_vectors(
ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>> vectors,
ffi.Pointer<ffi.Size> sizes,
int count,
) {
return _psr_free_string_vectors(
vectors,
sizes,
count,
);
}

late final _psr_free_string_vectorsPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>,
ffi.Pointer<ffi.Size>, ffi.Size)>>('psr_free_string_vectors');
late final _psr_free_string_vectors = _psr_free_string_vectorsPtr.asFunction<
void Function(ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Char>>>,
ffi.Pointer<ffi.Size>, int)>();

ffi.Pointer<psr_element_t1> psr_element_create() {
return _psr_element_create();
}
Expand Down
Loading
Loading