forked from Qortal/qortal
Limit query to 100 so that it doesn't return endless amounts of transaction signatures.
Using a separate database method for now to reduce risk of interfering with other parts of the code which use it. It can be combined later when there is more testing time.
This commit is contained in:
parent
95d72866e9
commit
947b523e61
@ -73,7 +73,7 @@ public abstract class RepositoryManager {
|
|||||||
public static boolean needsTransactionSequenceRebuild(Repository repository) throws DataException {
|
public static boolean needsTransactionSequenceRebuild(Repository repository) throws DataException {
|
||||||
// Check if we have any transactions without a block_sequence
|
// Check if we have any transactions without a block_sequence
|
||||||
List<byte[]> testSignatures = repository.getTransactionRepository().getSignaturesMatchingCustomCriteria(
|
List<byte[]> testSignatures = repository.getTransactionRepository().getSignaturesMatchingCustomCriteria(
|
||||||
null, Arrays.asList("block_height IS NOT NULL AND block_sequence IS NULL"), new ArrayList<>());
|
null, Arrays.asList("block_height IS NOT NULL AND block_sequence IS NULL"), new ArrayList<>(), 100);
|
||||||
if (testSignatures.isEmpty()) {
|
if (testSignatures.isEmpty()) {
|
||||||
// block_sequence intact, so assume complete
|
// block_sequence intact, so assume complete
|
||||||
return false;
|
return false;
|
||||||
|
@ -125,6 +125,23 @@ public interface TransactionRepository {
|
|||||||
public List<byte[]> getSignaturesMatchingCustomCriteria(TransactionType txType, List<String> whereClauses,
|
public List<byte[]> getSignaturesMatchingCustomCriteria(TransactionType txType, List<String> whereClauses,
|
||||||
List<Object> bindParams) throws DataException;
|
List<Object> bindParams) throws DataException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns signatures for transactions that match search criteria, with optional limit.
|
||||||
|
* <p>
|
||||||
|
* Alternate version that allows for custom where clauses and bind params.
|
||||||
|
* Only use for very specific use cases, such as the names integrity check.
|
||||||
|
* Not advised to be used otherwise, given that it could be possible for
|
||||||
|
* unsanitized inputs to be passed in if not careful.
|
||||||
|
*
|
||||||
|
* @param txType
|
||||||
|
* @param whereClauses
|
||||||
|
* @param bindParams
|
||||||
|
* @return
|
||||||
|
* @throws DataException
|
||||||
|
*/
|
||||||
|
public List<byte[]> getSignaturesMatchingCustomCriteria(TransactionType txType, List<String> whereClauses,
|
||||||
|
List<Object> bindParams, Integer limit) throws DataException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns signature for latest auto-update transaction.
|
* Returns signature for latest auto-update transaction.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -694,6 +694,53 @@ public class HSQLDBTransactionRepository implements TransactionRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<byte[]> getSignaturesMatchingCustomCriteria(TransactionType txType, List<String> whereClauses,
|
||||||
|
List<Object> bindParams, Integer limit) throws DataException {
|
||||||
|
List<byte[]> signatures = new ArrayList<>();
|
||||||
|
|
||||||
|
String txTypeClassName = "";
|
||||||
|
if (txType != null) {
|
||||||
|
txTypeClassName = txType.className;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder sql = new StringBuilder(1024);
|
||||||
|
sql.append(String.format("SELECT signature FROM %sTransactions", txTypeClassName));
|
||||||
|
|
||||||
|
if (!whereClauses.isEmpty()) {
|
||||||
|
sql.append(" WHERE ");
|
||||||
|
|
||||||
|
final int whereClausesSize = whereClauses.size();
|
||||||
|
for (int wci = 0; wci < whereClausesSize; ++wci) {
|
||||||
|
if (wci != 0)
|
||||||
|
sql.append(" AND ");
|
||||||
|
|
||||||
|
sql.append(whereClauses.get(wci));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limit != null) {
|
||||||
|
sql.append(" LIMIT ?");
|
||||||
|
bindParams.add(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.trace(() -> String.format("Transaction search SQL: %s", sql));
|
||||||
|
|
||||||
|
try (ResultSet resultSet = this.repository.checkedExecute(sql.toString(), bindParams.toArray())) {
|
||||||
|
if (resultSet == null)
|
||||||
|
return signatures;
|
||||||
|
|
||||||
|
do {
|
||||||
|
byte[] signature = resultSet.getBytes(1);
|
||||||
|
|
||||||
|
signatures.add(signature);
|
||||||
|
} while (resultSet.next());
|
||||||
|
|
||||||
|
return signatures;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new DataException("Unable to fetch matching transaction signatures from repository", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] getLatestAutoUpdateTransaction(TransactionType txType, int txGroupId, Integer service) throws DataException {
|
public byte[] getLatestAutoUpdateTransaction(TransactionType txType, int txGroupId, Integer service) throws DataException {
|
||||||
StringBuilder sql = new StringBuilder(1024);
|
StringBuilder sql = new StringBuilder(1024);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user