mapserver/tiledb/tiledb.go
2019-06-13 08:04:32 +02:00

85 lines
1.5 KiB
Go

package tiledb
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus"
"io/ioutil"
"mapserver/coords"
"os"
"strconv"
"sync"
)
var mutex = &sync.RWMutex{}
func New(path string) (*TileDB, error) {
return &TileDB{
path: path,
}, nil
}
type TileDB struct {
path string
}
func (this *TileDB) getDirAndFile(pos *coords.TileCoords) (string, string) {
dir := this.path + "/" +
strconv.Itoa(pos.LayerId) + "/" +
strconv.Itoa(pos.Zoom) + "/" +
strconv.Itoa(pos.X)
file := dir + "/" + strconv.Itoa(pos.Y) + ".png"
return dir, file
}
func (this *TileDB) GC() {
//No-Op
}
func (this *TileDB) GetTile(pos *coords.TileCoords) ([]byte, error) {
timer := prometheus.NewTimer(tiledbLoadDuration)
defer timer.ObserveDuration()
mutex.RLock()
defer mutex.RUnlock()
fields := logrus.Fields{
"pos": pos,
}
log.WithFields(fields).Debug("GetTile")
_, file := this.getDirAndFile(pos)
info, _ := os.Stat(file)
if info != nil {
content, err := ioutil.ReadFile(file)
if err != nil {
panic(err)
}
return content, err
}
return nil, nil
}
func (this *TileDB) SetTile(pos *coords.TileCoords, tile []byte) error {
timer := prometheus.NewTimer(tiledbSaveDuration)
defer timer.ObserveDuration()
mutex.Lock()
defer mutex.Unlock()
fields := logrus.Fields{
"pos": pos,
"size": len(tile),
}
log.WithFields(fields).Debug("SetTile")
dir, file := this.getDirAndFile(pos)
os.MkdirAll(dir, 0700)
err := ioutil.WriteFile(file, tile, 0644)
return err
}