From 4bdc6a04d32c7da0c1a218cc3fbbb109a9b7a134 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Wed, 20 Mar 2024 10:59:50 +0100 Subject: [PATCH] refactoring of app: separation of truncate and update --- app/app.go | 277 ++++++++++++++++++++-------------------- config/schema_config.go | 6 + 2 files changed, 147 insertions(+), 136 deletions(-) diff --git a/app/app.go b/app/app.go index 8db93b9..1819a45 100644 --- a/app/app.go +++ b/app/app.go @@ -22,82 +22,99 @@ type App struct { FakeManager faker.FakeManager } -func (a *App) DoAction(c config.SchemaConfigAction, globalColumns map[string]string, generators map[string][]string) error { - var query string +func (a *App) Run(db *sql.DB, c config.SchemaConfig, fakeManager faker.FakeManager) error { + a.Db = db + a.FakeManager = fakeManager - if c.Table == "" { - return errors.New("Table must be defined") + for _, data := range c.Rules.Actions { + err := a.DoAction(data, c.Rules.Columns, c.Rules.Generators) + + logger.LogFatalExitIf(err) } - if c.Truncate { - if c.Query != "" { - query = c.Query - } else { - return a.TruncateTable(c.Table) - } - } else { - if c.Query != "" { - query = c.Query - } else { - query = fmt.Sprintf("SELECT * FROM %s", c.Table) - } - } - - if len(c.PrimaryKey) == 0 { - c.PrimaryKey = []string{"id"} + _ = db + + return nil +} + +func (a *App) TruncateTable(c config.SchemaConfigAction) error { + if c.Query == "" { + _, err := a.Db.Exec(fmt.Sprintf("TRUNCATE %s", c.Table)) + + return err } + query := a.CreateSelectQuery(c) rows := database.GetRows(a.Db, query) var scan any - if c.Truncate { - for _, row := range rows { - pkeys := []string{} - pCounter := 1 + for _, row := range rows { + pkeys := []string{} + pCounter := 1 - for _, col := range c.PrimaryKey { - pkeys = append(pkeys, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) - pCounter = pCounter + 1 - } - - sql := fmt.Sprintf( - "DELETE FROM %s WHERE %s", - c.Table, - strings.Join(pkeys, " AND "), - ) - - stmt := nq.NewNamedParameterQuery(sql) - pCounter = 1 - - for _, col := range c.PrimaryKey { - stmt.SetValue(fmt.Sprintf("p%s", strconv.Itoa(pCounter)), row[col].Value) - pCounter = pCounter + 1 - } - - a.Db.QueryRow(stmt.GetParsedQuery(), (stmt.GetParsedParameters())...).Scan(&scan) + for _, col := range c.PrimaryKey { + pkeys = append(pkeys, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) + pCounter = pCounter + 1 } - } else { - for key, row := range rows { - if len(c.VirtualColumns) > 0 { - for col, faker := range c.VirtualColumns { - rows[key][col] = data.Data{ - Value: "", - Faker: faker, - IsVirtual: true, + + sql := fmt.Sprintf( + "DELETE FROM %s WHERE %s", + c.Table, + strings.Join(pkeys, " AND "), + ) + + stmt := nq.NewNamedParameterQuery(sql) + pCounter = 1 + + for _, col := range c.PrimaryKey { + stmt.SetValue(fmt.Sprintf("p%s", strconv.Itoa(pCounter)), row[col].Value) + pCounter = pCounter + 1 + } + + a.Db.QueryRow(stmt.GetParsedQuery(), (stmt.GetParsedParameters())...).Scan(&scan) + } + + return nil +} + +func (a *App) UpdateRows(c config.SchemaConfigAction, globalColumns map[string]string, generators map[string][]string) error { + query := a.CreateSelectQuery(c) + rows := database.GetRows(a.Db, query) + var scan any + + for key, row := range rows { + if len(c.VirtualColumns) > 0 { + for col, faker := range c.VirtualColumns { + rows[key][col] = data.Data{ + Value: "", + Faker: faker, + IsVirtual: true, + } + } + } + + if len(c.Columns) > 0 { + for col, faker := range c.Columns { + r := row[col] + r.Faker = faker + rows[key][col] = r + } + } + + if len(globalColumns) > 0 { + for col, faker := range globalColumns { + if value, exists := row[col]; exists { + if value.Faker == "" { + value.Faker = faker + rows[key][col] = value } } } + } - if len(c.Columns) > 0 { - for col, faker := range c.Columns { - r := row[col] - r.Faker = faker - rows[key][col] = r - } - } - - if len(globalColumns) > 0 { - for col, faker := range globalColumns { + if len(generators) > 0 { + for faker, columns := range generators { + for _, col := range columns { if value, exists := row[col]; exists { if value.Faker == "" { value.Faker = faker @@ -106,76 +123,85 @@ func (a *App) DoAction(c config.SchemaConfigAction, globalColumns map[string]str } } } - - if len(generators) > 0 { - for faker, columns := range generators { - for _, col := range columns { - if value, exists := row[col]; exists { - if value.Faker == "" { - value.Faker = faker - rows[key][col] = value - } - } - } - } - } - - for _, col := range c.PrimaryKey { - value := row[col] - value.IsPrimaryKey = true - rows[key][col] = value - } - - v, err := a.UpdateRow(rows[key]) - - logger.LogFatalExitIf(err) - - rows[key] = v } - for _, row := range rows { - updates := []string{} - pkeys := []string{} - values := make(map[int]string) - pCounter := 1 + for _, col := range c.PrimaryKey { + value := row[col] + value.IsPrimaryKey = true + rows[key][col] = value + } - for col, value := range row { - if value.IsUpdated && !value.IsVirtual { - values[pCounter] = value.Value - updates = append(updates, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) - pCounter = pCounter + 1 - } - } + v, err := a.UpdateRow(rows[key]) - for _, col := range c.PrimaryKey { - values[pCounter] = row[col].Value - pkeys = append(pkeys, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) + logger.LogFatalExitIf(err) + + rows[key] = v + } + + for _, row := range rows { + updates := []string{} + pkeys := []string{} + values := make(map[int]string) + pCounter := 1 + + for col, value := range row { + if value.IsUpdated && !value.IsVirtual { + values[pCounter] = value.Value + updates = append(updates, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) pCounter = pCounter + 1 } + } - if len(updates) > 0 { - sql := fmt.Sprintf( - "UPDATE %s SET %s WHERE %s", - c.Table, - strings.Join(updates, ", "), - strings.Join(pkeys, " AND "), - ) + for _, col := range c.PrimaryKey { + values[pCounter] = row[col].Value + pkeys = append(pkeys, fmt.Sprintf("%s=:p%s", col, strconv.Itoa(pCounter))) + pCounter = pCounter + 1 + } - stmt := nq.NewNamedParameterQuery(sql) - pCounter = 1 + if len(updates) > 0 { + sql := fmt.Sprintf( + "UPDATE %s SET %s WHERE %s", + c.Table, + strings.Join(updates, ", "), + strings.Join(pkeys, " AND "), + ) - for i, value := range values { - stmt.SetValue(fmt.Sprintf("p%s", strconv.Itoa(i)), value) - } + stmt := nq.NewNamedParameterQuery(sql) + pCounter = 1 - a.Db.QueryRow(stmt.GetParsedQuery(), (stmt.GetParsedParameters())...).Scan(&scan) + for i, value := range values { + stmt.SetValue(fmt.Sprintf("p%s", strconv.Itoa(i)), value) } + + a.Db.QueryRow(stmt.GetParsedQuery(), (stmt.GetParsedParameters())...).Scan(&scan) } } return nil } +func (a *App) CreateSelectQuery(c config.SchemaConfigAction) string { + if c.Query != "" { + return c.Query + } + + return fmt.Sprintf("SELECT * FROM %s", c.Table) +} + +func (a *App) DoAction(c config.SchemaConfigAction, globalColumns map[string]string, generators map[string][]string) error { + if c.Table == "" { + return errors.New("Table must be defined") + } + + c.InitPrimaryKey() + + if c.Truncate { + return a.TruncateTable(c) + } + + return a.UpdateRows(c, globalColumns, generators) +} + func (a *App) UpdateRow(row map[string]data.Data) (map[string]data.Data, error) { for key, value := range row { if value.IsVirtual && !value.IsTwigExpression() { @@ -215,24 +241,3 @@ func (a *App) UpdateRow(row map[string]data.Data) (map[string]data.Data, error) return row, nil } - -func (a *App) TruncateTable(table string) error { - _, err := a.Db.Exec(fmt.Sprintf("TRUNCATE %s", table)) - - return err -} - -func (a *App) Run(db *sql.DB, c config.SchemaConfig, fakeManager faker.FakeManager) error { - a.Db = db - a.FakeManager = fakeManager - - for _, data := range c.Rules.Actions { - err := a.DoAction(data, c.Rules.Columns, c.Rules.Generators) - - logger.LogFatalExitIf(err) - } - - _ = db - - return nil -} diff --git a/config/schema_config.go b/config/schema_config.go index c2b207f..ed5e4bf 100644 --- a/config/schema_config.go +++ b/config/schema_config.go @@ -37,3 +37,9 @@ func LoadSchemaConfigFromFile(file string) (SchemaConfig, error) { return value, nil } + +func (c *SchemaConfigAction) InitPrimaryKey() { + if len(c.PrimaryKey) == 0 { + c.PrimaryKey = []string{"id"} + } +}