# HG changeset patch # User Sascha L. Teichmann # Date 1560247675 -7200 # Node ID 6693be57b7a2ead6551c446ba56a697d9d91546e # Parent 67984bf6dba6678ac99d312ad20ef42e6e7301e8 Re-worked the Go part a little bit. diff -r 67984bf6dba6 -r 6693be57b7a2 pkg/controllers/routes.go --- 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) diff -r 67984bf6dba6 -r 6693be57b7a2 pkg/controllers/system.go --- 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,