mirror of
https://github.com/la5nta/pat
synced 2026-08-13 17:46:54 -04:00
62 lines
1 KiB
Go
62 lines
1 KiB
Go
package forms
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
type Sequence struct {
|
|
f *os.File
|
|
err error
|
|
}
|
|
|
|
func OpenSequence(path string) Sequence {
|
|
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0o644)
|
|
return Sequence{f, err}
|
|
}
|
|
|
|
func (s Sequence) Close() error {
|
|
if s.err != nil {
|
|
return s.err
|
|
}
|
|
return s.f.Close()
|
|
}
|
|
|
|
func (s Sequence) Load() (int64, error) {
|
|
if s.err != nil {
|
|
return 0, s.err
|
|
}
|
|
if _, err := s.f.Seek(0, io.SeekStart); err != nil {
|
|
return 0, err
|
|
}
|
|
var seq int64
|
|
if err := json.NewDecoder(s.f).Decode(&seq); err != nil {
|
|
if err != io.EOF {
|
|
return 0, err
|
|
}
|
|
}
|
|
return seq, nil
|
|
}
|
|
|
|
func (s Sequence) Set(seq int64) (int64, error) {
|
|
if s.err != nil {
|
|
return 0, s.err
|
|
}
|
|
if err := s.f.Truncate(0); err != nil {
|
|
return 0, err
|
|
}
|
|
if _, err := s.f.Seek(0, io.SeekStart); err != nil {
|
|
return 0, err
|
|
}
|
|
defer s.f.Sync()
|
|
return seq, json.NewEncoder(s.f).Encode(&seq)
|
|
}
|
|
|
|
func (s Sequence) Incr(increment int64) (int64, error) {
|
|
seq, err := s.Load()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return s.Set(seq + increment)
|
|
}
|