From 7194f2b354ee90338da7104015da6c6fd2c65ace Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 18 Mar 2024 08:57:42 +0100 Subject: [PATCH] add base of algo --- app/app.go | 132 +++++++++++++++++++++++++++++++++++++++- config/schema_config.go | 2 + main.go | 1 + 3 files changed, 132 insertions(+), 3 deletions(-) diff --git a/app/app.go b/app/app.go index 82a8577..0323f9c 100644 --- a/app/app.go +++ b/app/app.go @@ -2,16 +2,142 @@ package app import ( "database/sql" + "errors" "fmt" + "os" + "gitnet.fr/deblan/database-anonymizer/config" + "gitnet.fr/deblan/database-anonymizer/data" + "gitnet.fr/deblan/database-anonymizer/database" + "gitnet.fr/deblan/database-anonymizer/logger" ) type App struct { + Db *sql.DB } -func (a *App) Run(db *sql.DB, schema config.SchemaConfig) error { - fmt.Printf("%+v\n", db) - fmt.Printf("%+v\n", schema) +func (a *App) ApplyRule(c config.SchemaConfigData, globalColumns map[string]string, generators map[string][]string) error { + var query string + + if c.Query != "" { + query = c.Query + } else if c.Table != "" { + query = fmt.Sprintf("SELECT * FROM %s", c.Table) + } else { + return errors.New("No query and no table defined") + } + + if len(c.PrimaryKey) == 0 { + c.PrimaryKey = []string{"id"} + } + + fmt.Printf("%+v\n", c.PrimaryKey) + + rows := database.GetRows(a.Db, query) + + 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(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 + } + + fmt.Printf("%+v\n", rows[key]) + + rows[key] = a.UpdateRow(rows[key]) + fmt.Printf("%+v\n", rows[key]) + os.Exit(0) + } + + // fmt.Printf("%+v\n", rows) + + return nil +} + +func (a *App) UpdateRow(row map[string]data.Data) map[string]data.Data { + for key, value := range row { + if value.IsVirtual && !value.IsTwigExpression() { + value.Update(row) + row[key] = value + } + } + + for key, value := range row { + if value.IsVirtual && value.IsTwigExpression() { + value.Update(row) + row[key] = value + } + } + + for key, value := range row { + if !value.IsVirtual && !value.IsTwigExpression() { + value.Update(row) + row[key] = value + } + } + + for key, value := range row { + if !value.IsVirtual && value.IsTwigExpression() { + value.Update(row) + row[key] = value + } + } + + return row +} + +func (a *App) Run(db *sql.DB, c config.SchemaConfig) error { + a.Db = db + + for _, data := range c.Rules.Datas { + err := a.ApplyRule(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 c02b2f5..39251c2 100644 --- a/config/schema_config.go +++ b/config/schema_config.go @@ -7,10 +7,12 @@ import ( ) type SchemaConfigData struct { + Table string `yaml:"table"` Query string `yaml:"query"` VirtualColumns map[string]string `yaml:"virtual_columns"` Generators map[string][]string `yaml:"generators"` Columns map[string]string `yaml:"columns"` + PrimaryKey []string `yaml:"primary_key"` } type SchemaConfigRules struct { diff --git a/main.go b/main.go index 390e3c1..e7d8cec 100644 --- a/main.go +++ b/main.go @@ -31,6 +31,7 @@ func main() { logger.LogFatalExitIf(err) db, err := sql.Open(databaseConfig.Type, databaseConfig.Dsn) + defer db.Close() logger.LogFatalExitIf(err) schema, err := config.LoadSchemaConfigFromFile(c.String("schema"))