github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/db/sys_db.go (about)

     1  package db
     2  
     3  import (
     4  	"database/sql"
     5  	"errors"
     6  	"fmt"
     7  	"strings"
     8  	"time"
     9  	//_ "github.com/mattn/go-oci8"
    10  	//_ "github.com/mattn/go-sqlite3"
    11  	//_ "gopkg.in/rana/ora.v4"
    12  )
    13  
    14  /*
    15  github.com/mattn/go-oci8
    16  
    17  http://www.simonzhang.net/?p=2890
    18  http://blog.sina.com.cn/s/blog_48c95a190102w2ln.html
    19  http://www.tudou.com/programs/view/yet9OngrV_4/
    20  https://github.com/wendal/go-oci8/downloads
    21  https://github.com/wendal/go-oci8
    22  
    23  安装方法
    24  1. 下载:http://www.oracle.com/technetwork/database/features/instant-client/index.html
    25  2. 解压文件 unzip instantclient-basic-linux.x64-12.1.0.1.0.zip -d /usr/local/
    26  3. 配置环境变量
    27  vi .bash_profile
    28  export ora_home=/usr/local/instantclient_12_1
    29  export PATH=$PATH:$ora_home
    30  export LD_LIBRARY_PATH=$ora_home
    31  
    32  
    33  */
    34  
    35  const (
    36  	//SQLITE3 Sqlite3数据库
    37  	SQLITE3 = "sqlite3"
    38  	//OCI8 oralce数据库
    39  	OCI8 = "oci8"
    40  	//ORA  oralce数据库
    41  	ORA = "ora"
    42  )
    43  
    44  type ISysDB interface {
    45  	Query(string, ...interface{}) (QueryRows, []string, error)
    46  	Execute(string, ...interface{}) (int64, error)
    47  	Executes(string, ...interface{}) (int64, int64, error)
    48  	Begin() (ISysDBTrans, error)
    49  	Close()
    50  }
    51  
    52  //ISysDBTrans 数据库事务接口
    53  type ISysDBTrans interface {
    54  	Query(string, ...interface{}) (QueryRows, []string, error)
    55  	Execute(string, ...interface{}) (int64, error)
    56  	Executes(query string, args ...interface{}) (lastInsertId, affectedRow int64, err error)
    57  	Rollback() error
    58  	Commit() error
    59  }
    60  
    61  //SysDB 数据库实体
    62  type SysDB struct {
    63  	provider   string
    64  	connString string
    65  	db         *sql.DB
    66  	maxIdle    int
    67  	maxOpen    int
    68  }
    69  
    70  //NewSysDB 创建DB实例
    71  func NewSysDB(provider string, connString string, maxOpen int, maxIdle int, maxLifeTime time.Duration) (obj *SysDB, err error) {
    72  	if provider == "" || connString == "" {
    73  		err = errors.New("provider or connString not allow nil")
    74  		return
    75  	}
    76  	obj = &SysDB{provider: provider, connString: connString}
    77  	switch strings.ToLower(provider) {
    78  	case "ora", "oracle":
    79  		obj.db, err = sql.Open(OCI8, connString)
    80  	case "sqlite":
    81  		obj.db, err = sql.Open(SQLITE3, connString)
    82  	default:
    83  		obj.db, err = sql.Open(provider, connString)
    84  	}
    85  	if err != nil {
    86  		return
    87  	}
    88  	obj.db.SetMaxIdleConns(maxIdle)
    89  	obj.db.SetMaxOpenConns(maxOpen)
    90  	obj.db.SetConnMaxLifetime(maxLifeTime)
    91  	err = obj.db.Ping()
    92  	return
    93  }
    94  
    95  //Query 执行SQL查询语句
    96  func (db *SysDB) Query(query string, args ...interface{}) (dataRows QueryRows, colus []string, err error) {
    97  	rows, err := db.db.Query(query, args...)
    98  	if err != nil {
    99  		if rows != nil {
   100  			rows.Close()
   101  		}
   102  		return
   103  	}
   104  	defer rows.Close()
   105  	dataRows, colus, err = resolveRows(rows, 0)
   106  	return
   107  
   108  }
   109  
   110  func resolveRows(rows *sql.Rows, col int) (dataRows []QueryRow, columns []string, err error) {
   111  	dataRows = make([]QueryRow, 0)
   112  	colus, err := rows.Columns()
   113  	if err != nil {
   114  		return
   115  	}
   116  	columns = make([]string, 0, len(colus))
   117  	for _, v := range colus {
   118  		columns = append(columns, strings.ToLower(v))
   119  	}
   120  
   121  	for rows.Next() {
   122  		row := make(QueryRow)
   123  		dataRows = append(dataRows, row)
   124  		var buffer []interface{}
   125  		for index := 0; index < len(columns); index++ {
   126  			var va []byte
   127  			buffer = append(buffer, &va)
   128  		}
   129  		err = rows.Scan(buffer...)
   130  		if err != nil {
   131  			return
   132  		}
   133  		for index := 0; index < len(columns) && (index < col || col == 0); index++ {
   134  			key := columns[index]
   135  			value := buffer[index]
   136  			if value == nil {
   137  				continue
   138  			} else {
   139  				//	buff := value.(*[]byte)
   140  				//row[key] = bytes.NewBuffer(*buff).String()
   141  				row[key] = strings.TrimPrefix(fmt.Sprintf("%s", value), "&")
   142  			}
   143  		}
   144  	}
   145  	return
   146  }
   147  
   148  //Executes 执行SQL操作语句
   149  func (db *SysDB) Executes(query string, args ...interface{}) (lastInsertId, affectedRow int64, err error) {
   150  	result, err := db.db.Exec(query, args...)
   151  	if err != nil {
   152  		return
   153  	}
   154  	lastInsertId, err = result.LastInsertId()
   155  	affectedRow, err = result.RowsAffected()
   156  	return
   157  }
   158  
   159  //Execute 执行SQL操作语句
   160  func (db *SysDB) Execute(query string, args ...interface{}) (affectedRow int64, err error) {
   161  	result, err := db.db.Exec(query, args...)
   162  	if err != nil {
   163  		return
   164  	}
   165  	return result.RowsAffected()
   166  }
   167  
   168  //Begin 创建一个事务请求
   169  func (db *SysDB) Begin() (r ISysDBTrans, err error) {
   170  	t := &SysDBTransaction{}
   171  	t.tx, err = db.db.Begin()
   172  	return t, err
   173  }
   174  
   175  func (db *SysDB) Print() {
   176  	fmt.Printf("maxIdle: %+v\n", db.db.Stats())
   177  	fmt.Println("maxOpen: ", db.maxOpen)
   178  }
   179  func (db *SysDB) Close() {
   180  	db.db.Close()
   181  }