diff options
| author | horus_arch | 2015-04-19 22:09:52 +0200 |
|---|---|---|
| committer | horus_arch | 2015-04-19 22:09:52 +0200 |
| commit | 01e9a34952bd6ddd383680b0ca2312e476ad07a6 (patch) | |
| tree | 00902575e5c271cc5d35ea65aa8795b8caeb97bc /imagestore/localstore.go | |
| download | mandible-01e9a34952bd6ddd383680b0ca2312e476ad07a6.tar.gz | |
Initial commit.
Diffstat (limited to 'imagestore/localstore.go')
| -rw-r--r-- | imagestore/localstore.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/imagestore/localstore.go b/imagestore/localstore.go new file mode 100644 index 0000000..4df2931 --- /dev/null +++ b/imagestore/localstore.go @@ -0,0 +1,92 @@ +package imagestore + +import ( + "bufio" + "io" + "os" + "path" +) + +type LocalImageStore struct { + storeRoot string + namePathMapper *NamePathMapper +} + +func NewLocalImageStore(root string, mapper *NamePathMapper) *LocalImageStore { + return &LocalImageStore{ + storeRoot: root, + namePathMapper: mapper, + } +} + +func (this *LocalImageStore) Exists(obj *StoreObject) (bool, error) { + if _, err := os.Stat(this.toPath(obj)); os.IsNotExist(err) { + return false, err + } + + return true, nil +} + +func (this *LocalImageStore) Save(src string, obj *StoreObject) (*StoreObject, error) { + // open input file + fi, err := os.Open(src) + if err != nil { + return nil, err + } + + defer fi.Close() + + // make a read buffer + r := bufio.NewReader(fi) + + // open output file + this.createParent(obj) + fo, err := os.Create(this.toPath(obj)) + if err != nil { + return nil, err + } + + defer fo.Close() + + // make a write buffer + w := bufio.NewWriter(fo) + + // make a buffer to keep chunks that are read + buf := make([]byte, 1024) + for { + // read a chunk + n, err := r.Read(buf) + if err != nil && err != io.EOF { + return nil, err + } + + if n == 0 { + break + } + + // write a chunk + if _, err := w.Write(buf[:n]); err != nil { + return nil, err + } + } + + if err = w.Flush(); err != nil { + return nil, err + } + + obj.Url = this.toPath(obj) + obj.Url = stripPath(obj.Url) + return obj, nil +} + +func (this *LocalImageStore) createParent(obj *StoreObject) { + path := path.Dir(this.toPath(obj)) + + if _, err := os.Stat(path); os.IsNotExist(err) { + os.MkdirAll(path, 0777) + } +} + +func (this *LocalImageStore) toPath(obj *StoreObject) string { + return this.storeRoot + "/" + this.namePathMapper.mapToPath(obj) +} |
