aboutsummaryrefslogtreecommitdiff
path: root/yamldb/yamldb.go
diff options
context:
space:
mode:
Diffstat (limited to 'yamldb/yamldb.go')
-rw-r--r--yamldb/yamldb.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/yamldb/yamldb.go b/yamldb/yamldb.go
new file mode 100644
index 0000000..eec23be
--- /dev/null
+++ b/yamldb/yamldb.go
@@ -0,0 +1,47 @@
+package yamldb
+
+import (
+ "github.com/pkg/errors"
+ "io/ioutil"
+ "os"
+ "sync"
+
+ log "github.com/sirupsen/logrus"
+)
+
+// YamlDB represents a YAML file database instance
+type YamlDB struct {
+ Path string
+ PathNew string
+ lock sync.Mutex
+}
+
+// Transaction executes the given callback and safely saves
+// the data after they are modified within the callback
+func (db *YamlDB) Transaction(callback func(), marshaller func() ([]byte, error)) error {
+ var err error
+
+ log.Debug("Enter transaction")
+ db.lock.Lock()
+ defer func() {
+ db.lock.Unlock()
+ log.Debug("Exit transaction")
+ }()
+
+ callback()
+
+ yamlData, err := marshaller()
+ if err != nil {
+ return errors.Wrap(err, "Data marshalling error")
+ }
+ err = ioutil.WriteFile(db.PathNew, yamlData, 0644)
+ if err != nil {
+ return errors.Wrap(err, "YamlDB write failure")
+ }
+ err = os.Rename(db.PathNew, db.Path)
+ if err != nil {
+ return errors.Wrap(err, "Couldn't rewrite an old YamlDB file")
+ }
+
+ return nil
+}