|
1 | 1 | package dev.zarr.zarrjava.store; |
2 | 2 |
|
3 | | -import dev.zarr.zarrjava.utils.Utils; |
4 | | -import software.amazon.awssdk.core.ResponseInputStream; |
5 | | -import software.amazon.awssdk.core.sync.RequestBody; |
6 | | -import software.amazon.awssdk.services.s3.S3Client; |
7 | | -import software.amazon.awssdk.services.s3.model.*; |
8 | | - |
9 | | -import javax.annotation.Nonnull; |
10 | | -import javax.annotation.Nullable; |
11 | 3 | import java.io.IOException; |
12 | 4 | import java.io.InputStream; |
13 | 5 | import java.nio.ByteBuffer; |
14 | 6 | import java.util.stream.Stream; |
15 | 7 |
|
| 8 | +import javax.annotation.Nonnull; |
| 9 | +import javax.annotation.Nullable; |
| 10 | + |
| 11 | +import dev.zarr.zarrjava.utils.Utils; |
| 12 | +import software.amazon.awssdk.core.ResponseInputStream; |
| 13 | +import software.amazon.awssdk.core.sync.RequestBody; |
| 14 | +import software.amazon.awssdk.services.s3.S3Client; |
| 15 | +import software.amazon.awssdk.services.s3.model.CommonPrefix; |
| 16 | +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; |
| 17 | +import software.amazon.awssdk.services.s3.model.GetObjectRequest; |
| 18 | +import software.amazon.awssdk.services.s3.model.GetObjectResponse; |
| 19 | +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; |
| 20 | +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; |
| 21 | +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; |
| 22 | +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; |
| 23 | +import software.amazon.awssdk.services.s3.model.PutObjectRequest; |
| 24 | +import software.amazon.awssdk.services.s3.model.S3Exception; |
| 25 | +import software.amazon.awssdk.services.s3.model.S3Object; |
| 26 | + |
16 | 27 | public class S3Store implements Store, Store.ListableStore { |
17 | 28 |
|
18 | 29 | @Nonnull |
@@ -82,7 +93,9 @@ public ByteBuffer get(String[] keys, long start) { |
82 | 93 | GetObjectRequest req = GetObjectRequest.builder() |
83 | 94 | .bucket(bucketName) |
84 | 95 | .key(resolveKeys(keys)) |
85 | | - .range(String.format("bytes=%d-", start)) |
| 96 | + .range(start < 0 // negative start implies indexing from the end, i.e. last bytes |
| 97 | + ? String.format("bytes=%d", start) |
| 98 | + : String.format("bytes=%d-", start)) |
86 | 99 | .build(); |
87 | 100 | return get(req); |
88 | 101 | } |
|
0 commit comments