aboutsummaryrefslogtreecommitdiff
path: root/internal/sqlutil
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-08-10 14:18:04 +0100
committerGitHub <noreply@github.com>2020-08-10 14:18:04 +0100
commit4b09f445c992fd0a389efc34d75aaa7e5bd50e9c (patch)
tree18d6168718ac06e569eb271f25ed4dc064010b50 /internal/sqlutil
parentfdabba1851c489d801ea4029bce9dec7d415b2df (diff)
Configuration format v1 (#1230)
* Initial pass at refactoring config (not finished) * Don't forget current state and EDU servers * More shifting around * Update server key API tests * Fix roomserver test * Fix more tests * Further tweaks * Fix current state server test (sort of) * Maybe fix appservices * Fix client API test * Include database connection string in database options * Fix sync API build * Update config test * Fix unit tests * Fix federation sender build * Fix gobind build * Set Listen address for all services in HTTP monolith mode * Validate config, reinstate appservice derived in directory, tweaks * Tweak federation API test * Set MaxOpenConnections/MaxIdleConnections to previous values * Update generate-config
Diffstat (limited to 'internal/sqlutil')
-rw-r--r--internal/sqlutil/sql.go8
-rw-r--r--internal/sqlutil/trace.go26
-rw-r--r--internal/sqlutil/uri.go10
3 files changed, 29 insertions, 15 deletions
diff --git a/internal/sqlutil/sql.go b/internal/sqlutil/sql.go
index 2ec6ce29..95467c63 100644
--- a/internal/sqlutil/sql.go
+++ b/internal/sqlutil/sql.go
@@ -19,7 +19,6 @@ import (
"errors"
"fmt"
"runtime"
- "time"
"go.uber.org/atomic"
)
@@ -107,13 +106,6 @@ func SQLiteDriverName() string {
return "sqlite3"
}
-// DbProperties functions return properties used by database/sql/DB
-type DbProperties interface {
- MaxIdleConns() int
- MaxOpenConns() int
- ConnMaxLifetime() time.Duration
-}
-
// TransactionWriter allows queuing database writes so that you don't
// contend on database locks in, e.g. SQLite. Only one task will run
// at a time on a given TransactionWriter.
diff --git a/internal/sqlutil/trace.go b/internal/sqlutil/trace.go
index f6644d59..fbd983be 100644
--- a/internal/sqlutil/trace.go
+++ b/internal/sqlutil/trace.go
@@ -25,6 +25,7 @@ import (
"strings"
"time"
+ "github.com/matrix-org/dendrite/internal/config"
"github.com/ngrok/sqlmw"
"github.com/sirupsen/logrus"
)
@@ -77,7 +78,22 @@ func (in *traceInterceptor) RowsNext(c context.Context, rows driver.Rows, dest [
// Open opens a database specified by its database driver name and a driver-specific data source name,
// usually consisting of at least a database name and connection information. Includes tracing driver
// if DENDRITE_TRACE_SQL=1
-func Open(driverName, dsn string, dbProperties DbProperties) (*sql.DB, error) {
+func Open(dbProperties *config.DatabaseOptions) (*sql.DB, error) {
+ var err error
+ var driverName, dsn string
+ switch {
+ case dbProperties.ConnectionString.IsSQLite():
+ driverName = SQLiteDriverName()
+ dsn, err = ParseFileURI(dbProperties.ConnectionString)
+ if err != nil {
+ return nil, fmt.Errorf("ParseFileURI: %w", err)
+ }
+ case dbProperties.ConnectionString.IsPostgres():
+ driverName = "postgres"
+ dsn = string(dbProperties.ConnectionString)
+ default:
+ return nil, fmt.Errorf("invalid database connection string %q", dbProperties.ConnectionString)
+ }
if tracingEnabled {
// install the wrapped driver
driverName += "-trace"
@@ -86,11 +102,11 @@ func Open(driverName, dsn string, dbProperties DbProperties) (*sql.DB, error) {
if err != nil {
return nil, err
}
- if driverName != SQLiteDriverName() && dbProperties != nil {
+ if driverName != SQLiteDriverName() {
logrus.WithFields(logrus.Fields{
- "MaxOpenConns": dbProperties.MaxOpenConns(),
- "MaxIdleConns": dbProperties.MaxIdleConns(),
- "ConnMaxLifetime": dbProperties.ConnMaxLifetime(),
+ "MaxOpenConns": dbProperties.MaxOpenConns,
+ "MaxIdleConns": dbProperties.MaxIdleConns,
+ "ConnMaxLifetime": dbProperties.ConnMaxLifetime,
"dataSourceName": regexp.MustCompile(`://[^@]*@`).ReplaceAllLiteralString(dsn, "://"),
}).Debug("Setting DB connection limits")
db.SetMaxOpenConns(dbProperties.MaxOpenConns())
diff --git a/internal/sqlutil/uri.go b/internal/sqlutil/uri.go
index 703258e6..e2c825d9 100644
--- a/internal/sqlutil/uri.go
+++ b/internal/sqlutil/uri.go
@@ -15,14 +15,20 @@
package sqlutil
import (
+ "errors"
"fmt"
"net/url"
+
+ "github.com/matrix-org/dendrite/internal/config"
)
// ParseFileURI returns the filepath in the given file: URI. Specifically, this will handle
// both relative (file:foo.db) and absolute (file:///path/to/foo) paths.
-func ParseFileURI(dataSourceName string) (string, error) {
- uri, err := url.Parse(dataSourceName)
+func ParseFileURI(dataSourceName config.DataSource) (string, error) {
+ if !dataSourceName.IsSQLite() {
+ return "", errors.New("ParseFileURI expects SQLite connection string")
+ }
+ uri, err := url.Parse(string(dataSourceName))
if err != nil {
return "", err
}