/vendor/github.com/micro-plat/lib4go/db/sys_db.go

https://github.com/micro-plat/hydra · Go · 181 lines · 131 code · 15 blank · 35 comment · 30 complexity · 9166bae607f8afef61b18c95cee2ab94 MD5 · raw file

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