restructure map object db

This commit is contained in:
NatureFreshMilk 2019-02-05 13:25:01 +01:00
parent 9314c82114
commit 87cda39a1a
9 changed files with 128 additions and 102 deletions

View File

@ -6,7 +6,7 @@ import (
"mapserver/eventbus"
"mapserver/mapblockaccessor"
"mapserver/mapblockrenderer"
"mapserver/mapobjectdb"
sqliteobjdb "mapserver/mapobjectdb/sqlite"
"mapserver/params"
"mapserver/tilerenderer"
"mapserver/worldconfig"
@ -62,7 +62,7 @@ func Setup(p params.ParamsType, cfg *Config) *App {
//TODO: Psql connection
} else {
a.Objectdb, err = mapobjectdb.NewSqliteAccessor("mapserver.sqlite")
a.Objectdb, err = sqliteobjdb.New("mapserver.sqlite")
}

View File

@ -0,0 +1,11 @@
package sqlite
import (
"github.com/sirupsen/logrus"
)
var log *logrus.Entry
func init() {
log = logrus.WithFields(logrus.Fields{"prefix": "mapobjectdb.sqlite"})
}

View File

@ -1,23 +1,12 @@
package mapobjectdb
package sqlite
import (
"mapserver/coords"
"mapserver/mapobjectdb"
)
const getMapDataPosQuery = `
select o.id, o.type, o.mtime,
o.x, o.y, o.z,
o.posx, o.posy, o.posz,
oa.key, oa.value
from objects o
left join object_attributes oa on o.id = oa.objectid
where o.type = ?
and o.posx >= ? and o.posy >= ? and o.posz >= ?
and o.posx <= ? and o.posy <= ? and o.posz <= ?
order by o.id
`
func (db *Sqlite3Accessor) GetMapData(q SearchQuery) ([]*MapObject, error) {
func (db *Sqlite3Accessor) GetMapData(q mapobjectdb.SearchQuery) ([]*mapobjectdb.MapObject, error) {
rows, err := db.db.Query(getMapDataPosQuery,
q.Type,
q.Pos1.X, q.Pos1.Y, q.Pos1.Z,
@ -30,8 +19,8 @@ func (db *Sqlite3Accessor) GetMapData(q SearchQuery) ([]*MapObject, error) {
defer rows.Close()
result := make([]*MapObject, 0)
var currentObj *MapObject
result := make([]*mapobjectdb.MapObject, 0)
var currentObj *mapobjectdb.MapObject
var currentId *int64
for rows.Next() {
@ -53,7 +42,7 @@ func (db *Sqlite3Accessor) GetMapData(q SearchQuery) ([]*MapObject, error) {
if currentId == nil || *currentId != id {
pos := coords.NewMapBlockCoords(posx, posy, posz)
mo := NewMapObject(
mo := mapobjectdb.NewMapObject(
&pos,
x, y, z,
Type,
@ -72,28 +61,13 @@ func (db *Sqlite3Accessor) GetMapData(q SearchQuery) ([]*MapObject, error) {
return result, nil
}
const removeMapDataQuery = `
delete from objects where posx = ? and posy = ? and posz = ?
`
func (db *Sqlite3Accessor) RemoveMapData(pos *coords.MapBlockCoords) error {
_, err := db.db.Exec(removeMapDataQuery, pos.X, pos.Y, pos.Z)
return err
}
const addMapDataQuery = `
insert into
objects(x,y,z,posx,posy,posz,type,mtime)
values(?, ?, ?, ?, ?, ?, ?, ?)
`
const addMapDataAttributeQuery = `
insert into
object_attributes(objectid, key, value)
values(?, ?, ?)
`
func (db *Sqlite3Accessor) AddMapData(data *MapObject) error {
func (db *Sqlite3Accessor) AddMapData(data *mapobjectdb.MapObject) error {
res, err := db.db.Exec(addMapDataQuery,
data.X, data.Y, data.Z,
data.MBPos.X, data.MBPos.Y, data.MBPos.Z,

View File

@ -1,8 +1,9 @@
package mapobjectdb
package sqlite
import (
"fmt"
"io/ioutil"
"mapserver/mapobjectdb"
"mapserver/coords"
"os"
"testing"
@ -15,7 +16,7 @@ func TestMigrate(t *testing.T) {
}
defer os.Remove(tmpfile.Name())
db, err := NewSqliteAccessor(tmpfile.Name())
db, err := New(tmpfile.Name())
if err != nil {
panic(err)
}
@ -36,7 +37,7 @@ func TestMigrate(t *testing.T) {
}
data := []byte{0x01, 0x02}
tile2 := Tile{Pos: pos, Data: data}
tile2 := mapobjectdb.Tile{Pos: pos, Data: data}
err = db.SetTile(&tile2)
if err != nil {
@ -72,7 +73,7 @@ func TestMapObjects(t *testing.T) {
}
//defer os.Remove(tmpfile.Name())
db, err := NewSqliteAccessor(tmpfile.Name())
db, err := New(tmpfile.Name())
if err != nil {
panic(err)
}
@ -87,7 +88,7 @@ func TestMapObjects(t *testing.T) {
pos := coords.NewMapBlockCoords(0, 0, 0)
o := MapObject{
o := mapobjectdb.MapObject{
MBPos: &pos,
X: 1,
Y: 2,
@ -102,7 +103,7 @@ func TestMapObjects(t *testing.T) {
panic(err)
}
q := SearchQuery{
q := mapobjectdb.SearchQuery{
Pos1: pos,
Pos2: pos,
Type: "xy",

View File

@ -1,4 +1,4 @@
package mapobjectdb
package sqlite
import (
"database/sql"
@ -7,43 +7,6 @@ import (
"time"
)
const migrateScript = `
PRAGMA foreign_keys = ON;
create table if not exists objects(
id integer primary key autoincrement,
x int,
y int,
z int,
posx int,
posy int,
posz int,
type varchar,
mtime bigint
);
create index if not exists objects_pos on objects(posx,posy,posz);
create index if not exists objects_pos_type on objects(posx,posy,posz,type);
create table if not exists object_attributes(
objectid integer not null,
key varchar not null,
value varchar not null,
FOREIGN KEY (objectid) references objects(id) ON DELETE CASCADE
primary key(objectid, key)
);
create table if not exists tiles(
data blob,
mtime bigint,
layerid int,
x int,
y int,
zoom int,
primary key(x,y,zoom,layerid)
);
`
type Sqlite3Accessor struct {
db *sql.DB
filename string

View File

@ -1,11 +1,11 @@
package mapobjectdb
package sqlite
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
func NewSqliteAccessor(filename string) (*Sqlite3Accessor, error) {
func New(filename string) (*Sqlite3Accessor, error) {
//TODO: flag/config for unsafe db access
db, err := sql.Open("sqlite3", filename+"?_timeout=500")
db.SetMaxOpenConns(1)

View File

@ -0,0 +1,90 @@
package sqlite
const migrateScript = `
PRAGMA foreign_keys = ON;
create table if not exists objects(
id integer primary key autoincrement,
x int,
y int,
z int,
posx int,
posy int,
posz int,
type varchar,
mtime bigint
);
create index if not exists objects_pos on objects(posx,posy,posz);
create index if not exists objects_pos_type on objects(posx,posy,posz,type);
create table if not exists object_attributes(
objectid integer not null,
key varchar not null,
value varchar not null,
FOREIGN KEY (objectid) references objects(id) ON DELETE CASCADE
primary key(objectid, key)
);
create table if not exists tiles(
data blob,
mtime bigint,
layerid int,
x int,
y int,
zoom int,
primary key(x,y,zoom,layerid)
);
`
const getMapDataPosQuery = `
select o.id, o.type, o.mtime,
o.x, o.y, o.z,
o.posx, o.posy, o.posz,
oa.key, oa.value
from objects o
left join object_attributes oa on o.id = oa.objectid
where o.type = ?
and o.posx >= ? and o.posy >= ? and o.posz >= ?
and o.posx <= ? and o.posy <= ? and o.posz <= ?
order by o.id
`
const removeMapDataQuery = `
delete from objects where posx = ? and posy = ? and posz = ?
`
const addMapDataQuery = `
insert into
objects(x,y,z,posx,posy,posz,type,mtime)
values(?, ?, ?, ?, ?, ?, ?, ?)
`
const addMapDataAttributeQuery = `
insert into
object_attributes(objectid, key, value)
values(?, ?, ?)
`
const getTileQuery = `
select data,mtime from tiles t
where t.layerid = ?
and t.x = ?
and t.y = ?
and t.zoom = ?
`
const setTileQuery = `
insert or replace into tiles(x,y,zoom,layerid,data,mtime)
values(?, ?, ?, ?, ?, ?)
`
const removeTileQuery = `
delete from tiles
where x = ? and y = ? and zoom = ? and layerid = ?
`

View File

@ -1,18 +1,12 @@
package mapobjectdb
package sqlite
import (
"mapserver/coords"
"mapserver/mapobjectdb"
)
const getTileQuery = `
select data,mtime from tiles t
where t.layerid = ?
and t.x = ?
and t.y = ?
and t.zoom = ?
`
func (db *Sqlite3Accessor) GetTile(pos *coords.TileCoords) (*Tile, error) {
func (db *Sqlite3Accessor) GetTile(pos *coords.TileCoords) (*mapobjectdb.Tile, error) {
rows, err := db.db.Query(getTileQuery, pos.LayerId, pos.X, pos.Y, pos.Zoom)
if err != nil {
return nil, err
@ -33,7 +27,7 @@ func (db *Sqlite3Accessor) GetTile(pos *coords.TileCoords) (*Tile, error) {
return nil, nil
}
mb := Tile{
mb := mapobjectdb.Tile{
Pos: pos,
Data: data,
Mtime: mtime,
@ -45,20 +39,13 @@ func (db *Sqlite3Accessor) GetTile(pos *coords.TileCoords) (*Tile, error) {
return nil, nil
}
const setTileQuery = `
insert or replace into tiles(x,y,zoom,layerid,data,mtime)
values(?, ?, ?, ?, ?, ?)
`
func (db *Sqlite3Accessor) SetTile(tile *Tile) error {
func (db *Sqlite3Accessor) SetTile(tile *mapobjectdb.Tile) error {
_, err := db.db.Exec(setTileQuery, tile.Pos.X, tile.Pos.Y, tile.Pos.Zoom, tile.Pos.LayerId, tile.Data, tile.Mtime)
return err
}
const removeTileQuery = `
delete from tiles
where x = ? and y = ? and zoom = ? and layerid = ?
`
func (db *Sqlite3Accessor) RemoveTile(pos *coords.TileCoords) error {
_, err := db.db.Exec(removeTileQuery, pos.X, pos.Y, pos.Zoom, pos.LayerId)

View File

@ -9,7 +9,7 @@ import (
"mapserver/layer"
"mapserver/mapblockaccessor"
"mapserver/mapblockrenderer"
"mapserver/mapobjectdb"
sqliteobjdb "mapserver/mapobjectdb/sqlite"
"mapserver/testutils"
"os"
"testing"
@ -50,7 +50,7 @@ func TestTileRender(t *testing.T) {
tiletmpfile, err := ioutil.TempFile("", "TestTileRenderTiles.*.sqlite")
defer os.Remove(tiletmpfile.Name())
tdb, _ := mapobjectdb.NewSqliteAccessor(tiletmpfile.Name())
tdb, _ := sqliteobjdb.New(tiletmpfile.Name())
tdb.Migrate()
layers := []layer.Layer{