diff --git a/src/main/java/net/coreprotect/database/DuckDBDatabase.java b/src/main/java/net/coreprotect/database/DuckDBDatabase.java index c677856c..841d3685 100644 --- a/src/main/java/net/coreprotect/database/DuckDBDatabase.java +++ b/src/main/java/net/coreprotect/database/DuckDBDatabase.java @@ -46,7 +46,7 @@ final class DuckDBDatabase { properties.setProperty("allow_community_extensions", "false"); properties.setProperty("autoload_known_extensions", "false"); properties.setProperty("autoinstall_known_extensions", "false"); - rootConnection = (DuckDBConnection) java.sql.DriverManager.getConnection("jdbc:duckdb:" + databaseFile.getAbsolutePath(), properties); + rootConnection = DuckDBNativeSupport.openDatabase(() -> (DuckDBConnection) java.sql.DriverManager.getConnection("jdbc:duckdb:" + databaseFile.getAbsolutePath(), properties)); } static synchronized Connection getConnection() throws Exception { diff --git a/src/main/java/net/coreprotect/database/DuckDBNativeSupport.java b/src/main/java/net/coreprotect/database/DuckDBNativeSupport.java index ec95c042..5d7b6849 100644 --- a/src/main/java/net/coreprotect/database/DuckDBNativeSupport.java +++ b/src/main/java/net/coreprotect/database/DuckDBNativeSupport.java @@ -3,6 +3,7 @@ package net.coreprotect.database; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.SQLException; public final class DuckDBNativeSupport { @@ -14,13 +15,30 @@ public final class DuckDBNativeSupport { public static void verifyAvailable() throws Exception { Class.forName("org.duckdb.DuckDBDriver"); - try (Connection connection = DriverManager.getConnection("jdbc:duckdb:")) { + try (Connection connection = openDatabase(() -> DriverManager.getConnection("jdbc:duckdb:"))) { if (connection == null) { throw new IllegalStateException("DuckDB JDBC driver did not create an in-memory connection"); } } } + public static T openDatabase(DatabaseOpener opener) throws SQLException { + Thread thread = Thread.currentThread(); + String originalName = thread.getName(); + thread.setName("CoreProtect-DuckDB"); + try { + return opener.open(); + } + finally { + thread.setName(originalName); + } + } + + @FunctionalInterface + public interface DatabaseOpener { + T open() throws SQLException; + } + public static boolean isNativeUnavailable(Throwable failure) { for (Throwable cause = failure; cause != null; cause = cause.getCause()) { if (cause instanceof UnsatisfiedLinkError) {