From 13aade9bccad714493815e96087c8d7c03af994a Mon Sep 17 00:00:00 2001
From: Thomas Rudin <thomas@rudin.io>
Date: Sat, 9 Feb 2019 18:54:26 +0100
Subject: [PATCH] postgres wip

---
 server/app/setup.go            |  8 ++++++++
 server/db/postgres/logger.go   | 11 +++++++++++
 server/db/postgres/postgres.go | 33 ++++++++++++++++++++++++++++++---
 3 files changed, 49 insertions(+), 3 deletions(-)
 create mode 100644 server/db/postgres/logger.go

diff --git a/server/app/setup.go b/server/app/setup.go
index 83add34..b32bda7 100644
--- a/server/app/setup.go
+++ b/server/app/setup.go
@@ -2,6 +2,7 @@ package app
 
 import (
 	"mapserver/colormapping"
+	"mapserver/db/postgres"
 	"mapserver/db/sqlite"
 	"mapserver/eventbus"
 	"mapserver/mapblockaccessor"
@@ -39,6 +40,13 @@ func Setup(p params.ParamsType, cfg *Config) *App {
 		if err != nil {
 			panic(err)
 		}
+
+	case worldconfig.BACKEND_POSTGRES:
+		a.Blockdb, err = postgres.New(a.Worldconfig[worldconfig.CONFIG_PSQL_CONNECTION])
+		if err != nil {
+			panic(err)
+		}
+
 	default:
 		panic(errors.New("map-backend not supported: " + a.Worldconfig[worldconfig.CONFIG_BACKEND]))
 	}
diff --git a/server/db/postgres/logger.go b/server/db/postgres/logger.go
new file mode 100644
index 0000000..731fe64
--- /dev/null
+++ b/server/db/postgres/logger.go
@@ -0,0 +1,11 @@
+package postgres
+
+import (
+	"github.com/sirupsen/logrus"
+)
+
+var log *logrus.Entry
+
+func init() {
+	log = logrus.WithFields(logrus.Fields{"prefix": "postgres-db"})
+}
diff --git a/server/db/postgres/postgres.go b/server/db/postgres/postgres.go
index 91e6fca..634ed12 100644
--- a/server/db/postgres/postgres.go
+++ b/server/db/postgres/postgres.go
@@ -2,9 +2,12 @@ package postgres
 
 import (
 	"database/sql"
-	_ "github.com/lib/pq"
 	"mapserver/coords"
 	"mapserver/db"
+	"time"
+
+	_ "github.com/lib/pq"
+	"github.com/sirupsen/logrus"
 )
 
 type PostgresAccessor struct {
@@ -12,6 +15,24 @@ type PostgresAccessor struct {
 }
 
 func (db *PostgresAccessor) Migrate() error {
+	hasMtime := true
+	_, err := db.db.Query("select max(mtime) from blocks")
+	if err != nil {
+		hasMtime = false
+	}
+
+	if !hasMtime {
+		log.Info("Migrating database")
+		start := time.Now()
+		_, err = db.db.Exec(migrateScript)
+		if err != nil {
+			return err
+		}
+		t := time.Now()
+		elapsed := t.Sub(start)
+		log.WithFields(logrus.Fields{"elapsed": elapsed}).Info("Migration completed")
+	}
+
 	return nil
 }
 
@@ -121,6 +142,12 @@ func (this *PostgresAccessor) GetBlock(pos *coords.MapBlockCoords) (*db.Block, e
 	return nil, nil
 }
 
-func NewPostgresAccessor(connStr string) (*PostgresAccessor, error) {
-	return nil, nil
+func New(connStr string) (*PostgresAccessor, error) {
+	db, err := sql.Open("postgres", connStr)
+	if err != nil {
+		return nil, err
+	}
+
+	sq := &PostgresAccessor{db: db}
+	return sq, nil
 }