From 32b9b7e578a04882aa4e8604e049e2c4b7ff055f Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 21 Apr 2023 13:59:29 +0100 Subject: [PATCH] Use a temporary file when reading on-chain data. --- .../qortal/arbitrary/ArbitraryDataFile.java | 19 ++++++++++++++++--- .../arbitrary/ArbitraryDataFileChunk.java | 2 +- .../message/ArbitraryDataFileMessage.java | 2 +- .../message/ArbitraryMetadataMessage.java | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java index 051c8831..71378461 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java @@ -79,7 +79,7 @@ public class ArbitraryDataFile { this.signature = signature; } - public ArbitraryDataFile(byte[] fileContent, byte[] signature) throws DataException { + public ArbitraryDataFile(byte[] fileContent, byte[] signature, boolean useTemporaryFile) throws DataException { if (fileContent == null) { LOGGER.error("fileContent is null"); return; @@ -90,7 +90,20 @@ public class ArbitraryDataFile { this.signature = signature; LOGGER.trace(String.format("File digest: %s, size: %d bytes", this.hash58, fileContent.length)); - Path outputFilePath = getOutputFilePath(this.hash58, signature, true); + Path outputFilePath; + if (useTemporaryFile) { + try { + outputFilePath = Files.createTempFile("qortalRawData", null); + outputFilePath.toFile().deleteOnExit(); + } + catch (IOException e) { + throw new DataException(String.format("Unable to write data with hash %s to temporary file: %s", this.hash58, e.getMessage())); + } + } + else { + outputFilePath = getOutputFilePath(this.hash58, signature, true); + } + File outputFile = outputFilePath.toFile(); try (FileOutputStream outputStream = new FileOutputStream(outputFile)) { outputStream.write(fileContent); @@ -116,7 +129,7 @@ public class ArbitraryDataFile { if (data == null) { return null; } - return new ArbitraryDataFile(data, signature); + return new ArbitraryDataFile(data, signature, true); } public static ArbitraryDataFile fromTransactionData(ArbitraryTransactionData transactionData) throws DataException { diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFileChunk.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFileChunk.java index 5f6695df..1fd388da 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFileChunk.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFileChunk.java @@ -18,7 +18,7 @@ public class ArbitraryDataFileChunk extends ArbitraryDataFile { } public ArbitraryDataFileChunk(byte[] fileContent, byte[] signature) throws DataException { - super(fileContent, signature); + super(fileContent, signature, false); } public static ArbitraryDataFileChunk fromHash58(String hash58, byte[] signature) throws DataException { diff --git a/src/main/java/org/qortal/network/message/ArbitraryDataFileMessage.java b/src/main/java/org/qortal/network/message/ArbitraryDataFileMessage.java index 50991be3..936c9dca 100644 --- a/src/main/java/org/qortal/network/message/ArbitraryDataFileMessage.java +++ b/src/main/java/org/qortal/network/message/ArbitraryDataFileMessage.java @@ -68,7 +68,7 @@ public class ArbitraryDataFileMessage extends Message { byteBuffer.get(data); try { - ArbitraryDataFile arbitraryDataFile = new ArbitraryDataFile(data, signature); + ArbitraryDataFile arbitraryDataFile = new ArbitraryDataFile(data, signature, false); return new ArbitraryDataFileMessage(id, signature, arbitraryDataFile); } catch (DataException e) { LOGGER.info("Unable to process received file: {}", e.getMessage()); diff --git a/src/main/java/org/qortal/network/message/ArbitraryMetadataMessage.java b/src/main/java/org/qortal/network/message/ArbitraryMetadataMessage.java index 26601d4b..7d398f51 100644 --- a/src/main/java/org/qortal/network/message/ArbitraryMetadataMessage.java +++ b/src/main/java/org/qortal/network/message/ArbitraryMetadataMessage.java @@ -64,7 +64,7 @@ public class ArbitraryMetadataMessage extends Message { byteBuffer.get(data); try { - ArbitraryDataFile arbitraryMetadataFile = new ArbitraryDataFile(data, signature); + ArbitraryDataFile arbitraryMetadataFile = new ArbitraryDataFile(data, signature, false); return new ArbitraryMetadataMessage(id, signature, arbitraryMetadataFile); } catch (DataException e) { throw new MessageException("Unable to process arbitrary metadata message: " + e.getMessage(), e);