tusd/lockingstore/lockingstore.go

68 lines
1.3 KiB
Go

package lockingstore
type Locker interface {
LockUpload(id string) error
UnlockUpload(id string) error
}
type LockingStore struct {
tusd.DataStore
Locker *Locker
}
func (store LockingStore) WriteChunk(id string, offset int64, src io.Reader) (int64, error) {
if err := store.LockUpload(id); err != nil {
return 0, err
}
defer func() {
if unlockErr := store.UnlockUpload(id); unlockErr != nil {
err = unlockErr
}
}()
return store.DataStore.WriteChunk(id, offset, src)
}
func (store LockingStore) GetInfo(id string) (FileInfo, error) {
if err := store.LockUpload(id); err != nil {
return nil, err
}
defer func() {
if unlockErr := store.UnlockUpload(id); unlockErr != nil {
err = unlockErr
}
}()
return store.DataStore.GetInfo(id)
}
func (store LockingStore) GetReader(id string) (io.Reader, error) {
if err := store.LockUpload(id); err != nil {
return nil, err
}
defer func() {
if unlockErr := store.UnlockUpload(id); unlockErr != nil {
err = unlockErr
}
}()
return store.DataStore.GetReader(id)
}
func (store LockingStore) Terminate(id string) error {
if err := store.LockUpload(id); err != nil {
return err
}
defer func() {
if unlockErr := store.UnlockUpload(id); unlockErr != nil {
err = unlockErr
}
}()
return store.DataStore.Terminate(id)
}