From 70b601fd8b11fad040f300cf4932877df613c1a5 Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Wed, 17 Sep 2025 17:57:30 +0300 Subject: [PATCH 1/8] Regenerate bindings for 2.29. --- sources/TileDB.CSharp/Interop/Methods.cs | 13 +++++++++++++ .../TileDB.CSharp/Interop/tiledb_array_type_t.cs | 4 ---- sources/TileDB.CSharp/Interop/tiledb_datatype_t.cs | 4 ---- .../TileDB.CSharp/Interop/tiledb_filter_type_t.cs | 5 +---- .../TileDB.CSharp/Interop/tiledb_query_type_t.cs | 4 ---- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/sources/TileDB.CSharp/Interop/Methods.cs b/sources/TileDB.CSharp/Interop/Methods.cs index 6e79a0f0..f787e412 100644 --- a/sources/TileDB.CSharp/Interop/Methods.cs +++ b/sources/TileDB.CSharp/Interop/Methods.cs @@ -1492,6 +1492,10 @@ public static int tiledb_status([NativeTypeName("capi_return_t")] int x) [return: NativeTypeName("capi_return_t")] public static extern int tiledb_ndrectangle_get_dim_num(tiledb_ctx_t* ctx, [NativeTypeName("tiledb_ndrectangle_t *")] tiledb_ndrectangle_handle_t* ndr, [NativeTypeName("uint32_t *")] uint* ndim); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + [return: NativeTypeName("capi_return_t")] + public static extern int tiledb_ndrectangle_dump_str(tiledb_ctx_t* ctx, [NativeTypeName("tiledb_ndrectangle_t *")] tiledb_ndrectangle_handle_t* ndr, tiledb_string_t** @out); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] [return: NativeTypeName("capi_return_t")] public static extern int tiledb_current_domain_create(tiledb_ctx_t* ctx, [NativeTypeName("tiledb_current_domain_t **")] tiledb_current_domain_handle_t** current_domain); @@ -1516,6 +1520,10 @@ public static int tiledb_status([NativeTypeName("capi_return_t")] int x) [return: NativeTypeName("capi_return_t")] public static extern int tiledb_current_domain_get_type(tiledb_ctx_t* ctx, [NativeTypeName("tiledb_current_domain_t *")] tiledb_current_domain_handle_t* current_domain, tiledb_current_domain_type_t* type); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + [return: NativeTypeName("capi_return_t")] + public static extern int tiledb_current_domain_dump_str(tiledb_ctx_t* ctx, [NativeTypeName("tiledb_current_domain_t *")] tiledb_current_domain_handle_t* current_domain, tiledb_string_t** @out); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] [return: NativeTypeName("capi_return_t")] public static extern int tiledb_array_schema_alloc_at_timestamp(tiledb_ctx_t* ctx, tiledb_array_type_t array_type, [NativeTypeName("uint64_t")] ulong timestamp, tiledb_array_schema_t** array_schema); @@ -1646,8 +1654,13 @@ public static int tiledb_status([NativeTypeName("capi_return_t")] int x) [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] [return: NativeTypeName("capi_return_t")] + [Obsolete] public static extern int tiledb_vfs_ls_recursive(tiledb_ctx_t* ctx, tiledb_vfs_t* vfs, [NativeTypeName("const char *")] sbyte* path, [NativeTypeName("tiledb_ls_callback_t")] delegate* unmanaged[Cdecl] callback, void* data); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] + [return: NativeTypeName("capi_return_t")] + public static extern int tiledb_vfs_ls_recursive_v2(tiledb_ctx_t* ctx, tiledb_vfs_t* vfs, [NativeTypeName("const char *")] sbyte* path, [NativeTypeName("tiledb_ls_callback_v2_t")] delegate* unmanaged[Cdecl] callback, void* data); + [DllImport("tiledb", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] public static extern void tiledb_dimension_label_free(tiledb_dimension_label_t** dim_label); diff --git a/sources/TileDB.CSharp/Interop/tiledb_array_type_t.cs b/sources/TileDB.CSharp/Interop/tiledb_array_type_t.cs index d2de8ccf..76531f36 100644 --- a/sources/TileDB.CSharp/Interop/tiledb_array_type_t.cs +++ b/sources/TileDB.CSharp/Interop/tiledb_array_type_t.cs @@ -1,9 +1,5 @@ // -using System; -using System.ComponentModel; -using TileDB.CSharp; - namespace TileDB.Interop { internal enum tiledb_array_type_t diff --git a/sources/TileDB.CSharp/Interop/tiledb_datatype_t.cs b/sources/TileDB.CSharp/Interop/tiledb_datatype_t.cs index 458e7068..9c5fb8c9 100644 --- a/sources/TileDB.CSharp/Interop/tiledb_datatype_t.cs +++ b/sources/TileDB.CSharp/Interop/tiledb_datatype_t.cs @@ -1,9 +1,5 @@ // -using System; -using System.ComponentModel; -using TileDB.CSharp; - namespace TileDB.Interop { internal enum tiledb_datatype_t diff --git a/sources/TileDB.CSharp/Interop/tiledb_filter_type_t.cs b/sources/TileDB.CSharp/Interop/tiledb_filter_type_t.cs index dd967012..17653eb7 100644 --- a/sources/TileDB.CSharp/Interop/tiledb_filter_type_t.cs +++ b/sources/TileDB.CSharp/Interop/tiledb_filter_type_t.cs @@ -1,9 +1,5 @@ // -using System; -using System.ComponentModel; -using TileDB.CSharp; - namespace TileDB.Interop { internal enum tiledb_filter_type_t @@ -27,5 +23,6 @@ internal enum tiledb_filter_type_t TILEDB_FILTER_DEPRECATED = 17, TILEDB_FILTER_WEBP = 18, TILEDB_FILTER_DELTA = 19, + TILEDB_INTERNAL_FILTER_COUNT = 20, } } diff --git a/sources/TileDB.CSharp/Interop/tiledb_query_type_t.cs b/sources/TileDB.CSharp/Interop/tiledb_query_type_t.cs index d49f36f1..21fa4db6 100644 --- a/sources/TileDB.CSharp/Interop/tiledb_query_type_t.cs +++ b/sources/TileDB.CSharp/Interop/tiledb_query_type_t.cs @@ -1,9 +1,5 @@ // -using System; -using System.ComponentModel; -using TileDB.CSharp; - namespace TileDB.Interop { internal enum tiledb_query_type_t From db5b6d97842000ab197ededb044d5d42c0835792 Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Wed, 17 Sep 2025 18:23:44 +0300 Subject: [PATCH 2/8] Add new APIs. --- sources/TileDB.CSharp/VFS.cs | 39 ++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/sources/TileDB.CSharp/VFS.cs b/sources/TileDB.CSharp/VFS.cs index 40ac7477..ac9406ee 100644 --- a/sources/TileDB.CSharp/VFS.cs +++ b/sources/TileDB.CSharp/VFS.cs @@ -33,9 +33,7 @@ public VFS(Context ctx) : this(ctx, null) { } /// /// The context to associate the VFS with. Defaults to /// The ' . Defaults to 's config. -#pragma warning disable S3427 // Method overloads with default parameter values should not overlap public VFS(Context? ctx = null, Config? config = null) -#pragma warning restore S3427 // Method overloads with default parameter values should not overlap { ctx_ = ctx ?? Context.GetDefault(); handle_ = VFSHandle.Create(ctx_, config?.Handle); @@ -334,7 +332,7 @@ private static int VisitCallback(sbyte* uriPtr, void* data) } [UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)])] - private static int VisitRecursiveCallback(sbyte* uriPtr, nuint uriSize, ulong size, void* data) + private static int VisitRecursiveCallback(sbyte* uriPtr, nuint uriSize, ulong size, byte is_dir, void* data) { string uri = MarshaledStringOut.GetStringFromNullTerminated(uriPtr); VisitRecursiveCallbackData* callbackData = (VisitRecursiveCallbackData*)data; @@ -342,7 +340,7 @@ private static int VisitRecursiveCallback(sbyte* uriPtr, nuint uriSize, ulong si bool shouldContinue; try { - shouldContinue = callbackData->Invoke(uri, size); + shouldContinue = callbackData->Invoke(uri, size, is_dir != 0); } catch (Exception e) { @@ -441,13 +439,32 @@ public void VisitChildren(string uri, Func callback, T callb /// public void VisitChildrenRecursive(string uri, Func callback, T callbackArg) { - ValueTuple, T> data = (callback, callbackArg); + VisitChildrenRecursive<(Func, T)>(uri, + static (uri, size, _, state) => state.Item1(uri, size, state.Item2), + (callback, callbackArg)); + } + + /// + /// Visits all files and subdirectories of a directory and its subdirectories recursively. + /// + /// The URI of the directory to visit. + /// A callback delegate that will be called with the URI of each file, + /// its size, whether it is a directory and , and returns whether + /// to continue visiting. + /// An argument that will be passed to . + /// The type of . + /// + /// This operation is supported only on URIs to local file system, S3, Azure and GCS. + /// + public void VisitChildrenRecursive(string uri, Func callback, T callbackArg) + { + ValueTuple, T> data = (callback, callbackArg); var callbackData = new VisitRecursiveCallbackData() { - Callback = static (uri, size, arg) => + Callback = static (uri, size, is_dir, arg) => { - var dataPtr = (ValueTuple, T>*)arg; - return dataPtr->Item1(uri, size, dataPtr->Item2); + var dataPtr = (ValueTuple, T>*)arg; + return dataPtr->Item1(uri, size, is_dir, dataPtr->Item2); }, CallbackArgument = (IntPtr)(&data) }; @@ -459,7 +476,7 @@ public void VisitChildrenRecursive(string uri, Func c // during the call to tiledb_vfs_ls_recursive. Contrast this with tiledb_query_submit_async where we // had to use a GCHandle because the callback might be invoked after we return from it. // We also are not susceptible to GC holes; callbackData is in the stack and won't be moved around. - ctx_.handle_error(Methods.tiledb_vfs_ls_recursive(ctxHandle, handle, ms_uri, &VisitRecursiveCallback, &callbackData)); + ctx_.handle_error(Methods.tiledb_vfs_ls_recursive_v2(ctxHandle, handle, ms_uri, &VisitRecursiveCallback, &callbackData)); callbackData.Exception?.Throw(); } @@ -479,7 +496,7 @@ private struct VisitCallbackData private struct VisitRecursiveCallbackData { - public Func Callback; + public Func Callback; public IntPtr CallbackArgument; @@ -488,6 +505,6 @@ private struct VisitRecursiveCallbackData // and because the native library is compiled with MSVC). public ExceptionDispatchInfo? Exception; - public readonly bool Invoke(string uri, ulong size) => Callback(uri, size, CallbackArgument); + public readonly bool Invoke(string uri, ulong size, bool is_dir) => Callback(uri, size, is_dir, CallbackArgument); } } From 27179a69e19f316cc48f6a78f9d27fe13336ac55 Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Wed, 17 Sep 2025 18:23:48 +0300 Subject: [PATCH 3/8] Remove UB. --- sources/TileDB.CSharp/Marshalling/MarshaledStringOut.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sources/TileDB.CSharp/Marshalling/MarshaledStringOut.cs b/sources/TileDB.CSharp/Marshalling/MarshaledStringOut.cs index 350e8a82..e8b42c51 100644 --- a/sources/TileDB.CSharp/Marshalling/MarshaledStringOut.cs +++ b/sources/TileDB.CSharp/Marshalling/MarshaledStringOut.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using System.Text; using TileDB.CSharp; @@ -32,8 +33,6 @@ internal static unsafe string GetStringFromNullTerminated(sbyte* ptr) return string.Empty; } - var span = new ReadOnlySpan(ptr, int.MaxValue); - span = span[0..span.IndexOf((byte)0)]; - return GetString(span); + return GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated((byte*)ptr)); } } From 17151696538b13e1bc7a9a8a4c555c928bce480f Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Wed, 17 Sep 2025 19:09:16 +0300 Subject: [PATCH 4/8] Update tests. --- tests/TileDB.CSharp.Test/VFSTest.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/TileDB.CSharp.Test/VFSTest.cs b/tests/TileDB.CSharp.Test/VFSTest.cs index 826c913a..ef49def4 100644 --- a/tests/TileDB.CSharp.Test/VFSTest.cs +++ b/tests/TileDB.CSharp.Test/VFSTest.cs @@ -76,7 +76,7 @@ public void TestCopyMove() using var vfs = new VFS(); - WriteRandomData(vfs, file1Uri, DataSize, out var dataWrite); + WriteRandomData(vfs, file1Uri, DataSize, out var _); Assert.AreEqual((ulong)DataSize, vfs.FileSize(file1Uri)); vfs.MoveFile(file1Uri, file2Uri); Assert.IsFalse(vfs.IsFile(file1Uri)); @@ -169,10 +169,11 @@ public void TestVisitRecursive() int i = 0; - vfs.VisitChildrenRecursive(dir, (uri, size, arg) => + vfs.VisitChildrenRecursive(dir, (uri, size, isDir, arg) => { string path = new Uri(uri).LocalPath; - Assert.IsTrue(Directory.Exists(path) || System.IO.File.Exists(path)); + Assert.AreEqual(isDir, Directory.Exists(path)); + Assert.AreEqual(!isDir, System.IO.File.Exists(path)); Assert.AreEqual(path.EndsWith("file3") ? 5ul : 0ul, size); Assert.AreEqual(555, arg); From f88de77c843507fc3b685ada7299863c71218d7d Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis Date: Tue, 23 Sep 2025 14:18:47 +0300 Subject: [PATCH 5/8] Update Core to 2.29.0. --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 70ccbb61..a7dc6182 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -2,7 +2,7 @@ true TileDB.Native - [2.28.1,2.29.0) + [2.29.0,2.30.0) - PKV006 - net5.0 + CP0001 + T:TileDB.CSharp.ConfigIterator + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.__sFILE + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ArrayHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ArraySchemaEvolutionHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ArraySchemaHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.AttributeHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ConfigHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ConfigIteratorHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.ContextHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.DimensionHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.DomainHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.FilterHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.FilterListHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.GroupHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.LibC + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.MarshaledString + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.MarshaledStringOut + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.QueryConditionHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.QueryHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.SpanExtensions + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_array_schema_evolution_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_array_schema_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_array_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_array_type_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_attribute_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_config_iter_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_config_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_ctx_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_datatype_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_dimension_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_domain_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_filter_list_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_filter_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_filter_type_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_group_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_query_condition_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_query_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_query_type_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.tiledb_vfs_t + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0001 + T:TileDB.Interop.VFSHandle + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0002 + M:TileDB.CSharp.Config.Iterate(System.String) + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0002 + M:TileDB.CSharp.EnumUtil.DataTypeToType(TileDB.CSharp.DataType) + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true + + + CP0002 + M:TileDB.CSharp.EnumUtil.TypeToDataType(System.Type) + lib/net8.0/TileDB.CSharp.dll + lib/net8.0/TileDB.CSharp.dll + true \ No newline at end of file