go-judge/filestore/file_memory.go
2020-05-18 20:14:45 -04:00

74 lines
1.2 KiB
Go

package filestore
import (
"sync"
"github.com/criyle/go-judge/file"
)
type fileMemoryStore struct {
store map[string]file.File
mu sync.RWMutex
}
// NewFileMemoryStore create new memory file store
func NewFileMemoryStore() FileStore {
return &fileMemoryStore{
store: make(map[string]file.File),
}
}
func (s *fileMemoryStore) Add(fileName string, content []byte) (string, error) {
s.mu.Lock()
defer s.mu.Unlock()
var (
id string
err error
)
// generate until unique id (try maximun 50 times)
for i := 0; i < 50; i++ {
id, err = generateID()
if err != nil {
return "", err
}
if _, ok := s.store[id]; !ok {
break
}
}
if err != nil {
return "", err
}
s.store[id] = file.NewMemFile(fileName, content)
return id, err
}
func (s *fileMemoryStore) Remove(fileID string) bool {
s.mu.Lock()
defer s.mu.Unlock()
_, ok := s.store[fileID]
delete(s.store, fileID)
return ok
}
func (s *fileMemoryStore) Get(fileID string) file.File {
s.mu.RLock()
defer s.mu.RUnlock()
f := s.store[fileID]
return f
}
func (s *fileMemoryStore) List() []string {
s.mu.RLock()
defer s.mu.RUnlock()
var b []string
for n := range s.store {
b = append(b, n)
}
return b
}