Skip to content

Commit 87187a2

Browse files
authored
Make the DuckDBConnection support unicode file path (#197)
1 parent c6cc733 commit 87187a2

File tree

6 files changed

+46
-4
lines changed

6 files changed

+46
-4
lines changed

DuckDB.NET.Bindings/NativeMethods/NativeMethods.Startup.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@ public partial class NativeMethods
88
//https://duckdb.org/docs/api/c/api#openconnect
99
public static class Startup
1010
{
11+
[DllImport(DuckDbLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = "duckdb_open")]
12+
public static extern DuckDBState DuckDBOpen(SafeUnmanagedMemoryHandle path, out DuckDBDatabase database);
13+
1114
[DllImport(DuckDbLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = "duckdb_open")]
1215
public static extern DuckDBState DuckDBOpen(string? path, out DuckDBDatabase database);
1316

17+
[DllImport(DuckDbLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = "duckdb_open_ext")]
18+
public static extern DuckDBState DuckDBOpen(SafeUnmanagedMemoryHandle path, out DuckDBDatabase database, DuckDBConfig config, out IntPtr error);
19+
1420
[DllImport(DuckDbLibrary, CallingConvention = CallingConvention.Cdecl, EntryPoint = "duckdb_open_ext")]
1521
public static extern DuckDBState DuckDBOpen(string? path, out DuckDBDatabase database, DuckDBConfig config, out IntPtr error);
1622

DuckDB.NET.Data/Internal/ConnectionManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ internal ConnectionReference GetConnectionReference(DuckDBConnectionString conne
6969
}
7070
}
7171

72-
var resultOpen = NativeMethods.Startup.DuckDBOpen(path, out var db, config, out var error);
72+
using var pathUnmanaged = path.ToUnmanagedString();
73+
74+
var resultOpen = NativeMethods.Startup.DuckDBOpen(pathUnmanaged, out var db, config, out var error);
7375

7476
if (!resultOpen.IsSuccess())
7577
{

DuckDB.NET.Samples/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private static void AdoNetSamples()
9191

9292
private static void LowLevelBindingsSample()
9393
{
94-
var result = Startup.DuckDBOpen(null, out var database);
94+
var result = Startup.DuckDBOpen(new SafeUnmanagedMemoryHandle(IntPtr.Zero), out var database);
9595

9696
using (database)
9797
{

DuckDB.NET.Test/AppenderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class DuckDBAppenderTests
99
[Fact]
1010
public void AppenderTests()
1111
{
12-
var result = NativeMethods.Startup.DuckDBOpen(null, out var database);
12+
var result = NativeMethods.Startup.DuckDBOpen((string)null, out var database);
1313
result.Should().Be(DuckDBState.Success);
1414

1515
result = NativeMethods.Startup.DuckDBConnect(database, out var connection);

DuckDB.NET.Test/OpenTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using DuckDB.NET.Data;
2+
using System.IO;
3+
using Xunit;
4+
5+
namespace DuckDB.NET.Test;
6+
7+
public class OpenTests
8+
{
9+
[Theory]
10+
[InlineData("中文", "中文.db")]
11+
[InlineData("english", "english.db")]
12+
[InlineData("한국어", "한국어.db")]
13+
public void OpenWithFile(string path,string fileName)
14+
{
15+
var dir = Path.Combine(path);
16+
if (!Directory.Exists(dir))
17+
{
18+
Directory.CreateDirectory(dir);
19+
}
20+
var file = Path.Combine(dir, fileName);
21+
using (var conn=new DuckDBConnection($"Data Source={file}"))
22+
{
23+
conn.Open();
24+
}
25+
try
26+
{
27+
File.Delete(file);
28+
Directory.Delete(dir);
29+
}
30+
catch (System.Exception)
31+
{
32+
}
33+
}
34+
}

DuckDB.NET.Test/QueryTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class QueryTests(DuckDBDatabaseFixture db) : DuckDBTestBase(db)
99
[Fact]
1010
public void QueryTest()
1111
{
12-
var result = NativeMethods.Startup.DuckDBOpen(null, out var database);
12+
var result = NativeMethods.Startup.DuckDBOpen((string)null, out var database);
1313
result.Should().Be(DuckDBState.Success);
1414

1515
result = NativeMethods.Startup.DuckDBConnect(database, out var connection);

0 commit comments

Comments
 (0)