use of com.github.ambry.frontend.Page in project ambry by linkedin.
the class MySqlNamedBlobDb method list.
@Override
public CompletableFuture<Page<NamedBlobRecord>> list(String accountName, String containerName, String blobNamePrefix, String pageToken) {
return executeTransactionAsync(accountName, containerName, true, (accountId, containerId, connection) -> {
try (PreparedStatement statement = connection.prepareStatement(LIST_QUERY)) {
statement.setInt(1, accountId);
statement.setInt(2, containerId);
statement.setString(3, blobNamePrefix + "%");
statement.setString(4, pageToken != null ? pageToken : blobNamePrefix);
statement.setInt(5, config.listMaxResults + 1);
try (ResultSet resultSet = statement.executeQuery()) {
String nextContinuationToken = null;
List<NamedBlobRecord> entries = new ArrayList<>();
long currentTime = System.currentTimeMillis();
int resultIndex = 0;
while (resultSet.next()) {
if (resultIndex++ == config.listMaxResults) {
nextContinuationToken = resultSet.getString(1);
break;
}
String blobName = resultSet.getString(1);
String blobId = Base64.encodeBase64URLSafeString(resultSet.getBytes(2));
Timestamp expirationTime = resultSet.getTimestamp(3);
Timestamp deletionTime = resultSet.getTimestamp(4);
if (compareTimestamp(expirationTime, currentTime) <= 0) {
logger.trace("LIST: Blob expired, ignoring in list response; account='{}', container='{}', name='{}'", accountName, containerName, blobName);
} else if (compareTimestamp(deletionTime, currentTime) <= 0) {
logger.trace("LIST: Blob deleted, ignoring in list response; account='{}', container='{}', name='{}'", accountName, containerName, blobName);
} else {
entries.add(new NamedBlobRecord(accountName, containerName, blobName, blobId, timestampToMs(expirationTime)));
}
}
return new Page<>(entries, nextContinuationToken);
}
}
}, null);
}
Aggregations