mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
74 lines
1.2 KiB
Go
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
|
|
}
|