Search in sources :

Example 1 with Page

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);
}
Also used : ResultSet(java.sql.ResultSet) ArrayList(java.util.ArrayList) PreparedStatement(java.sql.PreparedStatement) Page(com.github.ambry.frontend.Page) Timestamp(java.sql.Timestamp) DbEndpoint(com.github.ambry.mysql.MySqlUtils.DbEndpoint)

Aggregations

Page (com.github.ambry.frontend.Page)1 DbEndpoint (com.github.ambry.mysql.MySqlUtils.DbEndpoint)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 Timestamp (java.sql.Timestamp)1 ArrayList (java.util.ArrayList)1