view pkg/controllers/statsupdates.go @ 5490:5f47eeea988d logging

Use own logging package.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 20 Sep 2021 17:45:39 +0200
parents fc3a5345b0fd
children 6270951dda28
line wrap: on
line source

// This is Free Software under GNU Affero General Public License v >= 3.0
// without warranty, see README.md and license for details.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// License-Filename: LICENSES/AGPL-3.0.txt
//
// Copyright (C) 2021 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>

package controllers

import (
	"database/sql"
	"net/http"

	"github.com/gorilla/mux"

	"gemma.intevation.de/gemma/pkg/log"
	mw "gemma.intevation.de/gemma/pkg/middleware"
)

const (
	listStatsUpdatesSQL   = `SELECT name FROM sys_admin.stats_updates ORDER BY name`
	statsUpdatesScriptSQL = `SELECT script FROM sys_admin.stats_updates WHERE name = $1`
)

func listStatsUpdates(req *http.Request) (jr mw.JSONResult, err error) {

	ctx := req.Context()
	conn := mw.JSONConn(req)

	rows, err2 := conn.QueryContext(ctx, listStatsUpdatesSQL)
	if err2 != nil {
		log.Errorf("%v\n", err2)
		err = mw.JSONError{
			Code:    http.StatusInternalServerError,
			Message: "Listing stats update failed.",
		}
		return
	}
	defer rows.Close()

	names := []string{}

	for rows.Next() {
		var name string
		if err2 := rows.Scan(&name); err2 != nil {
			log.Errorf("%v\n", err2)
			err = mw.JSONError{
				Code:    http.StatusInternalServerError,
				Message: "Fetching stats update names failed.",
			}
			return
		}
		names = append(names, name)
	}

	if err2 := rows.Err(); err2 != nil {
		log.Errorf("%v\n", err2)
		err = mw.JSONError{
			Code:    http.StatusInternalServerError,
			Message: "Fetching stats update names failed.",
		}
		return
	}

	out := struct {
		StatsUpdates []string `json:"stats-updates"`
	}{
		StatsUpdates: names,
	}
	jr = mw.JSONResult{Result: out}
	return
}

func statsUpdates(req *http.Request) (jr mw.JSONResult, err error) {
	name := mux.Vars(req)["name"]

	ctx := req.Context()
	conn := mw.JSONConn(req)

	var script string
	err2 := conn.QueryRowContext(ctx, statsUpdatesScriptSQL, name).Scan(&script)
	switch {
	case err2 == sql.ErrNoRows:
		err = mw.JSONError{
			Code:    http.StatusNotFound,
			Message: "No such update script.",
		}
		return
	case err2 != nil:
		log.Errorf("%v\n", err2)
		err = mw.JSONError{
			Code:    http.StatusInternalServerError,
			Message: "Loading update script failed.",
		}
		return
	}

	if _, err2 := conn.ExecContext(ctx, script); err2 != nil {
		log.Errorf("%v\n", err2)
		err = mw.JSONError{
			Code:    http.StatusInternalServerError,
			Message: "Loading update script failed.",
		}
		return
	}

	jr = mw.JSONResult{Result: map[string]interface{}{}}
	return
}