mirror of
https://github.com/thomiceli/opengist.git
synced 2026-08-07 07:14:49 +00:00
Add psql & mysql sock connection (#733)
This commit is contained in:
@@ -16,6 +16,17 @@ db-uri: mysql://root:passwd@localhost:3306/opengist_db
|
||||
OG_DB_URI=mysql://root:passwd@localhost:3306/opengist_db
|
||||
```
|
||||
|
||||
### Unix socket
|
||||
|
||||
To connect through a Unix socket instead of TCP, omit the host/port and set the `socket` query parameter to the socket path:
|
||||
|
||||
`mysql://<user>:<password>@/<database>?socket=<socket-path>`
|
||||
|
||||
```yaml
|
||||
# Example
|
||||
db-uri: mysql://root:passwd@/opengist_db?socket=/var/run/mysqld/mysqld.sock
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
```yml
|
||||
services:
|
||||
|
||||
@@ -16,6 +16,17 @@ db-uri: postgres://postgres:passwd@localhost:5432/opengist_db
|
||||
OG_DB_URI=postgres://postgres:passwd@localhost:5432/opengist_db
|
||||
```
|
||||
|
||||
### Unix socket
|
||||
|
||||
To connect through a Unix socket instead of TCP, omit the host/port and set the `socket` query parameter to the directory containing the socket:
|
||||
|
||||
`postgres://<user>:<password>@/<database>?socket=<socket-directory>`
|
||||
|
||||
```yaml
|
||||
# Example
|
||||
db-uri: postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
```yml
|
||||
services:
|
||||
|
||||
+21
-2
@@ -41,6 +41,7 @@ type databaseInfo struct {
|
||||
Password string
|
||||
Database string
|
||||
SSLMode string
|
||||
Socket string
|
||||
}
|
||||
|
||||
var DatabaseInfo *databaseInfo
|
||||
@@ -94,6 +95,9 @@ func parseDBURI(uri string) (*databaseInfo, error) {
|
||||
if sslmode := q.Get("sslmode"); sslmode != "" && info.Type == PostgreSQL {
|
||||
info.SSLMode = sslmode
|
||||
}
|
||||
if socket := q.Get("socket"); socket != "" {
|
||||
info.Socket = socket
|
||||
}
|
||||
}
|
||||
|
||||
switch info.Type {
|
||||
@@ -233,7 +237,16 @@ func setupSQLite(dbInfo databaseInfo) error {
|
||||
|
||||
func setupPostgres(dbInfo databaseInfo) error {
|
||||
var err error
|
||||
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Host, dbInfo.Port, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
|
||||
var dsn string
|
||||
if dbInfo.Socket != "" {
|
||||
// Unix socket connection: the host parameter points to the socket directory.
|
||||
dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Socket, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
|
||||
if dbInfo.Port != "" {
|
||||
dsn += fmt.Sprintf(" port=%s", dbInfo.Port)
|
||||
}
|
||||
} else {
|
||||
dsn = fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s", dbInfo.Host, dbInfo.Port, dbInfo.User, dbInfo.Password, dbInfo.Database, dbInfo.SSLMode)
|
||||
}
|
||||
|
||||
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
@@ -245,7 +258,13 @@ func setupPostgres(dbInfo databaseInfo) error {
|
||||
|
||||
func setupMySQL(dbInfo databaseInfo) error {
|
||||
var err error
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbInfo.User, dbInfo.Password, dbInfo.Host, dbInfo.Port, dbInfo.Database)
|
||||
var protocol string
|
||||
if dbInfo.Socket != "" {
|
||||
protocol = fmt.Sprintf("unix(%s)", dbInfo.Socket)
|
||||
} else {
|
||||
protocol = fmt.Sprintf("tcp(%s:%s)", dbInfo.Host, dbInfo.Port)
|
||||
}
|
||||
dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", dbInfo.User, dbInfo.Password, protocol, dbInfo.Database)
|
||||
|
||||
db, err = gorm.Open(mysql.New(mysql.Config{
|
||||
DSN: dsn,
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestParseDBURISocket(t *testing.T) {
|
||||
t.Run("MySQL unix socket", func(t *testing.T) {
|
||||
info, err := parseDBURI("mysql://root:passwd@/opengist_db?socket=/var/run/mysqld/mysqld.sock")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, MySQL, info.Type)
|
||||
require.Equal(t, "/var/run/mysqld/mysqld.sock", info.Socket)
|
||||
require.Equal(t, "root", info.User)
|
||||
require.Equal(t, "passwd", info.Password)
|
||||
require.Equal(t, "opengist_db", info.Database)
|
||||
require.Empty(t, info.Host)
|
||||
require.Empty(t, info.Port)
|
||||
})
|
||||
|
||||
t.Run("PostgreSQL unix socket", func(t *testing.T) {
|
||||
info, err := parseDBURI("postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, PostgreSQL, info.Type)
|
||||
require.Equal(t, "/var/run/postgresql", info.Socket)
|
||||
require.Equal(t, "postgres", info.User)
|
||||
require.Equal(t, "passwd", info.Password)
|
||||
require.Equal(t, "opengist_db", info.Database)
|
||||
})
|
||||
|
||||
t.Run("PostgreSQL socket keeps sslmode", func(t *testing.T) {
|
||||
info, err := parseDBURI("postgres://postgres:passwd@/opengist_db?socket=/var/run/postgresql&sslmode=require")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "/var/run/postgresql", info.Socket)
|
||||
require.Equal(t, "require", info.SSLMode)
|
||||
})
|
||||
|
||||
t.Run("TCP connection has no socket", func(t *testing.T) {
|
||||
info, err := parseDBURI("mysql://root:passwd@localhost:3306/opengist_db")
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, info.Socket)
|
||||
require.Equal(t, "localhost", info.Host)
|
||||
require.Equal(t, "3306", info.Port)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user