go-judge/filestore/file_memory.go
2021-03-19 00:28:11 -07:00

73 lines
1.3 KiB
Go

package filestore
import (
"bytes"
"sync"
"github.com/criyle/go-judge/envexec"
)
type fileMemoryStore struct {
store map[string]fileMemory
mu sync.RWMutex
}
type fileMemory struct {
name string
content []byte
}
// NewFileMemoryStore create new memory file store
func NewFileMemoryStore() FileStore {
return &fileMemoryStore{
store: make(map[string]fileMemory),
}
}
func (s *fileMemoryStore) Add(name string, content []byte) (string, error) {
s.mu.Lock()
defer s.mu.Unlock()
id, err := generateUniqueID(func(id string) (bool, error) {
_, ok := s.store[id]
return ok, nil
})
if err != nil {
return "", err
}
s.store[id] = fileMemory{name: name, content: 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) (string, envexec.File) {
s.mu.RLock()
defer s.mu.RUnlock()
f, ok := s.store[fileID]
if !ok {
return "", nil
}
return f.name, envexec.NewFileReader(bytes.NewReader(f.content), false)
}
func (s *fileMemoryStore) List() []string {
s.mu.RLock()
defer s.mu.RUnlock()
b := make([]string, 0, len(s.store))
for n := range s.store {
b = append(b, n)
}
return b
}