changeset 5333:6c0f40676984 extented-report

Run xlsx templating in a read-only transaction.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 01 Jun 2021 00:37:03 +0200
parents 9df7b39297ed
children 45805c454436
files pkg/controllers/report.go pkg/xlsx/sql.go pkg/xlsx/templater.go
diffstat 3 files changed, 11 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/report.go	Tue Jun 01 00:23:25 2021 +0200
+++ b/pkg/controllers/report.go	Tue Jun 01 00:37:03 2021 +0200
@@ -14,6 +14,7 @@
 package controllers
 
 import (
+	"database/sql"
 	"fmt"
 	"log"
 	"net/http"
@@ -157,7 +158,10 @@
 	ctx := req.Context()
 	conn := middleware.GetDBConn(req)
 
-	if err := action.Execute(ctx, conn, template); err != nil {
+	tx, err := conn.BeginTx(ctx, &sql.TxOptions{ReadOnly: true})
+	defer tx.Rollback()
+
+	if err := action.Execute(ctx, tx, template); err != nil {
 		log.Printf("error: %v\n", err)
 		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
 		return
--- a/pkg/xlsx/sql.go	Tue Jun 01 00:23:25 2021 +0200
+++ b/pkg/xlsx/sql.go	Tue Jun 01 00:37:03 2021 +0200
@@ -59,7 +59,7 @@
 
 func query(
 	ctx context.Context,
-	db *sql.Conn,
+	tx *sql.Tx,
 	stmt string,
 	eval func(string) (interface{}, error),
 ) (*sqlResult, error) {
@@ -73,7 +73,7 @@
 		}
 	}
 
-	rs, err := db.QueryContext(ctx, nstmt, args...)
+	rs, err := tx.QueryContext(ctx, nstmt, args...)
 	if err != nil {
 		return nil, err
 	}
--- a/pkg/xlsx/templater.go	Tue Jun 01 00:23:25 2021 +0200
+++ b/pkg/xlsx/templater.go	Tue Jun 01 00:37:03 2021 +0200
@@ -48,7 +48,7 @@
 
 type executor struct {
 	ctx              context.Context
-	db               *sql.Conn
+	tx               *sql.Tx
 	template         *excelize.File
 	keep             map[string]bool
 	expressions      map[string]gval.Evaluable
@@ -74,13 +74,13 @@
 
 func (a *Action) Execute(
 	ctx context.Context,
-	db *sql.Conn,
+	tx *sql.Tx,
 	template *excelize.File,
 ) error {
 
 	e := executor{
 		ctx:         ctx,
-		db:          db,
+		tx:          tx,
 		template:    template,
 		keep:        map[string]bool{},
 		expressions: map[string]gval.Evaluable{},
@@ -260,7 +260,7 @@
 		return f(e.ctx, vars)
 	}
 
-	res, err := query(e.ctx, e.db, action.Statement, eval)
+	res, err := query(e.ctx, e.tx, action.Statement, eval)
 	if err != nil {
 		return err
 	}