Mercurial > gemma
diff pkg/imports/dsr.go @ 4400:3b36c4d810b0
Added back end for deletion of sounding results.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Mon, 16 Sep 2019 16:41:56 +0200 |
parents | pkg/imports/dst.go@024b16a1c253 |
children | 9c6c65a628a3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/imports/dsr.go Mon Sep 16 16:41:56 2019 +0200 @@ -0,0 +1,120 @@ +// 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) 2019 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> +// * Sascha Wilde <wilde@intevation.de> + +package imports + +import ( + "context" + "database/sql" + + "gemma.intevation.de/gemma/pkg/models" +) + +// DeleteSoundingResult is a Job to delete a sounding result from the database. +type DeleteSoundingResult struct { + BottleneckId string `json:"bottleneck-id"` + Date models.Date `json:"date-info"` +} + +// DSRJobKind is the import queue type identifier. +const DSRJobKind JobKind = "dsr" + +type dsrJobCreator struct{} + +func init() { RegisterJobCreator(DSRJobKind, dsrJobCreator{}) } + +func (dsrJobCreator) Description() string { return "delete sounding result" } + +func (dsrJobCreator) AutoAccept() bool { return false } + +func (dsrJobCreator) Create() Job { return new(DeleteSoundingResult) } + +func (dsrJobCreator) Depends() [2][]string { + return [2][]string{ + {"sounding resultes"}, + {}, + } +} + +const ( + dsrFindSQL = ` +SELECT id FROM waterway.sounding_results + WHERE bottleneck_id = $1 + AND date_info = $2 + AND staging_done +` + dsrStageDoneSQL = ` +DELETE FROM waterway.sounding_results +WHERE id IN ( + SELECT key from import.track_imports + WHERE import_id = $1 AND + deletion AND + relation = 'waterway.sounding_results'::regclass)` +) + +// StageDone finally removes the sounding result from the database. +func (dsrJobCreator) StageDone( + ctx context.Context, + tx *sql.Tx, + id int64, +) error { + _, err := tx.ExecContext(ctx, dsrStageDoneSQL, id) + return err +} + +// CleanUp of a sounding result delete import is a NOP. +func (*DeleteSoundingResult) CleanUp() error { return nil } + +// Do prepares the deletion of the sounding result. +func (dsr *DeleteSoundingResult) Do( + ctx context.Context, + importID int64, + conn *sql.Conn, + feedback Feedback, +) (interface{}, error) { + + tx, err := conn.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + defer tx.Rollback() + + feedback.Info("SR: bottleneck-id: %v, date-info: %v", + dsr.BottleneckId, dsr.Date.Time) + + var id int64 + if err := tx.QueryRowContext(ctx, dsrFindSQL, + dsr.BottleneckId, dsr.Date.Time).Scan(&id); err != nil { + return nil, err + } + + feedback.Info("Prepare deletion of sounding result with id %d", id) + + if _, err := tx.ExecContext( + ctx, + trackImportDeletionSQL, + importID, + "waterway.sounding_results", + id, + true, + ); err != nil { + return nil, err + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + return dsr, nil +}