Mercurial > gemma
view pkg/imports/misc.go @ 4974:e1d8217954a0 fairway-marks-import
Ignore fields not used as arguments to prepared statements
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Fri, 28 Feb 2020 20:22:25 +0100 |
parents | 5c43427fc2bf |
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) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> package imports import ( "context" "database/sql" "fmt" "strings" ) type stringCounter map[string]int func (sc stringCounter) String() string { var b strings.Builder for t, c := range sc { if b.Len() > 0 { b.WriteString(", ") } b.WriteString(fmt.Sprintf("%s: %d", t, c)) } return b.String() } // Savepoint is a function wrapper to hide the details // of managing database SAVEPOINTs. // If the returned function is called with a callback // the callback is run in a SAVEPOINT. // If the callback returns w/o an error or with sql.ErrNoRows the SAVEPOINT // is released. Otherwise the SAVEPOINT is rolled back. func Savepoint( ctx context.Context, tx *sql.Tx, name string, ) func(func() error) error { var ( savepoint = "SAVEPOINT " + name rollback = "ROLLBACK TO SAVEPOINT " + name release = "RELEASE SAVEPOINT " + name ) return func(fn func() error) (err error) { if _, err = tx.ExecContext(ctx, savepoint); err != nil { return } var done bool defer func() { if !done { _, err2 := tx.ExecContext(ctx, rollback) if err == nil { err = err2 } } }() // Release SAVEPOINT if statements run in fn returned no database error if err = fn(); err == nil || err == sql.ErrNoRows { done = true if _, err2 := tx.ExecContext(ctx, release); err2 != nil { err = err2 } } return } }