changeset 5564:aaa9e658cabd

Log export: Added marker interface to JobCreators that log messages should be loaded at export. Removes the hard coded SR export SQL logic.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 12 Feb 2022 18:56:55 +0100
parents 3be1d79ad3a3
children ade07a3f2cfd f1fb8c4f6587
files pkg/controllers/importqueue.go pkg/imports/queue.go pkg/imports/sr.go
diffstat 3 files changed, 44 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/importqueue.go	Sat Feb 12 17:36:20 2022 +0100
+++ b/pkg/controllers/importqueue.go	Sat Feb 12 18:56:55 2022 +0100
@@ -75,7 +75,7 @@
   EXISTS(SELECT 1 FROM import.import_logs
     WHERE kind = 'warn'::log_type and import_id = id) AS has_warnings,
   data,
-  CASE WHEN kind = 'sr' THEN ARRAY(SELECT msg FROM import.import_logs WHERE import_id = id)
+  CASE WHEN kind = ANY($1) THEN ARRAY(SELECT msg FROM import.import_logs WHERE import_id = id)
   ELSE NULL
   END AS msgs
 FROM import.imports
@@ -113,7 +113,12 @@
 	args []interface{}
 }
 
-func buildFilters(projection string, req *http.Request) (*filledStmt, *filledStmt, *filledStmt, error) {
+func buildFilters(projection string, req *http.Request, args ...interface{}) (
+	*filledStmt,
+	*filledStmt,
+	*filledStmt,
+	error,
+) {
 
 	var l, a, b filterAnd
 
@@ -197,6 +202,10 @@
 	fa := &filledStmt{}
 	fb := &filledStmt{}
 
+	fl.args = append(fl.args, args...)
+	fa.args = append(fa.args, args...)
+	fb.args = append(fb.args, args...)
+
 	fa.stmt.WriteString(selectEnqueuedSQL)
 	fb.stmt.WriteString(selectEnqueuedSQL)
 
@@ -264,7 +273,26 @@
 
 func exportImports(rw http.ResponseWriter, req *http.Request) {
 
-	list, _, _, err := buildFilters(selectExportSQL, req)
+	type LogLoader interface{ LoadingLogs() bool }
+
+	var lls []string
+
+	imports.All(func(k imports.JobKind, jc imports.JobCreator) {
+		if ll, ok := jc.(LogLoader); ok && ll.LoadingLogs() {
+			lls = append(lls, string(k))
+		}
+	})
+
+	var loaders pgtype.TextArray
+	if err := loaders.Set(lls); err != nil {
+		http.Error(
+			rw, fmt.Sprintf("error: %v", err),
+			http.StatusInternalServerError)
+		return
+	}
+
+	list, _, _, err := buildFilters(selectExportSQL, req, &loaders)
+
 	if err != nil {
 		http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
 		return
--- a/pkg/imports/queue.go	Sat Feb 12 17:36:20 2022 +0100
+++ b/pkg/imports/queue.go	Sat Feb 12 18:56:55 2022 +0100
@@ -731,6 +731,16 @@
 	return iqueue.decideImport(ctx, id, accepted, reviewer)
 }
 
+func (q *importQueue) All(fn func(JobKind, JobCreator)) {
+	q.creatorsMu.Lock()
+	defer q.creatorsMu.Unlock()
+	for k, v := range q.creators {
+		fn(k, v)
+	}
+}
+
+func All(fn func(JobKind, JobCreator)) { iqueue.All(fn) }
+
 type logFeedback int64
 
 func (lf logFeedback) log(kind, format string, args ...interface{}) {
--- a/pkg/imports/sr.go	Sat Feb 12 17:36:20 2022 +0100
+++ b/pkg/imports/sr.go	Sat Feb 12 18:56:55 2022 +0100
@@ -107,6 +107,9 @@
 
 func (srJobCreator) Create() Job { return new(SoundingResult) }
 
+// LoadingLogs ensures that log lines are loaded when import is exported.
+func (srJobCreator) LoadingLogs() bool { return true }
+
 func (srJobCreator) Depends() [2][]string {
 	return [2][]string{
 		{"sounding_results", "sounding_results_iso_areas",