|
|
|
@ -25,23 +25,56 @@ import (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type BlockRepository interface {
|
|
|
|
|
Save(block Block) error
|
|
|
|
|
Save(id string, block Block) error
|
|
|
|
|
Load(id string) (Block, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type blockSaveMessage struct {
|
|
|
|
|
id string
|
|
|
|
|
block Block
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type blockRepo struct {
|
|
|
|
|
dirname string
|
|
|
|
|
saveC chan blockSaveMessage
|
|
|
|
|
errC chan error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (br *blockRepo) Save(id string, block Block) error {
|
|
|
|
|
f, err := os.OpenFile(filepath.Join(br.dirname, BlocksDirectory, id), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
|
|
|
|
|
defer f.Close()
|
|
|
|
|
func saveBlock(dirname, id string, block Block) error {
|
|
|
|
|
f, err := os.OpenFile(filepath.Join(dirname, BlocksDirectory, id), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer f.Close()
|
|
|
|
|
enc := json.NewEncoder(f)
|
|
|
|
|
enc.SetIndent("", " ")
|
|
|
|
|
return enc.Encode(&block)
|
|
|
|
|
err = enc.Encode(&block)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewBlockRepo(dirname string) BlockRepository {
|
|
|
|
|
saveC := make(chan blockSaveMessage, 1)
|
|
|
|
|
errC := make(chan error)
|
|
|
|
|
go func() {
|
|
|
|
|
for msg := range saveC {
|
|
|
|
|
err := saveBlock(dirname, msg.id, msg.block)
|
|
|
|
|
errC <- err
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
return &blockRepo{
|
|
|
|
|
dirname: dirname,
|
|
|
|
|
saveC: saveC,
|
|
|
|
|
errC: errC,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (br *blockRepo) Save(id string, block Block) error {
|
|
|
|
|
br.saveC <- blockSaveMessage{id, block}
|
|
|
|
|
err := <-br.errC
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (br *blockRepo) Load(id string) (Block, error) {
|
|
|
|
|