From 6f6908573ed3dd3615b6b7d1e33bf01a574d6ed6 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Thu, 22 Apr 2021 10:39:24 +0200 Subject: [PATCH] Add DB interface --- README.md | 2 +- db.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 ++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 db.go diff --git a/README.md b/README.md index b951dd6..a83cf1d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Go 1.16 or higher is required `go get -u github.com/HimbeerserverDE/multiserver` ## How to use -**Note: The authentication databases of the minetest servers need to be deleted before multiserver can connect to them. You can convert minetest auth databases to the multiserver auth database scheme with [multiserver_converter](https://github.com/HimbeerserverDE/multiserver_converter).** +**Note: The authentication databases of the minetest servers need to be deleted before multiserver can connect to them. You can convert minetest auth databases to the multiserver auth database schema with [multiserver_converter](https://github.com/HimbeerserverDE/multiserver_converter).** ### Running The `go get` command will create an executable file in `~/go/bin/multiserver`. diff --git a/db.go b/db.go new file mode 100644 index 0000000..545411b --- /dev/null +++ b/db.go @@ -0,0 +1,54 @@ +package main + +import ( + "database/sql" + "fmt" + "os" + + _ "github.com/lib/pq" + _ "github.com/mattn/go-sqlite3" +) + +type DB struct { + *sql.DB +} + +// OpenSQLite3 opens and returns a SQLite3 database +func OpenSQLite3(name, initSQL string) (*DB, error) { + os.Mkdir("storage", 0777) + + db, err := sql.Open("sqlite3", "storage/"+name) + if err != nil { + return nil, err + } + + if _, err := db.Exec(initSQL); err != nil { + db.Close() + return nil, err + } + + return &DB{DB: db}, nil +} + +// OpenPSQL opens and returns a PostgreSQL database +func OpenPSQL(host, name, user, password string, port uint16) (*DB, error) { + psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, name) + + db, err := sql.Open("postgres", psqlconn) + if err != nil { + return nil, err + } + + err = db.Ping() + if err != nil { + db.Close() + return nil, err + } + + return &DB{DB: db}, nil +} + +// Query executes a SQL statement and stores the results +func (db *DB) QueryRow(sql string, values []interface{}, results ...interface{}) error { + return db.DB.QueryRow(sql, values...).Scan(results...) +} diff --git a/go.mod b/go.mod index d42d87c..3ae504b 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/HimbeerserverDE/srp v0.0.0-20210331172529-2b5dbec6b82b github.com/anon55555/mt v0.0.0-20210401173148-4c2536cce54b + github.com/lib/pq v1.10.1 github.com/mattn/go-sqlite3 v1.14.6 github.com/tncardoso/gocurses v0.0.0-20170428215319-6c1f6d2854e2 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index fa729fa..e8f28a2 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/HimbeerserverDE/srp v0.0.0-20210331172529-2b5dbec6b82b h1:xqNC1S76U5U github.com/HimbeerserverDE/srp v0.0.0-20210331172529-2b5dbec6b82b/go.mod h1:pxNH8S2nh4n2DWE0ToX5GnnDr/uEAuaAhJsCpkDLIWw= github.com/anon55555/mt v0.0.0-20210401173148-4c2536cce54b h1:gyTxjlQCBIC7rVN2n6fAvz4sRXpOFMSIaw57r9ccJnA= github.com/anon55555/mt v0.0.0-20210401173148-4c2536cce54b/go.mod h1:jH4ER+ahjl7H6TczzK+q4V9sXY++U2Geh6/vt3r4Xvs= +github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo= +github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/tncardoso/gocurses v0.0.0-20170428215319-6c1f6d2854e2 h1:wAHqYwDeXe0nIJnz9dqSmBGiaoqBDCRBhV/ebefJe30=