diff --git a/.sdkmanrc b/.sdkmanrc new file mode 100644 index 0000000..5e93e02 --- /dev/null +++ b/.sdkmanrc @@ -0,0 +1,3 @@ +# Enable auto-env through the sdkman_auto_env config +# Add key=value pairs of SDKs to use below +java=25.0.2-tem diff --git a/src/main/java/com/sparrowwallet/frigate/index/Index.java b/src/main/java/com/sparrowwallet/frigate/index/Index.java index c3fdb9c..46616cb 100644 --- a/src/main/java/com/sparrowwallet/frigate/index/Index.java +++ b/src/main/java/com/sparrowwallet/frigate/index/Index.java @@ -18,7 +18,6 @@ import com.sparrowwallet.frigate.io.Storage; import org.duckdb.DuckDBAppender; import org.duckdb.DuckDBConnection; import org.duckdb.DuckDBPreparedStatement; -import org.duckdb.QueryProgress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,6 +87,9 @@ public class Index { }); if(backend.startsWith("cpu")) { + if(computeBackend == ComputeBackend.GPU) { + throw new ConfigurationException("No GPU detected, but \"computeBackend\" is set to \"GPU\". Set to \"AUTO\" or \"CPU\", or install a supported GPU."); + } log.warn("No GPU detected, using CPU backend for scanning. Set \"computeBackend\": \"CPU\" in config to suppress this warning."); } else { log.info("Using {} backend for scanning", backend); @@ -97,6 +99,27 @@ public class Index { } } + private double pollScanProgress(byte[] scanKeyBytes) { + try { + return dbManager.executeRead(progressConnection -> { + try(PreparedStatement progressStmt = progressConnection.prepareStatement("SELECT ufsecp_progress(?)")) { + progressStmt.setBytes(1, scanKeyBytes); + ResultSet rs = progressStmt.executeQuery(); + if(rs.next()) { + double pct = rs.getDouble(1); + if(pct < 0.0d) { + return 0.0d; + } + return Math.min(pct / 100.0d, 1.0d); + } + return 0.0d; + } + }); + } catch(Exception e) { + return 0.0d; + } + } + public void close() { dbManager.close(); } @@ -210,7 +233,7 @@ public class Index { public List getHistoryAsync(SilentPaymentScanAddress scanAddress, SilentPaymentsSubscription subscription, Integer startHeight, Integer endHeight, WeakReference subscriptionStatusRef) { ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); - AtomicLong rowsProcessedStart = new AtomicLong(0L); + byte[] scanKeyBytes = Utils.reverseBytes(scanAddress.getScanKey().getPrivKeyBytes()); try { dbManager.executeRead(connection -> { @@ -237,18 +260,7 @@ public class Index { return; } - QueryProgress queryProgress = statement.getQueryProgress(); - if(queryProgress.getRowsProcessed() == queryProgress.getTotalRowsToProcess()) { - return; - } - - double progress = 0.0d; - if(rowsProcessedStart.get() == 0L && queryProgress.getRowsProcessed() > 0) { - rowsProcessedStart.set(queryProgress.getRowsProcessed()); - } - if(rowsProcessedStart.get() > 0L) { - progress = (queryProgress.getRowsProcessed() - rowsProcessedStart.get()) / (double)(queryProgress.getTotalRowsToProcess() - rowsProcessedStart.get()); - } + double progress = pollScanProgress(scanKeyBytes); List history = new ArrayList<>(); TxEntry entry; @@ -263,7 +275,7 @@ public class Index { Frigate.getEventBus().post(new SilentPaymentsNotification(subscription, progress, new ArrayList<>(history), subscriptionStatusRef.get())); history.clear(); } - } catch(SQLException e) { + } catch(Exception e) { log.error("Error getting query progress", e); } }, 1, 1, TimeUnit.SECONDS); diff --git a/src/main/java/com/sparrowwallet/frigate/io/Storage.java b/src/main/java/com/sparrowwallet/frigate/io/Storage.java index 341b027..1066947 100644 --- a/src/main/java/com/sparrowwallet/frigate/io/Storage.java +++ b/src/main/java/com/sparrowwallet/frigate/io/Storage.java @@ -10,6 +10,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.util.zip.GZIPInputStream; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.PosixFilePermission; @@ -47,12 +48,21 @@ public class Storage { File extensionFile = new File(getFrigateCacheDir(), extensionFileName); - try(InputStream is = Storage.class.getResourceAsStream(resourcePath)) { - if(is == null) { - throw new IOException("Could not find " + extensionFileName + " for the current platform: " + osName + " " + osArch); + try { + InputStream is = Storage.class.getResourceAsStream(resourcePath); + if(is != null) { + try(is) { + Files.copy(is, extensionFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + } else { + InputStream gzIs = Storage.class.getResourceAsStream(resourcePath + ".gz"); + if(gzIs == null) { + throw new IOException("Could not find " + extensionFileName + " for the current platform: " + osName + " " + osArch); + } + try(GZIPInputStream decompressed = new GZIPInputStream(gzIs)) { + Files.copy(decompressed, extensionFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } } - - Files.copy(is, extensionFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch(IOException e) { log.error("Error loading " + extensionFileName, e); } diff --git a/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension b/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension deleted file mode 100755 index fa0f767..0000000 Binary files a/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension and /dev/null differ diff --git a/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension.gz b/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension.gz new file mode 100755 index 0000000..f90ce54 Binary files /dev/null and b/src/main/resources/native/linux/amd64/ufsecp.duckdb_extension.gz differ diff --git a/src/main/resources/native/linux/arm64/ufsecp.duckdb_extension.gz b/src/main/resources/native/linux/arm64/ufsecp.duckdb_extension.gz new file mode 100755 index 0000000..9fd4836 Binary files /dev/null and b/src/main/resources/native/linux/arm64/ufsecp.duckdb_extension.gz differ diff --git a/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension b/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension deleted file mode 100755 index 88dbb07..0000000 Binary files a/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension and /dev/null differ diff --git a/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension.gz b/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension.gz new file mode 100755 index 0000000..ca5ffda Binary files /dev/null and b/src/main/resources/native/macos/amd64/ufsecp.duckdb_extension.gz differ diff --git a/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension b/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension deleted file mode 100755 index dc52a8d..0000000 Binary files a/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension and /dev/null differ diff --git a/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension.gz b/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension.gz new file mode 100755 index 0000000..5b0e8e6 Binary files /dev/null and b/src/main/resources/native/macos/arm64/ufsecp.duckdb_extension.gz differ diff --git a/src/main/resources/native/windows/amd64/ufsecp.duckdb_extension b/src/main/resources/native/windows/amd64/ufsecp.duckdb_extension deleted file mode 100644 index abd993c..0000000 Binary files a/src/main/resources/native/windows/amd64/ufsecp.duckdb_extension and /dev/null differ diff --git a/src/main/resources/native/linux/arm64/ufsecp.duckdb_extension b/src/main/resources/native/windows/amd64/ufsecp.duckdb_extension.gz old mode 100755 new mode 100644 similarity index 52% rename from src/main/resources/native/linux/arm64/ufsecp.duckdb_extension rename to src/main/resources/native/windows/amd64/ufsecp.duckdb_extension.gz index 00e4581..7935c7d Binary files a/src/main/resources/native/linux/arm64/ufsecp.duckdb_extension and b/src/main/resources/native/windows/amd64/ufsecp.duckdb_extension.gz differ