-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDB.go
More file actions
114 lines (88 loc) · 1.75 KB
/
DB.go
File metadata and controls
114 lines (88 loc) · 1.75 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package utils
import (
"database/sql"
"errors"
"sync"
)
type SqlTx struct {
*sql.Tx
db *SqlDB
}
type SqlOp interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Query(query string, args ...interface{}) (*sql.Rows, error)
QueryRow(query string, args ...interface{}) *sql.Row
Rollback() error
Close() error
Commit() error
Begin() (SqlOp, error)
}
func (this *SqlTx) Close() error {
return this.Commit()
}
func (this *SqlTx) Begin() (SqlOp, error) {
return this, nil
}
func (this *SqlDB) Commit() error {
return errors.New("不支持的方法!")
}
func (this *SqlTx) Commit() error {
this.db.txLock.Lock()
defer this.db.txLock.Unlock()
this.db.txLevel--
if this.db.txLevel == 0 {
this.db.tx = nil
return this.Tx.Commit()
} else {
return nil
}
}
func (this *SqlDB) Rollback() error {
return errors.New("不支持的方法!")
}
func (this *SqlTx) Rollback() error {
this.db.txLock.Lock()
defer this.db.txLock.Unlock()
this.db.txLevel = 0
this.db.tx = nil
return this.Tx.Rollback()
}
type SqlDB struct {
*sql.DB
tx *SqlTx
txLevel int
txLock sync.Mutex
}
func (this *SqlDB) Begin() (SqlOp, error) {
this.txLock.Lock()
defer this.txLock.Unlock()
if this.txLevel == 0 {
tx, err := this.DB.Begin()
if err != nil {
return nil, err
} else {
this.tx = new(SqlTx)
this.tx.Tx = tx
this.tx.db = this
}
}
this.txLevel++
return this.tx, nil
}
func (this *SqlDB) Close() error {
return this.DB.Close()
}
func OpenDatabase(driverName, dataSourceName string) (SqlOp, error) {
db, err := sql.Open(driverName, dataSourceName)
sqldb := new(SqlDB)
sqldb.DB = db
sqldb.txLevel = 0
sqldb.tx = nil
err = db.Ping()
return sqldb, err
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}