Mercurial > gemma
diff pkg/imports/config.go @ 2049:d1a680be7ae4 unify_imports
Imports. Re-enabled /imports/config GET.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 27 Jan 2019 14:27:37 +0100 |
parents | 10a1e139d2e8 |
children | a3ccef8ec304 |
line wrap: on
line diff
--- a/pkg/imports/config.go Fri Jan 25 18:27:04 2019 +0100 +++ b/pkg/imports/config.go Sun Jan 27 14:27:37 2019 +0100 @@ -36,6 +36,7 @@ ImportConfigOut struct { ID int64 `json:"id"` Kind ImportKind `json:"kind"` + User string `json:"user"` Config interface{} `json:"config,omitempty"` } @@ -78,8 +79,37 @@ SELECT k, v FROM import.import_configuration_attributes WHERE import_configuration_id = $1` + + deleteImportConfiguationAttributesSQL = ` +DELETE FROM import.import_configuration_attributes +WHERE import_configuration_id = $1` + + updateImportConfigurationSQL = ` +UPDATE import.import_configuration SET + username = $2, + kind = $3 +WHERE id = $1` + + selectImportConfigurationsByID = ` +SELECT + c.id AS id, + username, + kind, + a.k, + a.v +FROM import.import_configuration c JOIN + import.import_configuration_attributes a + ON c.id = a.import_configuration_id +ORDER by c.id` ) +func (pc *PersistentConfig) Update(ctx context.Context, tx *sql.Tx) error { + if _, err := tx.ExecContext(ctx, deleteImportConfiguationAttributesSQL, pc.ID); err != nil { + return err + } + return nil +} + func LoadPersistentConfigContext(ctx context.Context, conn *sql.Conn, id int64) (*PersistentConfig, error) { cfg := &PersistentConfig{ID: id} @@ -135,3 +165,74 @@ }) return cfg, err } + +func ListAllPersistentConfigurationsContext( + ctx context.Context, + conn *sql.Conn, + fn func(*ImportConfigOut) error, +) error { + + rows, err := conn.QueryContext(ctx, selectImportConfigurationsByID) + if err != nil { + return err + } + defer rows.Close() + + var ( + first = true + lastID int64 + pc PersistentConfig + k, v sql.NullString + ) + + send := func() error { + kind := JobKind(pc.Kind) + ctor := ImportModelForJobKind(kind) + if ctor == nil { + return fmt.Errorf("unable to deserialize kind '%s'", pc.Kind) + } + config := ctor() + pc.Attributes.Unmarshal(config) + return fn(&ImportConfigOut{ + ID: pc.ID, + Kind: ImportKind(pc.Kind), + User: pc.User, + Config: config, + }) + } + + for rows.Next() { + if err := rows.Scan(&pc.ID, &pc.User, &k, &v); err != nil { + return err + } + if !first { + if lastID != pc.ID { + if err := send(); err != nil { + return err + } + pc.Attributes = nil + } + } else { + first = false + } + + if k.Valid && v.Valid { + if pc.Attributes == nil { + pc.Attributes = common.Attributes{} + } + pc.Attributes.Set(k.String, v.String) + } + + lastID = pc.ID + } + + if err := rows.Err(); err != nil { + return err + } + + err = nil + if !first { + err = send() + } + return err +}