diff --git a/server/app/setup.go b/server/app/setup.go index d2cb62d..0ab31e8 100644 --- a/server/app/setup.go +++ b/server/app/setup.go @@ -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") } diff --git a/server/mapobjectdb/sqlite/logger.go b/server/mapobjectdb/sqlite/logger.go new file mode 100644 index 0000000..ad1a5e9 --- /dev/null +++ b/server/mapobjectdb/sqlite/logger.go @@ -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"}) +} diff --git a/server/mapobjectdb/sqlite_mapobjects.go b/server/mapobjectdb/sqlite/mapobjects.go similarity index 61% rename from server/mapobjectdb/sqlite_mapobjects.go rename to server/mapobjectdb/sqlite/mapobjects.go index 9150ca4..faa5978 100644 --- a/server/mapobjectdb/sqlite_mapobjects.go +++ b/server/mapobjectdb/sqlite/mapobjects.go @@ -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, diff --git a/server/mapobjectdb/sqlite_test.go b/server/mapobjectdb/sqlite/mapobjects_test.go similarity index 87% rename from server/mapobjectdb/sqlite_test.go rename to server/mapobjectdb/sqlite/mapobjects_test.go index 96f874e..6a33bcc 100644 --- a/server/mapobjectdb/sqlite_test.go +++ b/server/mapobjectdb/sqlite/mapobjects_test.go @@ -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", diff --git a/server/mapobjectdb/sqlite_migrate.go b/server/mapobjectdb/sqlite/migrate.go similarity index 52% rename from server/mapobjectdb/sqlite_migrate.go rename to server/mapobjectdb/sqlite/migrate.go index 7161866..1ebc9f9 100644 --- a/server/mapobjectdb/sqlite_migrate.go +++ b/server/mapobjectdb/sqlite/migrate.go @@ -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 diff --git a/server/mapobjectdb/sqlite_new.go b/server/mapobjectdb/sqlite/new.go similarity index 77% rename from server/mapobjectdb/sqlite_new.go rename to server/mapobjectdb/sqlite/new.go index c91f4af..11acbe9 100644 --- a/server/mapobjectdb/sqlite_new.go +++ b/server/mapobjectdb/sqlite/new.go @@ -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) diff --git a/server/mapobjectdb/sqlite/sql.go b/server/mapobjectdb/sqlite/sql.go new file mode 100644 index 0000000..b0134b8 --- /dev/null +++ b/server/mapobjectdb/sqlite/sql.go @@ -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 = ? +` diff --git a/server/mapobjectdb/sqlite_tiles.go b/server/mapobjectdb/sqlite/tiles.go similarity index 60% rename from server/mapobjectdb/sqlite_tiles.go rename to server/mapobjectdb/sqlite/tiles.go index f8d8d87..ae502f6 100644 --- a/server/mapobjectdb/sqlite_tiles.go +++ b/server/mapobjectdb/sqlite/tiles.go @@ -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) diff --git a/server/tilerenderer/renderer_test.go b/server/tilerenderer/renderer_test.go index a732460..3e64b20 100644 --- a/server/tilerenderer/renderer_test.go +++ b/server/tilerenderer/renderer_test.go @@ -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{