mysql.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package sql
  2. import (
  3. "database/sql"
  4. "errors"
  5. "strings"
  6. // _ "github.com/go-sql-driver/mysql"
  7. _ "github.com/go-sql-driver/mysql"
  8. )
  9. //SQL ...
  10. type SQL struct {
  11. db *sql.DB
  12. err error
  13. }
  14. /* NewSQL
  15. @parameter server string (ex: myserver.com:3306)
  16. @parameter login string
  17. @parameter mdp string
  18. @parameter base string
  19. */
  20. func NewMySQL(server, login, mdp, base string) *SQL {
  21. db, err := Connect(server, login, mdp, base)
  22. if err != nil {
  23. panic(err.Error())
  24. }
  25. s := new(SQL)
  26. s.db = db
  27. s.err = err
  28. return s
  29. }
  30. // Connect (Use NewMySQL for the connection)
  31. func Connect(server, login, mdp, base string) (*sql.DB, error) {
  32. db, err := sql.Open("mysql", login+":"+mdp+"@tcp("+server+")/"+base)
  33. return db, err
  34. }
  35. /* Insert
  36. @parameter table string
  37. @parameter column []string (optional is nil (INSERT INTO table VALUES ( , , ,)))
  38. @parameter values []string
  39. @return error
  40. */
  41. func (s *SQL) Insert(table string, columns []string, values [][]string) error {
  42. if len(table) <= 0 || values == nil {
  43. return errors.New("Incorrect parameters.")
  44. }
  45. if columns != nil {
  46. for _, v := range values {
  47. if len(v) != len(columns) {
  48. return errors.New("It does not have the number of columns and values.")
  49. }
  50. }
  51. }
  52. if values == nil {
  53. return errors.New("Values is null.")
  54. }
  55. cols := "("
  56. if columns != nil {
  57. for i, column := range columns {
  58. if i != 0 {
  59. cols += ", "
  60. }
  61. cols += column
  62. }
  63. cols += ")"
  64. }
  65. vals := ""
  66. for j, value := range values {
  67. if j != 0 {
  68. vals += ", "
  69. }
  70. vals += "("
  71. for i := 0; i < len(value); i++ {
  72. if i != 0 {
  73. vals += ", "
  74. }
  75. if value[i] != "" {
  76. vals += "'" + value[i] + "'"
  77. } else {
  78. vals += "null"
  79. }
  80. }
  81. vals += ")"
  82. }
  83. sql := "INSERT INTO " + table
  84. if columns != nil {
  85. sql += " " + cols + " VALUES " + vals + ";"
  86. } else {
  87. sql += " VALUES " + vals + ";"
  88. }
  89. insert, err := s.db.Query(sql)
  90. if err != nil || insert.Err() != nil {
  91. return errors.New("error syntax : " + sql)
  92. }
  93. defer insert.Close()
  94. return nil
  95. }
  96. /* DeleteAND
  97. @parameter table string
  98. @parameter wheres [][]string (Each line is combined with AND)
  99. @return error
  100. */
  101. func (s *SQL) DeleteAND(table string, wheres [][]string) error {
  102. if len(table) <= 0 || wheres == nil {
  103. return errors.New("Incorrect parameter")
  104. }
  105. lines := ""
  106. flag := 0
  107. for _, where := range wheres {
  108. if flag != 0 {
  109. lines += " AND "
  110. }
  111. lines += where[0] + " = '" + where[1] + "'"
  112. flag = 1
  113. }
  114. sql := "DELETE FROM " + table + " WHERE " + lines + ";"
  115. delete, err := s.db.Query(sql)
  116. if err != nil || delete.Err() != nil {
  117. return errors.New("error syntax : " + sql)
  118. }
  119. defer delete.Close()
  120. return nil
  121. }
  122. /* UpdateAND
  123. @parameter table string
  124. @parameter sets [][]string
  125. @parameter wheres [][]string (Each line is combined with AND)
  126. @return error
  127. */
  128. func (s *SQL) UpdateAND(table string, sets [][]string, wheres [][]string) error {
  129. if len(table) <= 0 || sets == nil || wheres == nil {
  130. return errors.New("parameter incorrect")
  131. }
  132. conds := ""
  133. flag := 0
  134. for _, where := range wheres {
  135. if flag != 0 {
  136. conds += " AND "
  137. }
  138. conds += where[0] + " = '" + where[1] + "'"
  139. flag = 1
  140. }
  141. vls := ""
  142. flagA := 0
  143. for _, set := range sets {
  144. if flagA != 0 {
  145. vls += ", "
  146. }
  147. vls += set[0] + " = '" + set[1] + "'"
  148. flagA = 1
  149. }
  150. sql := "UPDATE " + table + " SET " + vls + " WHERE " + conds + ";"
  151. update, err := s.db.Query(sql)
  152. if err != nil || update.Err() != nil {
  153. return errors.New("error syntax : " + sql)
  154. }
  155. defer update.Close()
  156. return nil
  157. }
  158. /*
  159. SelectAND
  160. @parameter table string
  161. @parameter colvals [][]string (Each line is combined with AND) (optional is nil (SELECT * FROM table;))
  162. @return [column][row]string, error
  163. */
  164. func (s *SQL) SelectAND(table string, colvals [][]string) ([][]string, error) {
  165. if len(table) <= 0 {
  166. return nil, errors.New("parameter incorrect")
  167. }
  168. var rsltRow [][]string
  169. var requete string = "SELECT * FROM " + table
  170. if colvals != nil {
  171. requete += " WHERE "
  172. for i, colval := range colvals {
  173. if i != 0 {
  174. requete += " AND "
  175. }
  176. if strings.IndexRune(colval[1], '*') > 0 {
  177. requete += colval[0] + " LIKE '" + colval[1] + "'"
  178. } else {
  179. requete += colval[0] + " = '" + colval[1] + "'"
  180. }
  181. }
  182. }
  183. requete += ";"
  184. rcolumns, _ := s.db.Query(requete)
  185. columns, _ := rcolumns.ColumnTypes()
  186. for _, column := range columns {
  187. rows, _ := s.db.Query(strings.Replace(requete, "*", column.Name(), 1))
  188. var bytes []byte
  189. var rsltCol []string
  190. rsltCol = append(rsltCol, column.Name())
  191. for rows.Next() {
  192. err := rows.Scan(&bytes)
  193. if err != nil {
  194. panic(err.Error())
  195. }
  196. rsltCol = append(rsltCol, string(bytes[:]))
  197. }
  198. rsltRow = append(rsltRow, rsltCol)
  199. defer rows.Close()
  200. }
  201. return rsltRow, nil
  202. }
  203. /*
  204. Close
  205. */
  206. func (s *SQL) Close() {
  207. defer s.db.Close()
  208. }