diff options
| author | Paul Buetow <paul@buetow.org> | 2024-05-16 00:27:56 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-05-16 00:27:56 +0300 |
| commit | 4057c17487a6713adccad61da8a3a58a0863db37 (patch) | |
| tree | a9c76042095d9a7fd1ed9a6c0bbd9e31ae2f57ae /internal/server/repository | |
| parent | 51ebb1e131818f9b23dd25dea5be841a90476d50 (diff) | |
more on merge support
Diffstat (limited to 'internal/server/repository')
| -rw-r--r-- | internal/server/repository/repository.go | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index 7eb7122..4146526 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -11,23 +11,35 @@ import ( "codeberg.org/snonux/gos/internal/types" ) +var ( + instance Repository + once sync.Once +) + +// Contains an Entry ID and its checksumm, for the list and merge operations. +type EntryPair struct { + ID, Checksum string +} + type Repository struct { dataDir string entries map[string]types.Entry mu *sync.Mutex } -func New(dataDir string) Repository { - return Repository{ - dataDir: dataDir, - entries: make(map[string]types.Entry), - mu: &sync.Mutex{}, - } +func Instance(dataDir string) Repository { + once.Do(func() { + instance.dataDir = dataDir + instance.entries = make(map[string]types.Entry) + instance.mu = &sync.Mutex{} + }) + return instance } func (r Repository) store(entry types.Entry) { r.mu.Lock() defer r.mu.Unlock() + r.entries[entry.ID] = entry } @@ -60,17 +72,37 @@ func (r Repository) List() ([]byte, error) { return []byte{}, err } - type pair struct { - ID, Checksum string - } - - var pairs []pair + var pairs []EntryPair r.mu.Lock() defer r.mu.Unlock() for _, entry := range r.entries { - pairs = append(pairs, pair{entry.ID, entry.Checksum()}) + pairs = append(pairs, EntryPair{entry.ID, entry.Checksum()}) } return json.Marshal(pairs) } + +func (r Repository) HasEntry(pair EntryPair) bool { + r.mu.Lock() + defer r.mu.Unlock() + + ent, ok := r.entries[pair.ID] + if !ok || ent.Checksum() != pair.Checksum { + return false + } + return true +} + +func (r Repository) Merge(new types.Entry) { + r.mu.Lock() + defer r.mu.Unlock() + + old, ok := r.entries[new.ID] + if !ok { + r.entries[new.ID] = new + return + } + + r.entries[new.ID] = old.Update(new) +} |
