From c5dd191656152c2a635bd99293b2470392b28849 Mon Sep 17 00:00:00 2001 From: Antergone Date: Tue, 19 Dec 2017 22:20:17 +0800 Subject: [PATCH 1/2] check schema and table before create it --- physical/mysql/mysql.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/physical/mysql/mysql.go b/physical/mysql/mysql.go index 87daa9a461b6..1b68516d526b 100644 --- a/physical/mysql/mysql.go +++ b/physical/mysql/mysql.go @@ -100,16 +100,39 @@ func NewMySQLBackend(conf map[string]string, logger log.Logger) (physical.Backen db.SetMaxOpenConns(maxParInt) + // Check schema exists + var schemaExist bool + schemaRows, err := db.Query("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?", database) + defer schemaRows.Close() + if err != nil { + return nil, fmt.Errorf("failed to check mysql schema exist: %v", err) + } + schemaExist = schemaRows.Next() + + // Check table exists + var tableExist bool + tableRows, err := db.Query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = ?", table) + defer tableRows.Close() + + if err != nil { + return nil, fmt.Errorf("failed to check mysql table exist: %v", err) + } + tableExist = tableRows.Next() + // Create the required database if it doesn't exists. - if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS " + database); err != nil { - return nil, fmt.Errorf("failed to create mysql database: %v", err) + if !schemaExist { + if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS " + database); err != nil { + return nil, fmt.Errorf("failed to create mysql database: %v", err) + } } // Create the required table if it doesn't exists. - create_query := "CREATE TABLE IF NOT EXISTS " + dbTable + - " (vault_key varbinary(512), vault_value mediumblob, PRIMARY KEY (vault_key))" - if _, err := db.Exec(create_query); err != nil { - return nil, fmt.Errorf("failed to create mysql table: %v", err) + if !tableExist { + create_query := "CREATE TABLE IF NOT EXISTS " + dbTable + + " (vault_key varbinary(512), vault_value mediumblob, PRIMARY KEY (vault_key))" + if _, err := db.Exec(create_query); err != nil { + return nil, fmt.Errorf("failed to create mysql table: %v", err) + } } // Setup the backend. From e1e225cc7794abbabc7bc13ad2ffbf934f2ec695 Mon Sep 17 00:00:00 2001 From: Antergone Date: Tue, 19 Dec 2017 23:46:41 +0800 Subject: [PATCH 2/2] add query condition and fix row close err --- physical/mysql/mysql.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/physical/mysql/mysql.go b/physical/mysql/mysql.go index 1b68516d526b..018f9fb55066 100644 --- a/physical/mysql/mysql.go +++ b/physical/mysql/mysql.go @@ -103,20 +103,20 @@ func NewMySQLBackend(conf map[string]string, logger log.Logger) (physical.Backen // Check schema exists var schemaExist bool schemaRows, err := db.Query("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?", database) - defer schemaRows.Close() if err != nil { return nil, fmt.Errorf("failed to check mysql schema exist: %v", err) } + defer schemaRows.Close() schemaExist = schemaRows.Next() // Check table exists var tableExist bool - tableRows, err := db.Query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = ?", table) - defer tableRows.Close() + tableRows, err := db.Query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", table, database) if err != nil { return nil, fmt.Errorf("failed to check mysql table exist: %v", err) } + defer tableRows.Close() tableExist = tableRows.Next() // Create the required database if it doesn't exists.