From 0e169d2b45a26ae413c7e148753d5c608a448f28 Mon Sep 17 00:00:00 2001 From: NatureFreshMilk Date: Thu, 14 Feb 2019 08:34:16 +0100 Subject: [PATCH] sqlite impl --- server/app/config.go | 6 ++-- server/coords/convert.go | 2 ++ server/coords/convert_test.go | 10 +++++++ server/db/accessor.go | 1 + server/db/postgres/postgres.go | 4 ++- server/db/sqlite/initialblocks.go | 37 +++++++++++++++---------- server/layer/layer.go | 18 ++++++++++++ server/mapblockaccessor/legacyblocks.go | 5 ++-- 8 files changed, 61 insertions(+), 22 deletions(-) diff --git a/server/app/config.go b/server/app/config.go index e2184c5..f196252 100644 --- a/server/app/config.go +++ b/server/app/config.go @@ -15,7 +15,7 @@ type Config struct { EnableRendering bool `json:"enablerendering"` Webdev bool `json:"webdev"` WebApi *WebApiConfig `json:"webapi"` - Layers []layer.Layer `json:"layers"` + Layers []*layer.Layer `json:"layers"` RenderingFetchLimit int `json:"renderingfetchlimit"` RenderingJobs int `json:"renderingjobs"` RenderingQueue int `json:"renderingqueue"` @@ -69,8 +69,8 @@ func ParseConfig(filename string) (*Config, error) { SecretKey: RandStringRunes(16), } - layers := []layer.Layer{ - layer.Layer{ + layers := []*layer.Layer{ + &layer.Layer{ Id: 0, Name: "Base", From: -16, diff --git a/server/coords/convert.go b/server/coords/convert.go index c96f9a7..c7a11c6 100644 --- a/server/coords/convert.go +++ b/server/coords/convert.go @@ -7,6 +7,8 @@ const ( maxPositive = modulo / 2 minValue = -1 << (numBitsPerComponent - 1) maxValue = 1<<(numBitsPerComponent-1) - 1 + + MinPlainCoord = -34351347711 ) func CoordToPlain(c *MapBlockCoords) int64 { diff --git a/server/coords/convert_test.go b/server/coords/convert_test.go index d1b31ba..831dfcd 100644 --- a/server/coords/convert_test.go +++ b/server/coords/convert_test.go @@ -12,6 +12,16 @@ func init() { log = logrus.WithFields(logrus.Fields{"prefix": "coords/convert_test"}) } +func TestMinCoord(t *testing.T){ + c := NewMapBlockCoords(MinCoord, MinCoord, MinCoord) + pc := CoordToPlain(c) + + log.WithFields(logrus.Fields{"coords": c, "plain": pc}).Info("TestMinCoord") + if pc != MinPlainCoord { + t.Fatal("no min match") + } +} + func testCoordConvert(t *testing.T, mb *MapBlockCoords) { log.WithFields(logrus.Fields{"coords": mb}).Info("MapblockCoords") diff --git a/server/db/accessor.go b/server/db/accessor.go index 8ffef70..084f454 100644 --- a/server/db/accessor.go +++ b/server/db/accessor.go @@ -14,6 +14,7 @@ type Block struct { type InitialBlocksResult struct { List []*Block + UnfilteredCount int HasMore bool } diff --git a/server/db/postgres/postgres.go b/server/db/postgres/postgres.go index 40f428b..99a3bd7 100644 --- a/server/db/postgres/postgres.go +++ b/server/db/postgres/postgres.go @@ -3,6 +3,8 @@ package postgres import ( "database/sql" "mapserver/coords" + "mapserver/settings" + "mapserver/layer" "mapserver/db" "time" @@ -68,7 +70,7 @@ func (this *PostgresAccessor) FindBlocksByMtime(gtmtime int64, limit int) ([]*db return blocks, nil } -func (this *PostgresAccessor) FindNextInitialBlocks(lastpos *coords.MapBlockCoords, limit int) (*db.InitialBlocksResult, error) { +func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*db.InitialBlocksResult, error) { return nil, nil } diff --git a/server/db/sqlite/initialblocks.go b/server/db/sqlite/initialblocks.go index c966989..55623ee 100644 --- a/server/db/sqlite/initialblocks.go +++ b/server/db/sqlite/initialblocks.go @@ -5,39 +5,41 @@ import ( "mapserver/coords" "mapserver/db" "mapserver/settings" + "mapserver/layer" +) + +const ( + SETTING_LAST_POS = "last_pos" ) const getLastBlockQuery = ` select pos,data,mtime from blocks b where b.mtime = 0 -and b.pos > ? +and b.pos >= ? order by b.pos asc, b.mtime asc limit ? ` -func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers []layer.Layer, limit int) (*db.InitialBlocksResult, error) { +func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*db.InitialBlocksResult, error) { result := &db.InitialBlocksResult{} blocks := make([]*db.Block, 0) - lastx := s.GetInt(settings.SETTING_LASTX, coords.MinCoord-1) - lasty := s.GetInt(settings.SETTING_LASTY, coords.MinCoord-1) - lastz := s.GetInt(settings.SETTING_LASTZ, coords.MinCoord-1) - - lastcoords := coords.NewMapBlockCoords(lastx, lasty, lastz) - pc := coords.CoordToPlain(lastpos) + lastpos := s.GetInt64(SETTING_LAST_POS, coords.MinPlainCoord) - rows, err := this.db.Query(getLastBlockQuery, pc, limit) + rows, err := this.db.Query(getLastBlockQuery, lastpos, limit) if err != nil { return nil, err } defer rows.Close() - var newlastpos *coords.MapBlockCoords for rows.Next() { + result.HasMore = true + result.UnfilteredCount++ + var pos int64 var data []byte var mtime int64 @@ -48,17 +50,22 @@ func (this *Sqlite3Accessor) FindNextInitialBlocks(s settings.Settings, layers [ } mb := convertRows(pos, data, mtime) - newlastpos = mb.Pos - blocks = append(blocks, mb) + // new position + lastpos = pos + + blockcoordy := mb.Pos.Y * 16 + currentlayer := layer.FindLayerByY(layers, blockcoordy) + + if currentlayer != nil { + blocks = append(blocks, mb) + } } result.List = blocks //Save current positions of initial run - s.SetInt(settings.SETTING_LASTX, newlastpos.X) - s.SetInt(settings.SETTING_LASTY, newlastpos.Y) - s.SetInt(settings.SETTING_LASTZ, newlastpos.Z) + s.SetInt64(SETTING_LAST_POS, lastpos) return result, nil } diff --git a/server/layer/layer.go b/server/layer/layer.go index 2e62fdd..adc56df 100644 --- a/server/layer/layer.go +++ b/server/layer/layer.go @@ -6,3 +6,21 @@ type Layer struct { To int `json:"to"` From int `json:"from"` } + +func FindLayerById(layers []*Layer, id int) *Layer { + for _, l := range layers { + if l.Id == id { + return l + } + } + return nil +} + +func FindLayerByY(layers []*Layer, y int) *Layer { + for _, l := range layers { + if y >= l.From && y <= l.To { + return l + } + } + return nil +} diff --git a/server/mapblockaccessor/legacyblocks.go b/server/mapblockaccessor/legacyblocks.go index 38e56d8..ab39a42 100644 --- a/server/mapblockaccessor/legacyblocks.go +++ b/server/mapblockaccessor/legacyblocks.go @@ -4,6 +4,7 @@ import ( "mapserver/coords" "mapserver/eventbus" "mapserver/layer" + "mapserver/settings" "mapserver/mapblockparser" cache "github.com/patrickmn/go-cache" @@ -12,13 +13,11 @@ import ( type FindNextLegacyBlocksResult struct { HasMore bool - LastPos *coords.MapBlockCoords - LastMtime int64 List []*mapblockparser.MapBlock UnfilteredCount int } -func (a *MapBlockAccessor) FindNextLegacyBlocks(lastpos *coords.MapBlockCoords, limit int, layerfilter []layer.Layer) (*FindNextLegacyBlocksResult, error) { +func (a *MapBlockAccessor) FindNextLegacyBlocks(s settings.Settings, layers []layer.Layer, limit int) (*FindNextLegacyBlocksResult, error) { fields := logrus.Fields{ "x": lastpos.X,