-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.go
More file actions
126 lines (111 loc) · 2.67 KB
/
Copy pathdatabase.go
File metadata and controls
126 lines (111 loc) · 2.67 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
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
type Database struct {
conn *sql.DB
}
func (d *Database) ConnectionString() string {
return SQL_USER + ":" + SQL_PASS + "@tcp(" + SQL_HOST + ":" + SQL_PORT + ")/" + SQL_DB
}
func (d *Database) Open() bool {
conn := d.ConnectionString();
fmt.Println("Connecting to: ", conn)
db, err := sql.Open("mysql", conn)
if err != nil {
fmt.Println(err.Error())
}
d.conn = db
d.conn.SetMaxOpenConns(MAX_CONNECTIONS)
// Check that we can ping the DB box as the connection is lazy loaded when we fire the query
err = d.conn.Ping()
if err != nil {
fmt.Println(err.Error())
}
return true
}
// Given a query string and a list of variadic parameters bindings this
// method will
func (d *Database) Query(query string, parameters ...interface{}) (*sql.Rows, error) {
if d.conn == nil {
fmt.Println("Spawning a new connection")
d.Open()
}
LogInDebugMode("Interfaces: ", parameters)
LogInDebugMode("Preparing query: " + query)
stmt, err := d.conn.Prepare(query)
if err != nil {
fmt.Println(err.Error())
return nil, err
}
defer stmt.Close()
if len(parameters) > 0 {
rows, err := stmt.Query(parameters...)
if err != nil {
fmt.Println("Error sending query: ", err.Error())
return nil, err
}
return rows, nil
} else {
rows, err := stmt.Query()
if err != nil {
fmt.Println("Error sending query: ", err.Error())
return nil, err
}
return rows, nil
}
}
func (d *Database) Insert(query string, parameters ...interface{}) (int64, error) {
tx, err := d.conn.Begin()
if err != nil {
fmt.Println("Error creating transaction: ", err.Error())
}
defer tx.Rollback()
stmt, err := tx.Prepare(query)
if err != nil {
fmt.Println("Error preparing insert query: ", err)
}
res, err := stmt.Exec(parameters...)
if err != nil {
fmt.Println("Exec err when inserting: ", err.Error())
} else {
id, err := res.LastInsertId()
if err != nil {
fmt.Println("Error when fetching last insert id: ", err.Error())
} else {
LogInDebugMode("returning iD: ", id)
err = tx.Commit()
if err != nil {
panic(err.Error())
}
stmt.Close()
return id, nil
}
}
err = tx.Commit()
if err != nil {
panic(err.Error())
}
stmt.Close()
return -1, err
}
func (d *Database) Close() {
if d.conn != nil {
fmt.Println("Closing DB connection")
err := d.conn.Close()
if err == nil {
fmt.Println("DB connection disposed successfully")
} else {
fmt.Println("Failed to close DB connection: ", err)
}
} else {
fmt.Println("DB Connection was already closed")
}
}
func (d *Database) CloseRows(rows *sql.Rows) {
if err := rows.Close(); err != nil {
fmt.Println("Close error: ", err)
}
}