view pkg/imports/errors.go @ 3945:3bdbaf1b282a

SR import: Negate the Z values in the XYZ files if the flag `negate-z` is set.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 14 Jul 2019 17:19:22 +0200
parents c9e1848a516a
children
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) 2019 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Tom Gottfried <tom.gottfried@intevation.de>

package imports

import (
	"strings"

	"github.com/jackc/pgx"
)

func handleError(err error) error {
	switch e := err.(type) {
	case pgx.PgError:
		return dbError(e)
	}
	return err
}

// Handle PostgreSQL error codes
const (
	notNullViolation         = "23502"
	foreignKeyViolation      = "23503"
	violatesRowLevelSecurity = "42501"
	noDataFound              = "P0002"
)

type dbError pgx.PgError

func (err dbError) Error() string {
	switch err.Code {
	case notNullViolation:
		switch err.SchemaName {
		case "waterway":
			switch err.TableName {
			case "gauges":
				switch err.ColumnName {
				case "objname":
					return "Missing objname"
				case "geom":
					return "Missing lat/lon"
				case "zero_point":
					return "Missing zeropoint"
				}
			}
		}
	case foreignKeyViolation:
		switch err.SchemaName {
		case "waterway":
			switch err.TableName {
			case "gauge_measurements", "gauge_predictions", "bottlenecks":
				switch err.ConstraintName {
				case "gauge_key":
					return "Referenced gauge with matching temporal validity not available"
				}
			}
		}
	case noDataFound:
		// Most recent line from stacktrace contains name of failed function
		recent := strings.SplitN(err.Where, "\n", 1)[0]
		switch {
		case strings.Contains(recent, "isrsrange_points"):
			return "No distance mark found for at least one given ISRS Location Code"
		case strings.Contains(recent, "isrsrange_axis"):
			return "No contiguous axis found between given ISRS Location Codes"
		case strings.Contains(recent, "isrsrange_area"):
			return "No area around axis between given ISRS Location Codes"
		}

	case violatesRowLevelSecurity:
		return "Could not save: Data outside the area of responsibility."
	}
	return "Unexpected database error: " + err.Message
}