Mercurial > gemma
view pkg/imports/misc.go @ 4615:32d3e0cecf4f geoserver_sql_views
Merge default into geoserver_sql_views
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Mon, 09 Sep 2019 17:46:51 +0200 |
parents | 51e90370eced |
children | 1d50ac8dd688 |
line wrap: on
line source
// 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 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 } } }() if err = fn(); err == nil { done = true _, err = tx.ExecContext(ctx, release) } return } }