mysql.go 4.7 KB

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