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
+}