From 48ed39df5f012897a197ae00981f5ff88220ecad Mon Sep 17 00:00:00 2001 From: winebarrel Date: Wed, 19 Feb 2020 14:10:43 +0900 Subject: [PATCH] Add "mysql_tables" data source --- mysql/data_source_tables.go | 80 +++++++++++++++++++++++++++++++++++++ mysql/provider.go | 4 ++ 2 files changed, 84 insertions(+) create mode 100644 mysql/data_source_tables.go diff --git a/mysql/data_source_tables.go b/mysql/data_source_tables.go new file mode 100644 index 00000000..853aaf47 --- /dev/null +++ b/mysql/data_source_tables.go @@ -0,0 +1,80 @@ +package mysql + +import ( + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceTables() *schema.Resource { + return &schema.Resource{ + Read: ShowTables, + Schema: map[string]*schema.Schema{ + "database": { + Type: schema.TypeString, + Required: true, + }, + "pattern": { + Type: schema.TypeString, + Optional: true, + }, + "tables": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func ShowTables(d *schema.ResourceData, meta interface{}) error { + db, err := connectToMySQL(meta.(*MySQLConfiguration)) + + if err != nil { + return err + } + + database := d.Get("database").(string) + pattern := d.Get("pattern").(string) + + sql := fmt.Sprintf("SHOW TABLES FROM %s", quoteIdentifier(database)) + + if pattern != "" { + sql += fmt.Sprintf(" LIKE '%s'", pattern) + } + + log.Printf("[DEBUG] SQL: %s", sql) + + rows, err := db.Query(sql) + + if err != nil { + return err + } + + defer rows.Close() + + var tables []string + + for rows.Next() { + var table string + + err := rows.Scan(&table) + + if err != nil { + return err + } + + tables = append(tables, table) + } + + err = d.Set("tables", tables) + + if err != nil { + return err + } + + d.SetId(database) + + return nil +} diff --git a/mysql/provider.go b/mysql/provider.go index 256b6e61..26499230 100644 --- a/mysql/provider.go +++ b/mysql/provider.go @@ -99,6 +99,10 @@ func Provider() terraform.ResourceProvider { }, }, + DataSourcesMap: map[string]*schema.Resource{ + "mysql_tables": dataSourceTables(), + }, + ResourcesMap: map[string]*schema.Resource{ "mysql_database": resourceDatabase(), "mysql_grant": resourceGrant(),