Skip to content

Commit

Permalink
修改内置interface的默认实现,修改DefaultFactory,使之能更好的集成多种数据源
Browse files Browse the repository at this point in the history
  • Loading branch information
xfali committed Jan 16, 2020
1 parent 531e455 commit b159980
Show file tree
Hide file tree
Showing 11 changed files with 256 additions and 132 deletions.
25 changes: 11 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,17 @@ foreach | foreach 允许指定一个集合,声明可以在元素体内使用

```
func InitDB() *gobatis.SessionManager {
fac := factory.DefaultFactory{
Host: "localhost",
Port: 3306,
DBName: "test",
Username: "root",
Password: "123",
Charset: "utf8",
MaxConn: 1000,
MaxIdleConn: 500,
Log: logging.DefaultLogf,
}
fac.Init()
fac := gobatis.NewFactory(
gobatis.SetMaxConn(100),
gobatis.SetMaxIdleConn(50),
gobatis.SetDataSource(&datasource.MysqlDataSource{
Host: "localhost",
Port: 3306,
DBName: "test",
Username: "root",
Password: "123",
Charset: "utf8",
}))
return gobatis.NewSessionManager(&fac)
}
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,19 @@ import (
"github.com/xfali/gobatis/util"
)

type MysqlConnection sql.DB
type MysqlStatement sql.Stmt
type DefaultConnection sql.DB
type DefaultStatement sql.Stmt

func (c *MysqlConnection) Prepare(sqlStr string) (statement.Statement, error) {
func (c *DefaultConnection) Prepare(sqlStr string) (statement.Statement, error) {
db := (*sql.DB)(c)
s, err := db.Prepare(sqlStr)
if err != nil {
return nil, errors.CONNECTION_PREPARE_ERROR
}
return (*MysqlStatement)(s), nil
return (*DefaultStatement)(s), nil
}

func (c *MysqlConnection) Query(ctx context.Context, result reflection.Object, sqlStr string, params ...interface{}) error {
func (c *DefaultConnection) Query(ctx context.Context, result reflection.Object, sqlStr string, params ...interface{}) error {
db := (*sql.DB)(c)
rows, err := db.QueryContext(ctx, sqlStr, params...)
if err != nil {
Expand All @@ -42,12 +42,12 @@ func (c *MysqlConnection) Query(ctx context.Context, result reflection.Object, s
return nil
}

func (c *MysqlConnection) Exec(ctx context.Context, sqlStr string, params ...interface{}) (common.Result, error) {
func (c *DefaultConnection) Exec(ctx context.Context, sqlStr string, params ...interface{}) (common.Result, error) {
db := (*sql.DB)(c)
return db.ExecContext(ctx, sqlStr, params...)
}

func (s *MysqlStatement) Query(ctx context.Context, result reflection.Object, params ...interface{}) error {
func (s *DefaultStatement) Query(ctx context.Context, result reflection.Object, params ...interface{}) error {
stmt := (*sql.Stmt)(s)
rows, err := stmt.QueryContext(ctx, params...)
if err != nil {
Expand All @@ -59,12 +59,12 @@ func (s *MysqlStatement) Query(ctx context.Context, result reflection.Object, pa
return nil
}

func (s *MysqlStatement) Exec(ctx context.Context, params ...interface{}) (common.Result, error) {
func (s *DefaultStatement) Exec(ctx context.Context, params ...interface{}) (common.Result, error) {
stmt := (*sql.Stmt)(s)
return stmt.ExecContext(ctx, params...)
}

func (s *MysqlStatement) Close() {
func (s *DefaultStatement) Close() {
stmt := (*sql.Stmt)(s)
stmt.Close()
}
2 changes: 1 addition & 1 deletion datasource/datasource.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ package datasource

type DataSource interface {
DriverName() string
Url() string
Info() string
}
2 changes: 1 addition & 1 deletion datasource/mysql_datasource.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ func (ds *MysqlDataSource) DriverName() string {
return "mysql"
}

func (ds *MysqlDataSource) Url() string {
func (ds *MysqlDataSource) Info() string {
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", ds.Username, ds.Password, ds.Host, ds.Port, ds.DBName, ds.Charset)
}
28 changes: 28 additions & 0 deletions datasource/postgre_datasource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright (C) 2019, Xiongfa Li.
// All right reserved.
// @author xiongfa.li
// @version V1.0
// Description:

package datasource

import "fmt"

//import _ "github.com/lib/pq"

type PostgreDataSource struct {
Host string
Port int
DBName string
Username string
Password string
SslMode string
}

func (ds *PostgreDataSource) DriverName() string {
return "postgres"
}

func (ds *PostgreDataSource) Info() string {
return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", ds.Host, ds.Port, ds.Username, ds.Password, ds.DBName, ds.SslMode)
}
69 changes: 36 additions & 33 deletions errors/errcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,39 +16,42 @@ type ErrCode struct {
fmtErr string `json:"-"`
}

var PARSE_MODEL_TABLEINFO_FAILED *ErrCode = New("11001", "Parse Model's table info failed")
var MODEL_NOT_REGISTER *ErrCode = New("11002", "Register model not found")
var OBJECT_NOT_SUPPORT *ErrCode = New("11101", "Object not support")
var PARSE_OBJECT_NOT_STRUCT *ErrCode = New("11102", "Parse interface's info but not a struct")
var PARSE_OBJECT_NOT_SLICE *ErrCode = New("11103", "Parse interface's info but not a slice")
var PARSE_OBJECT_NOT_MAP *ErrCode = New("11104", "Parse interface's info but not a map")
var PARSE_OBJECT_NOT_SIMPLETYPE *ErrCode = New("11105", "Parse interface's info but not a simple type")
var SLICE_SLICE_NOT_SUPPORT *ErrCode = New("11106", "Parse interface's info: [][]slice not support")
var GET_OBJECTINFO_FAILED *ErrCode = New("11121", "Parse interface's info failed")
var SQL_ID_DUPLICATES *ErrCode = New("11205", "Sql id is duplicates")
var DESERIALIZE_FAILED *ErrCode = New("11206", "Deserialize value failed")
var PARSE_SQL_VAR_ERROR *ErrCode = New("12001", "SQL PARSE ERROR")
var PARSE_SQL_PARAM_ERROR *ErrCode = New("12002", "SQL PARSE parameter error")
var PARSE_SQL_PARAM_VAR_NUMBER_ERROR *ErrCode = New("12003", "SQL PARSE parameter var number error")
var PARSE_DYNAMIC_SQL_ERROR *ErrCode = New("12010", "Parse dynamic sql error")
var EXECUTOR_COMMIT_ERROR *ErrCode = New("21001", "executor was closed when transaction commit")
var EXECUTOR_BEGIN_ERROR *ErrCode = New("21002", "executor was closed when transaction begin")
var EXECUTOR_QUERY_ERROR *ErrCode = New("21003", "executor was closed when exec sql")
var EXECUTOR_GET_CONNECTION_ERROR *ErrCode = New("21003", "executor get connection error")
var TRANSACTION_WITHOUT_BEGIN *ErrCode = New("22001", "Transaction without begin")
var TRANSACTION_COMMIT_ERROR *ErrCode = New("22002", "Transaction commit error")
var TRANSACTION_BUSINESS_ERROR *ErrCode = New("22003", "Business error in transaction")
var CONNECTION_PREPARE_ERROR *ErrCode = New("23001", "Connection prepare error")
var STATEMENT_QUERY_ERROR *ErrCode = New("24001", "statement query error")
var STATEMENT_EXEC_ERROR *ErrCode = New("24002", "statement exec error")
var QUERY_TYPE_ERROR *ErrCode = New("25001", "select data convert error")
var RESULT_POINTER_IS_NIL *ErrCode = New("31000", "result type is a nil pointer")
var RESULT_ISNOT_POINTER *ErrCode = New("31001", "result type is not pointer")
var RESULT_PTR_VALUE_IS_POINTER *ErrCode = New("31002", "result type is pointer of pointer")
var RUNNER_NOT_READY *ErrCode = New("31003", "Runner not ready, may sql or param have some error")
var RESULT_NAME_NOT_FOUND *ErrCode = New("31004", "result name not found")
var RESULT_SELECT_EMPTY_VALUE *ErrCode = New("31005", "select return empty value")
var RESULT_SET_VALUE_FAILED *ErrCode = New("31006", "result set value failed")
var (
FACTORY_INITED = New("10002", "Factory have been initialized")
PARSE_MODEL_TABLEINFO_FAILED = New("11001", "Parse Model's table info failed")
MODEL_NOT_REGISTER = New("11002", "Register model not found")
OBJECT_NOT_SUPPORT = New("11101", "Object not support")
PARSE_OBJECT_NOT_STRUCT = New("11102", "Parse interface's info but not a struct")
PARSE_OBJECT_NOT_SLICE = New("11103", "Parse interface's info but not a slice")
PARSE_OBJECT_NOT_MAP = New("11104", "Parse interface's info but not a map")
PARSE_OBJECT_NOT_SIMPLETYPE = New("11105", "Parse interface's info but not a simple type")
SLICE_SLICE_NOT_SUPPORT = New("11106", "Parse interface's info: [][]slice not support")
GET_OBJECTINFO_FAILED = New("11121", "Parse interface's info failed")
SQL_ID_DUPLICATES = New("11205", "Sql id is duplicates")
DESERIALIZE_FAILED = New("11206", "Deserialize value failed")
PARSE_SQL_VAR_ERROR = New("12001", "SQL PARSE ERROR")
PARSE_SQL_PARAM_ERROR = New("12002", "SQL PARSE parameter error")
PARSE_SQL_PARAM_VAR_NUMBER_ERROR = New("12003", "SQL PARSE parameter var number error")
PARSE_DYNAMIC_SQL_ERROR = New("12010", "Parse dynamic sql error")
EXECUTOR_COMMIT_ERROR = New("21001", "executor was closed when transaction commit")
EXECUTOR_BEGIN_ERROR = New("21002", "executor was closed when transaction begin")
EXECUTOR_QUERY_ERROR = New("21003", "executor was closed when exec sql")
EXECUTOR_GET_CONNECTION_ERROR = New("21003", "executor get connection error")
TRANSACTION_WITHOUT_BEGIN = New("22001", "Transaction without begin")
TRANSACTION_COMMIT_ERROR = New("22002", "Transaction commit error")
TRANSACTION_BUSINESS_ERROR = New("22003", "Business error in transaction")
CONNECTION_PREPARE_ERROR = New("23001", "Connection prepare error")
STATEMENT_QUERY_ERROR = New("24001", "statement query error")
STATEMENT_EXEC_ERROR = New("24002", "statement exec error")
QUERY_TYPE_ERROR = New("25001", "select data convert error")
RESULT_POINTER_IS_NIL = New("31000", "result type is a nil pointer")
RESULT_ISNOT_POINTER = New("31001", "result type is not pointer")
RESULT_PTR_VALUE_IS_POINTER = New("31002", "result type is pointer of pointer")
RUNNER_NOT_READY = New("31003", "Runner not ready, may sql or param have some error")
RESULT_NAME_NOT_FOUND = New("31004", "result name not found")
RESULT_SELECT_EMPTY_VALUE = New("31005", "select return empty value")
RESULT_SET_VALUE_FAILED = New("31006", "result set value failed")
)

func New(code, message string) *ErrCode {
ret := &ErrCode{
Expand Down
78 changes: 78 additions & 0 deletions faccreator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (C) 2019, Xiongfa Li.
// All right reserved.
// @author xiongfa.li
// @version V1.0
// Description:

package gobatis

import (
"github.com/xfali/gobatis/datasource"
"github.com/xfali/gobatis/factory"
"github.com/xfali/gobatis/logging"
"time"
)

type FacOpt func(f *factory.DefaultFactory)

func NewFactory(opts ...FacOpt) factory.Factory {
f := &factory.DefaultFactory{
Log: logging.DefaultLogf,
}

if len(opts) > 0 {
for _, opt := range opts {
opt(f)
}
}

//For compatibility with older versions
if f.DataSource == nil {
f.DataSource = &datasource.MysqlDataSource{
Host: f.Host,
Port: f.Port,
DBName: f.DBName,
Username: f.Username,
Password: f.Password,
Charset: f.Charset,
}
}

if f.InitDB() != nil {
return nil
}

return f
}

func SetMaxConn(v int) FacOpt {
return func(f *factory.DefaultFactory) {
f.MaxConn = v
}
}

func SetMaxIdleConn(v int) FacOpt {
return func(f *factory.DefaultFactory) {
f.MaxIdleConn = v
}
}

func SetConnMaxLifetime(v time.Duration) FacOpt {
return func(f *factory.DefaultFactory) {
f.ConnMaxLifetime = v
}
}

func SetLog(v logging.LogFunc) FacOpt {
return func(f *factory.DefaultFactory) {
f.Log = v
}
}

func SetDataSource(v datasource.DataSource) FacOpt {
return func(f *factory.DefaultFactory) {
f.WithLock(func(fac *factory.DefaultFactory) {
fac.DataSource = v
})
}
}
Loading

0 comments on commit b159980

Please sign in to comment.