-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.go
More file actions
98 lines (82 loc) · 1.72 KB
/
database.go
File metadata and controls
98 lines (82 loc) · 1.72 KB
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
package dbunit
import (
"database/sql"
"fmt"
"strings"
"sync/atomic"
"time"
)
type DriverName string
var (
id atomic.Int32
MySQLDriver DriverName = "mysql"
PostgresDriver DriverName = "postgres"
)
type database struct {
Name string
source string
db *sql.DB
adapter DBAdapter
}
func newDatabase(dsn string, schema string) *database {
newID := id.Add(1)
name := fmt.Sprintf("test_%d_%d", time.Now().UnixNano(), newID)
return newDatabaseWithName(dsn, name, schema)
}
func newDatabaseWithName(dsn string, name string, schema string) *database {
var adapter DBAdapter
if strings.HasPrefix(dsn, string(PostgresDriver)) {
adapter = &PostgresAdapter{}
} else {
adapter = &MySQLAdapter{}
}
db := &database{
Name: name,
source: dsn,
adapter: adapter,
}
err := db.connection()
if err != nil {
panic("test database connection fail," + err.Error())
}
err = db.create()
if err != nil {
panic("test database create database fail," + err.Error())
}
err = db.Import(schema)
if err != nil {
panic(err)
}
return db
}
func (d *database) DSN() string {
return d.adapter.DSN(d.source, d.Name)
}
func (d *database) connection() error {
db, err := d.adapter.Open(d.source)
if err != nil {
return err
}
d.db = db
return nil
}
func (d *database) Drop() error {
err := d.adapter.DropDatabase(d.db, d.Name)
if err != nil {
return err
}
d.db.Close()
return nil
}
func (d *database) create() error {
return d.adapter.CreateDatabase(d.db, d.Name)
}
func (d *database) Import(schema string) error {
// Import schema needs to connect to the new database
db, err := d.adapter.Open(d.DSN())
if err != nil {
return err
}
defer db.Close()
return d.adapter.ImportSchema(db, schema)
}