summaryrefslogtreecommitdiff
path: root/model/mysql/mysql.go
diff options
context:
space:
mode:
Diffstat (limited to 'model/mysql/mysql.go')
-rw-r--r--model/mysql/mysql.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/model/mysql/mysql.go b/model/mysql/mysql.go
new file mode 100644
index 0000000..08c55bc
--- /dev/null
+++ b/model/mysql/mysql.go
@@ -0,0 +1,84 @@
+package mysql
+
+import (
+ "database/sql"
+ "fmt"
+ _ "github.com/go-sql-driver/mysql"
+ "kch42.de/gostuff/mailremind/model"
+ "strconv"
+)
+
+type scanner interface {
+ Scan(dest ...interface{}) error
+}
+
+type DBID uint64
+
+func (id DBID) String() string {
+ return strconv.FormatUint(uint64(id), 16)
+}
+
+func parseDBID(s string) (model.DBID, error) {
+ _id, err := strconv.ParseUint(s, 16, 64)
+ return DBID(_id), err
+}
+
+type MySQLDBCon struct {
+ con *sql.DB
+ stmt []*sql.Stmt
+}
+
+func connect(dbconf string) (model.DBCon, error) {
+ con, err := sql.Open("mysql", dbconf)
+ if err != nil {
+ return nil, err
+ }
+
+ dbc := &MySQLDBCon{
+ con: con,
+ stmt: make([]*sql.Stmt, qEnd),
+ }
+
+ for i := 0; i < qEnd; i++ {
+ stmt, err := con.Prepare(queries[i])
+ if err != nil {
+ con.Close()
+ return nil, fmt.Errorf("Failed to prepare statement %d : <%s>: %s", i, queries[i], err)
+ }
+ dbc.stmt[i] = stmt
+ }
+
+ return dbc, nil
+}
+
+func init() {
+ model.Register("mysql", model.DBInfo{
+ Connect: connect,
+ ParseDBID: parseDBID,
+ })
+}
+
+func (con *MySQLDBCon) Close() {
+ con.con.Close()
+}
+
+func rollbackAfterFail(err error, tx *sql.Tx) error {
+ if rberr := tx.Rollback(); rberr != nil {
+ return fmt.Errorf("Rollback error: <%s>, Original error: %s", rberr, err)
+ }
+ return err
+}
+
+func i2b(i int) bool {
+ if i == 0 {
+ return false
+ }
+ return true
+}
+
+func b2i(b bool) int {
+ if b {
+ return 1
+ }
+ return 0
+}