internal/repo/metadata.go (90 lines of code) (raw):
package repo
import (
"errors"
"time"
"github.com/GoogleCloudPlatform/gcs-metadata-server/internal/model"
)
type Metadata struct {
*Database
}
type MetadataRepository interface {
Get(bucket string, name string) (*model.Metadata, error)
Insert(*model.Metadata) error
Update(bucket, name, storageClass string, size int64, updated time.Time) error
Delete(bucket, name string) error
}
func NewMetadataRepository(db *Database) MetadataRepository {
return &Metadata{db}
}
// Get returns metadata object information. It returns an empty struct if metadata does not exist.
func (m *Metadata) Get(bucket, name string) (*model.Metadata, error) {
query := `
SELECT name, parent, size, storage_class, created, updated
FROM metadata
WHERE bucket = ? AND name = ?;
`
// Select record and ignore empty results for services not to depend on database errors
var metadata model.Metadata
if err := m.DB.Get(&metadata, query, bucket, name); err != nil {
return nil, err
}
return &metadata, nil
}
func (m *Metadata) Insert(obj *model.Metadata) error {
query := `
INSERT INTO metadata
(bucket, name, size, parent, storage_class, created, updated)
VALUES (?, ?, ?, ?, ?, ?, ?);
`
if len(obj.Bucket) == 0 || len(obj.Name) == 0 {
return errors.New("bucket or name argument is empty")
}
if _, err := m.DB.Exec(query,
obj.Bucket,
obj.Name,
obj.Size,
getParentDir(obj.Name),
obj.StorageClass,
obj.Created,
obj.Updated); err != nil {
return err
}
return nil
}
func (m *Metadata) Update(bucket, name, storageClass string, size int64, updated time.Time) error {
query := `
UPDATE metadata
SET storage_class = $1,
size = $2,
updated = $3
WHERE bucket = $4 AND name = $5;
`
res, err := m.DB.Exec(query, storageClass, size, updated, bucket, name)
if err != nil {
return err
}
rowsAffected, err := res.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return errors.New("no rows affected")
}
return nil
}
func (m *Metadata) Delete(bucket string, name string) error {
query := `
DELETE FROM metadata
WHERE bucket = ? AND name = ?;
`
res, err := m.DB.Exec(query, bucket, name)
if err != nil {
return err
}
rowsAffected, err := res.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return errors.New("no rows affected")
}
return nil
}