forked from MTSR/mapserver
restructure map object db
This commit is contained in:
parent
9314c82114
commit
87cda39a1a
@ -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")
|
||||
|
||||
}
|
||||
|
||||
|
11
server/mapobjectdb/sqlite/logger.go
Normal file
11
server/mapobjectdb/sqlite/logger.go
Normal 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"})
|
||||
}
|
@ -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,
|
@ -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",
|
@ -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
|
@ -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)
|
90
server/mapobjectdb/sqlite/sql.go
Normal file
90
server/mapobjectdb/sqlite/sql.go
Normal 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 = ?
|
||||
`
|
@ -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)
|
@ -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{
|
||||
|
Loading…
x
Reference in New Issue
Block a user