changeset 3628:6693be57b7a2 configuration

Re-worked the Go part a little bit.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 11 Jun 2019 12:07:55 +0200
parents 67984bf6dba6
children 1825a1bc9fb1
files pkg/controllers/routes.go pkg/controllers/system.go
diffstat 2 files changed, 43 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/routes.go	Sun Jun 09 12:33:47 2019 +0200
+++ b/pkg/controllers/routes.go	Tue Jun 11 12:07:55 2019 +0200
@@ -84,7 +84,7 @@
 	})).Methods(http.MethodGet)
 
 	api.Handle("/system/settings", any(&JSONHandler{
-		Input:  func(*http.Request) interface{} { return &json.RawMessage{} },
+		Input:  func(*http.Request) interface{} { return &map[string]string{} },
 		Handle: setSystemSettings,
 	})).Methods(http.MethodPut)
 
--- a/pkg/controllers/system.go	Sun Jun 09 12:33:47 2019 +0200
+++ b/pkg/controllers/system.go	Tue Jun 11 12:07:55 2019 +0200
@@ -17,14 +17,14 @@
 	"bytes"
 	"database/sql"
 	"fmt"
-	"encoding/json"
 	"io/ioutil"
 	"net/http"
 	"strings"
 
+	"github.com/gorilla/mux"
+
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/models"
-	"github.com/gorilla/mux"
 )
 
 const (
@@ -34,14 +34,15 @@
 	setFeatureColourSQL = `UPDATE systemconf.feature_colours
 SET (r, g, b, a) = ($3, $4, $5, $6)
 WHERE feature_name = $1 AND style_attr = $2`
-)
+
+	getSettingsSQL = `
+SELECT config_key, config_val
+FROM sys_admin.system_config`
 
-const (
-	getSettingsSQL = `SELECT config_key, config_val
-FROM sys_admin.system_config`
-	updateSettingSQL = `UPDATE sys_admin.system_config
-SET config_val = $2
-WHERE config_key = $1`
+	updateSettingSQL = `
+INSERT INTO system_admin.system_config (config_key, config_val)
+VALUES ($1, $2)
+ON CONFLICT (key) DO UPDATE SET config_val = $2`
 )
 
 // System status end points
@@ -121,15 +122,17 @@
 	}
 	defer rows.Close()
 
-	var settings = map[string]string{}
+	settings := map[string]string{}
 
 	for rows.Next() {
-		var key string
-		var val string
-		err = rows.Scan(&key, &val)
-		if err == nil {
-			settings[key] = val
+		var key, val string
+		if err = rows.Scan(&key, &val); err != nil {
+			return
 		}
+		settings[key] = val
+	}
+	if err = rows.Err(); err != nil {
+		return
 	}
 
 	jr = JSONResult{Result: settings}
@@ -142,20 +145,34 @@
 	conn *sql.Conn,
 ) (jr JSONResult, err error) {
 
-	var settings map[string]interface{}
-	raw := input.(*json.RawMessage)
-	json.Unmarshal(*raw, &settings)
+	settings := input.(*map[string]string)
+
+	ctx := req.Context()
+	var tx *sql.Tx
+	if tx, err = conn.BeginTx(ctx, nil); err != nil {
+		return
+	}
+	defer tx.Rollback()
 
-	for key, value := range settings {
-		_, err = conn.ExecContext(
-			req.Context(),
+	var setStmt *sql.Stmt
+	if setStmt, err = tx.PrepareContext(ctx, updateSettingSQL); err != nil {
+		return
+	}
+	defer setStmt.Close()
+
+	for key, value := range *settings {
+		if _, err = setStmt.ExecContext(
+			ctx,
 			updateSettingSQL,
-			key, value)
-
-		if err != nil {
+			key, value,
+		); err != nil {
 			return
 		}
-  }
+	}
+
+	if err = tx.Commit(); err != nil {
+		return
+	}
 
 	jr = JSONResult{
 		Code: http.StatusCreated,