changeset 5735:8cbe0a873e32

Merged
author Sascha Wilde <wilde@intevation.de>
date Wed, 29 May 2024 16:55:22 +0200
parents ea16ae748357 (current diff) 1ea1d3ef2258 (diff)
children 55892008ec96
files
diffstat 3 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/isr.go	Wed May 29 12:55:50 2024 +0200
+++ b/pkg/imports/isr.go	Wed May 29 16:55:22 2024 +0200
@@ -16,6 +16,7 @@
 import (
 	"context"
 	"database/sql"
+	"fmt"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/log"
@@ -146,7 +147,7 @@
 
 	heights, err := mesh.ParseClassBreaks(isr.ClassBreaks)
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("class breaks loading failed: %w", err)
 	}
 	heights = heights.Dedup()
 
@@ -248,6 +249,7 @@
 	var markings, beams int
 
 	// For all sounding results in bottleneck.
+soundingResults:
 	for _, sr := range bn.srs {
 		switch sr.surveyType {
 		case models.SurveyTypeMarking:
@@ -306,7 +308,11 @@
 
 			tree, err := mesh.FetchMeshDirectly(ctx, tx, sr.id)
 			if err != nil {
-				return err
+				return fmt.Errorf("mesh loading failed: %w", err)
+			}
+			if tree == nil {
+				feedback.Warn("mesh index of id %d is invalid", sr.id)
+				continue soundingResults
 			}
 			hs := heights.ExtrapolateClassBreaks(tree.Min().Z, tree.Max().Z).Dedup()
 
--- a/pkg/mesh/cache.go	Wed May 29 12:55:50 2024 +0200
+++ b/pkg/mesh/cache.go	Wed May 29 16:55:22 2024 +0200
@@ -16,6 +16,8 @@
 import (
 	"context"
 	"database/sql"
+	"errors"
+	"fmt"
 	"sync"
 	"time"
 )
@@ -51,6 +53,7 @@
 SELECT mesh_index, coalesce(mesh_index_version, 1) AS mesh_index_version
 FROM waterway.sounding_results
 WHERE id = $1
+  AND mesh_checksum IS NOT NULL AND mesh_index IS NOT NULL
 `
 	fetchMeshSQL = `
 SELECT mesh_checksum, mesh_index, coalesce(mesh_index_version, 1) AS mesh_index_version
@@ -107,13 +110,15 @@
 ) (*STRTree, error) {
 	var data []byte
 	var version int
-	err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data, &version)
-	if err != nil {
-		return nil, err
+	switch err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data, &version); {
+	case errors.Is(err, sql.ErrNoRows):
+		return nil, nil
+	case err != nil:
+		return nil, fmt.Errorf("fetching mesh from db failed: %w", err)
 	}
 	tree := new(STRTree)
 	if err := tree.FromBytes(data, version); err != nil {
-		return nil, err
+		return nil, fmt.Errorf("deserializing mesh failed: %w (version %d)", err, version)
 	}
 	return tree, nil
 }
--- a/pkg/mesh/meshserialize.go	Wed May 29 12:55:50 2024 +0200
+++ b/pkg/mesh/meshserialize.go	Wed May 29 16:55:22 2024 +0200
@@ -80,7 +80,7 @@
 	version = coalesceVersion(version)
 	r, err := gzip.NewReader(bytes.NewReader(data))
 	if err != nil {
-		return err
+		return fmt.Errorf("not gzip formatted: %w", err)
 	}
 	return s.deserialize(bufio.NewReader(r), version)
 }
@@ -88,7 +88,7 @@
 func (s *STRTree) deserialize(r *bufio.Reader, version int) error {
 	header, err := r.Peek(8)
 	if err != nil {
-		return err
+		return fmt.Errorf("peeking 8 bytes ahead failed: %w", err)
 	}
 	if bytes.HasPrefix(header, []byte(magicHeader)) {
 		realVersion := int(binary.LittleEndian.Uint32(header[4:]))
@@ -98,7 +98,7 @@
 		}
 		// Skip the header
 		if _, err := r.Discard(8); err != nil {
-			return err
+			return fmt.Errorf("discarding failed: %w", err)
 		}
 		return s.deserializeVn(r, realVersion)
 	}