You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.6 KiB
72 lines
1.6 KiB
package mysql_store
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
)
|
|
|
|
var maxOpen int = 100
|
|
|
|
type MysqlStore struct {
|
|
Client *sql.DB
|
|
table string
|
|
fnameCol string
|
|
fidCol string
|
|
getStmt *sql.Stmt
|
|
putStmt *sql.Stmt
|
|
delStmt *sql.Stmt
|
|
}
|
|
|
|
func NewMysqlStore(dataSourceName string, table, fnameCol, fidCol string) (m *MysqlStore, err error) {
|
|
db, err := sql.Open("mysql", dataSourceName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db.SetMaxOpenConns(maxOpen)
|
|
db.SetMaxIdleConns(maxOpen / 2)
|
|
getStmt, err := db.Prepare(fmt.Sprintf("select %s from %s where %s=?", fidCol, table, fnameCol))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
putStmt, err := db.Prepare(fmt.Sprintf("insert into %s(%s,%s) values(?,?)", table, fnameCol, fidCol))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
delStmt, err := db.Prepare(fmt.Sprintf("delete from %s where %s=?", table, fnameCol))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &MysqlStore{db, table, fnameCol, fidCol, getStmt, putStmt, delStmt}, nil
|
|
}
|
|
|
|
func (s *MysqlStore) Get(fullFileName string) (fid string, err error) {
|
|
err = s.getStmt.QueryRow(fullFileName).Scan(&fid)
|
|
return fid, err
|
|
}
|
|
|
|
func (s *MysqlStore) Put(fullFileName string, fid string) (err error) {
|
|
_, err = s.putStmt.Exec(fullFileName, fid)
|
|
return err
|
|
}
|
|
|
|
func (s *MysqlStore) Delete(fullFileName string) (err error) {
|
|
_, err = s.delStmt.Exec(fullFileName)
|
|
return err
|
|
}
|
|
|
|
func (s *MysqlStore) Close() {
|
|
if s.getStmt != nil {
|
|
s.getStmt.Close()
|
|
}
|
|
if s.putStmt != nil {
|
|
s.putStmt.Close()
|
|
}
|
|
if s.delStmt != nil {
|
|
s.delStmt.Close()
|
|
}
|
|
if s.Client != nil {
|
|
s.Client.Close()
|
|
}
|
|
}
|