-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathengine_mysql.go
110 lines (89 loc) · 2.5 KB
/
engine_mysql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package migrator
import (
"database/sql"
//custom engine
_ "github.com/go-sql-driver/mysql"
"strings"
)
//EngineMysql - engine to execute queries in MySQL
type EngineMysql struct {
dsn string
connection *sql.DB
table string
}
//GetEngineMysql - get engine object with connection config like "user:pass@/dbname?charset=utf8"
func GetEngineMysql(dsn string) *EngineMysql {
return &EngineMysql{dsn: dsn}
}
const (
migrationsMysql = "CREATE TABLE {TABLE} (" +
"`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"`hash` varchar(32) NOT NULL," +
"`statement` varchar(600) NOT NULL," +
"`created_at` datetime DEFAULT '0000-00-00 00:00:00' NOT NULL" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
)
//PrepareConnection - init connection and migrations table
func (engine *EngineMysql) PrepareConnection(tableName string) error {
engine.table = tableName
conn, err := sql.Open("mysql", engine.dsn)
if err != nil {
return err
}
engine.connection = conn
isExists, err := engine.isMigrationsTableExists()
if err != nil {
return err
}
if !isExists {
err := engine.ExecQuery(strings.Replace(migrationsMysql, "{TABLE}", engine.table, 1))
if err != nil {
return err
}
}
return nil
}
//ExecQuery - execute one query
func (engine *EngineMysql) ExecQuery(query string) error {
_, err := engine.connection.Exec(query)
return err
}
//IsMigrationApplied - is migration already executed (pass query md5-hash as parameter)
func (engine *EngineMysql) IsMigrationApplied(hash string) (bool, error) {
var count int
err := engine.connection.QueryRow(
"SELECT COUNT(*) AS m_count FROM "+engine.table+" WHERE hash = ?",
hash,
).Scan(&count)
if err != nil {
return false, err
}
return count > 0, nil
}
//RegisterMigration - add new migration record to table
func (engine *EngineMysql) RegisterMigration(hash, query string) error {
prepared, err := engine.connection.Prepare(
"INSERT INTO " + engine.table + " SET hash = ?, statement = ?",
)
if err != nil {
return err
}
_, err = prepared.Exec(hash, query)
return err
}
//Disconnect - do a cleanup
func (engine *EngineMysql) Disconnect() {
_ = engine.connection.Close()
}
//isMigrationsTableExists - if migrations table exists
func (engine *EngineMysql) isMigrationsTableExists() (bool, error) {
var exist string
err := engine.connection.QueryRow("SHOW TABLES LIKE '" + engine.table + "'").Scan(&exist)
if err == sql.ErrNoRows {
return false, nil
}
if err != nil {
return false, err
}
return exist == engine.table, nil
}