Skip to content

Commit 77ac90a

Browse files
sql: migrate ObjectMetadata
1 parent b7388f9 commit 77ac90a

File tree

5 files changed

+71
-34
lines changed

5 files changed

+71
-34
lines changed

stores/metadata.go

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,39 +1428,12 @@ func (s *SQLStore) objectHydrate(tx *gorm.DB, bucket, path string, obj rawObject
14281428
}
14291429

14301430
// ObjectMetadata returns an object's metadata
1431-
func (s *SQLStore) ObjectMetadata(ctx context.Context, bucket, path string) (api.Object, error) {
1432-
var resp api.Object
1433-
err := s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
1434-
var obj dbObject
1435-
err := tx.Model(&dbObject{}).
1436-
Joins("INNER JOIN buckets b ON objects.db_bucket_id = b.id").
1437-
Where("b.name", bucket).
1438-
Where("object_id", path).
1439-
Take(&obj).
1440-
Error
1441-
if errors.Is(err, gorm.ErrRecordNotFound) {
1442-
return api.ErrObjectNotFound
1443-
} else if err != nil {
1444-
return err
1445-
}
1446-
oum, err := s.objectMetadata(tx, bucket, path)
1447-
if err != nil {
1448-
return err
1449-
}
1450-
resp = api.Object{
1451-
ObjectMetadata: newObjectMetadata(
1452-
obj.ObjectID,
1453-
obj.Etag,
1454-
obj.MimeType,
1455-
obj.Health,
1456-
obj.CreatedAt,
1457-
obj.Size,
1458-
),
1459-
Metadata: oum,
1460-
}
1461-
return nil
1431+
func (s *SQLStore) ObjectMetadata(ctx context.Context, bucket, path string) (obj api.Object, err error) {
1432+
err = s.bMain.Transaction(ctx, func(tx sql.DatabaseTx) error {
1433+
obj, err = tx.ObjectMetadata(ctx, bucket, path)
1434+
return err
14621435
})
1463-
return resp, err
1436+
return
14641437
}
14651438

14661439
func (s *SQLStore) objectMetadata(tx *gorm.DB, bucket, path string) (api.ObjectUserMetadata, error) {

stores/sql/database.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ type (
3737
DatabaseTx interface {
3838
// AbortMultipartUpload aborts a multipart upload and deletes it from
3939
// the database.
40-
AbortMultipartUpload(ctx context.Context, bucket, path string, uploadID string) error
40+
AbortMultipartUpload(ctx context.Context, bucket, key string, uploadID string) error
4141

4242
// Accounts returns all accounts from the db.
4343
Accounts(ctx context.Context) ([]api.Account, error)
4444

4545
// AddMultipartPart adds a part to an unfinished multipart upload.
46-
AddMultipartPart(ctx context.Context, bucket, path, contractSet, eTag, uploadID string, partNumber int, slices object.SlabSlices) error
46+
AddMultipartPart(ctx context.Context, bucket, key, contractSet, eTag, uploadID string, partNumber int, slices object.SlabSlices) error
4747

4848
// AddPeer adds a peer to the store.
4949
AddPeer(ctx context.Context, addr string) error
@@ -197,6 +197,9 @@ type (
197197
// MultipartUploads returns a list of all multipart uploads.
198198
MultipartUploads(ctx context.Context, bucket, prefix, keyMarker, uploadIDMarker string, limit int) (api.MultipartListUploadsResponse, error)
199199

200+
// ObjectMetadata returns an object's metadata.
201+
ObjectMetadata(ctx context.Context, bucket, key string) (api.Object, error)
202+
200203
// ObjectsStats returns overall stats about stored objects
201204
ObjectsStats(ctx context.Context, opts api.ObjectsStatsOpts) (api.ObjectsStatsResponse, error)
202205

stores/sql/main.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,59 @@ func NormalizePeer(peer string) (string, error) {
12931293
return normalized.String(), nil
12941294
}
12951295

1296+
func ObjectMetadata(ctx context.Context, tx sql.Tx, bucket, key string) (api.Object, error) {
1297+
// fetch object id
1298+
var objID int64
1299+
if err := tx.QueryRow(ctx, `
1300+
SELECT o.id
1301+
FROM objects o
1302+
INNER JOIN buckets b ON b.id = o.db_bucket_id
1303+
WHERE o.object_id = ? AND b.name = ?
1304+
`, key, bucket).Scan(&objID); errors.Is(err, dsql.ErrNoRows) {
1305+
return api.Object{}, api.ErrObjectNotFound
1306+
} else if err != nil {
1307+
return api.Object{}, fmt.Errorf("failed to fetch object id: %w", err)
1308+
}
1309+
1310+
// fetch metadata
1311+
om, err := scanObjectMetadata(tx.QueryRow(ctx, `
1312+
SELECT o.object_id, o.size, o.health, o.mime_type, o.created_at, o.etag
1313+
FROM objects o
1314+
WHERE o.id = ?
1315+
`, objID))
1316+
if err != nil {
1317+
return api.Object{}, fmt.Errorf("failed to fetch object metadata: %w", err)
1318+
}
1319+
1320+
// fetch user metadata
1321+
rows, err := tx.Query(ctx, `
1322+
SELECT oum.key, oum.value
1323+
FROM object_user_metadata oum
1324+
WHERE oum.db_object_id = ?
1325+
ORDER BY oum.id ASC
1326+
`, objID)
1327+
if err != nil {
1328+
return api.Object{}, fmt.Errorf("failed to fetch user metadata: %w", err)
1329+
}
1330+
defer rows.Close()
1331+
1332+
// build object
1333+
metadata := make(api.ObjectUserMetadata)
1334+
for rows.Next() {
1335+
var key, value string
1336+
if err := rows.Scan(&key, &value); err != nil {
1337+
return api.Object{}, fmt.Errorf("failed to scan user metadata: %w", err)
1338+
}
1339+
metadata[key] = value
1340+
}
1341+
1342+
return api.Object{
1343+
Metadata: metadata,
1344+
ObjectMetadata: om,
1345+
Object: nil, // only return metadata
1346+
}, nil
1347+
}
1348+
12961349
func ObjectsStats(ctx context.Context, tx sql.Tx, opts api.ObjectsStatsOpts) (api.ObjectsStatsResponse, error) {
12971350
var args []any
12981351
var bucketExpr string

stores/sql/mysql/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,10 @@ func (tx *MainDatabaseTx) MultipartUploads(ctx context.Context, bucket, prefix,
522522
return ssql.MultipartUploads(ctx, tx, bucket, prefix, keyMarker, uploadIDMarker, limit)
523523
}
524524

525+
func (tx *MainDatabaseTx) ObjectMetadata(ctx context.Context, bucket, path string) (api.Object, error) {
526+
return ssql.ObjectMetadata(ctx, tx, bucket, path)
527+
}
528+
525529
func (tx *MainDatabaseTx) ObjectsStats(ctx context.Context, opts api.ObjectsStatsOpts) (api.ObjectsStatsResponse, error) {
526530
return ssql.ObjectsStats(ctx, tx, opts)
527531
}

stores/sql/sqlite/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,10 @@ func (tx *MainDatabaseTx) MultipartUploads(ctx context.Context, bucket, prefix,
519519
return ssql.MultipartUploads(ctx, tx, bucket, prefix, keyMarker, uploadIDMarker, limit)
520520
}
521521

522+
func (tx *MainDatabaseTx) ObjectMetadata(ctx context.Context, bucket, path string) (api.Object, error) {
523+
return ssql.ObjectMetadata(ctx, tx, bucket, path)
524+
}
525+
522526
func (tx *MainDatabaseTx) ObjectsStats(ctx context.Context, opts api.ObjectsStatsOpts) (api.ObjectsStatsResponse, error) {
523527
return ssql.ObjectsStats(ctx, tx, opts)
524528
}

0 commit comments

Comments
 (0)