Browse Source

Exclude metadata-only transactions in the data management page (but added an API parameter to allow them to optionally be included).

This ensures that the list will only show resources where there is at least 1 chunk.
qdn-metadata
CalDescent 3 years ago
parent
commit
e4238a62c9
  1. 10
      src/main/java/org/qortal/api/resource/ArbitraryResource.java
  2. 2
      src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java
  3. 22
      src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java

10
src/main/java/org/qortal/api/resource/ArbitraryResource.java

@ -430,12 +430,13 @@ public class ArbitraryResource {
@ApiErrors({ApiError.REPOSITORY_ISSUE}) @ApiErrors({ApiError.REPOSITORY_ISSUE})
public List<ArbitraryTransactionData> getHostedTransactions(@HeaderParam(Security.API_KEY_HEADER) String apiKey, public List<ArbitraryTransactionData> getHostedTransactions(@HeaderParam(Security.API_KEY_HEADER) String apiKey,
@Parameter(ref = "limit") @QueryParam("limit") Integer limit, @Parameter(ref = "limit") @QueryParam("limit") Integer limit,
@Parameter(ref = "offset") @QueryParam("offset") Integer offset) { @Parameter(ref = "offset") @QueryParam("offset") Integer offset,
@QueryParam("includemetadata") Boolean includeMetadata) {
Security.checkApiCallAllowed(request); Security.checkApiCallAllowed(request);
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
List<ArbitraryTransactionData> hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); List<ArbitraryTransactionData> hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset, includeMetadata);
return hostedTransactions; return hostedTransactions;
@ -459,14 +460,15 @@ public class ArbitraryResource {
@HeaderParam(Security.API_KEY_HEADER) String apiKey, @HeaderParam(Security.API_KEY_HEADER) String apiKey,
@Parameter(description = "Include status") @QueryParam("includestatus") Boolean includeStatus, @Parameter(description = "Include status") @QueryParam("includestatus") Boolean includeStatus,
@Parameter(ref = "limit") @QueryParam("limit") Integer limit, @Parameter(ref = "limit") @QueryParam("limit") Integer limit,
@Parameter(ref = "offset") @QueryParam("offset") Integer offset) { @Parameter(ref = "offset") @QueryParam("offset") Integer offset,
@QueryParam("includemetadata") Boolean includeMetadata) {
Security.checkApiCallAllowed(request); Security.checkApiCallAllowed(request);
List<ArbitraryResourceInfo> resources = new ArrayList<>(); List<ArbitraryResourceInfo> resources = new ArrayList<>();
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
List<ArbitraryTransactionData> transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); List<ArbitraryTransactionData> transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset, includeMetadata);
for (ArbitraryTransactionData transactionData : transactionDataList) { for (ArbitraryTransactionData transactionData : transactionDataList) {
ArbitraryResourceInfo arbitraryResourceInfo = new ArbitraryResourceInfo(); ArbitraryResourceInfo arbitraryResourceInfo = new ArbitraryResourceInfo();
arbitraryResourceInfo.name = transactionData.getName(); arbitraryResourceInfo.name = transactionData.getName();

2
src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java

@ -370,7 +370,7 @@ public class ArbitraryDataManager extends Thread {
public void broadcastHostedSignatureList() { public void broadcastHostedSignatureList() {
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
List<ArbitraryTransactionData> hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, null, null); List<ArbitraryTransactionData> hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, null, null, false);
List<byte[]> hostedSignatures = hostedTransactions.stream().map(ArbitraryTransactionData::getSignature).collect(Collectors.toList()); List<byte[]> hostedSignatures = hostedTransactions.stream().map(ArbitraryTransactionData::getSignature).collect(Collectors.toList());
if (!hostedSignatures.isEmpty()) { if (!hostedSignatures.isEmpty()) {
// Broadcast the list, using null to represent our peer address // Broadcast the list, using null to represent our peer address

22
src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java

@ -259,7 +259,7 @@ public class ArbitraryDataStorageManager extends Thread {
// Hosted data // Hosted data
public List<ArbitraryTransactionData> listAllHostedTransactions(Repository repository, Integer limit, Integer offset) { public List<ArbitraryTransactionData> listAllHostedTransactions(Repository repository, Integer limit, Integer offset, boolean includeMetadataOnly) {
// Load from cache if we can, to avoid disk reads // Load from cache if we can, to avoid disk reads
if (this.hostedTransactions != null) { if (this.hostedTransactions != null) {
return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset); return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset);
@ -285,7 +285,23 @@ public class ArbitraryDataStorageManager extends Thread {
if (transactionData == null || transactionData.getType() != Transaction.TransactionType.ARBITRARY) { if (transactionData == null || transactionData.getType() != Transaction.TransactionType.ARBITRARY) {
continue; continue;
} }
arbitraryTransactionDataList.add((ArbitraryTransactionData) transactionData); ArbitraryTransactionData arbitraryTransactionData = (ArbitraryTransactionData) transactionData;
// Make sure to exclude metadata-only resources if requested
if (!includeMetadataOnly) {
if (arbitraryTransactionData.getMetadataHash() != null) {
if (contents.length == 1) {
String metadataHash58 = Base58.encode(arbitraryTransactionData.getMetadataHash());
if (Objects.equals(metadataHash58, contents[0])) {
// We only have the metadata file for this resource, not the actual data, so exclude it
continue;
}
}
}
}
// Found some data matching a transaction, so add it to the list
arbitraryTransactionDataList.add(arbitraryTransactionData);
} catch (DataException e) { } catch (DataException e) {
continue; continue;
@ -451,7 +467,7 @@ public class ArbitraryDataStorageManager extends Thread {
long maxStoragePerName = this.storageCapacityPerName(threshold); long maxStoragePerName = this.storageCapacityPerName(threshold);
// Fetch all hosted transactions // Fetch all hosted transactions
List<ArbitraryTransactionData> hostedTransactions = this.listAllHostedTransactions(repository, null, null); List<ArbitraryTransactionData> hostedTransactions = this.listAllHostedTransactions(repository, null, null, true);
for (ArbitraryTransactionData transactionData : hostedTransactions) { for (ArbitraryTransactionData transactionData : hostedTransactions) {
String transactionName = transactionData.getName(); String transactionName = transactionData.getName();
if (!Objects.equals(name, transactionName)) { if (!Objects.equals(name, transactionName)) {

Loading…
Cancel
Save