Mercurial > gemma
diff pkg/imports/dst.go @ 4392:024b16a1c253
Implemented deletion of stretches.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Thu, 12 Sep 2019 20:08:29 +0200 |
parents | |
children | e4ab338e7ba9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/imports/dst.go Thu Sep 12 20:08:29 2019 +0200 @@ -0,0 +1,117 @@ +// 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" + "fmt" +) + +// DeleteStretch is a Job to delete a stretch from the database. +type DeleteStretch struct { + ID int64 `json:"id"` +} + +// DSTJobKind is the import queue type identifier. +const DSTJobKind JobKind = "dst" + +type dstJobCreator struct{} + +func init() { RegisterJobCreator(DSTJobKind, dstJobCreator{}) } + +func (dstJobCreator) Description() string { return "delete stretch" } + +func (dstJobCreator) AutoAccept() bool { return false } + +func (dstJobCreator) Create() Job { return new(DeleteStretch) } + +func (dstJobCreator) Depends() [2][]string { + return [2][]string{ + {"stretches"}, + {}, + } +} + +const ( + dstExistsSQL = ` +SELECT EXISTS ( + SELECT 1 FROM users.stretches + WHERE id = $1 AND staging_done) +` + dstStageDoneSQL = ` +DELETE FROM users.stretches +WHERE id IN ( + SELECT key from import.track_imports + WHERE import_id = $1 AND + deletion AND + relation = 'users.stretches'::regclass)` +) + +// StageDone finally removes the stretch from the database. +func (dstJobCreator) StageDone( + ctx context.Context, + tx *sql.Tx, + id int64, +) error { + _, err := tx.ExecContext(ctx, dstStageDoneSQL, id) + return err +} + +// CleanUp of a stretch delete import is a NOP. +func (*DeleteStretch) CleanUp() error { return nil } + +// Do prepares the deletion of the stretch. +func (dst *DeleteStretch) 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() + + var found bool + if err := tx.QueryRowContext(ctx, dstExistsSQL, dst.ID).Scan(&found); err != nil { + return nil, err + } + + if !found { + return nil, fmt.Errorf("no stretch with id %d found", dst.ID) + } + + feedback.Info("Prepare deletion of stretch with id %d", dst.ID) + + if _, err := tx.ExecContext( + ctx, + trackImportDeletionSQL, + importID, + "users.stretches", + dst.ID, + true, + ); err != nil { + return nil, err + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + return dst, nil +}