databaseutils.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package databaseutils
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "errors"
  6. "fmt"
  7. )
  8. var (
  9. DBUtil *DBUtils // DB handle for global access
  10. )
  11. const ( // Error constants
  12. ERR_EMPTY_RESULT = "ERR_EMPTY_RESULT"
  13. ERR_QUERY_FAILED = "ERR_QUERY_FAILED"
  14. ERR_NO_COLUMNS = "ERR_NO_COLUMNS"
  15. ERR_FAILED_ROW_SCAN = "ERR_FAILED_ROW_SCAN"
  16. )
  17. type DBUtils struct {
  18. User string
  19. Password string
  20. Host string
  21. Database string
  22. Handle *sql.DB
  23. }
  24. func (dbUtil *DBUtils) Connect() { // setup handle for db
  25. var err error
  26. dbUtil.Handle, err = sql.Open("mysql", dbUtil.User + ":" + dbUtil.Password + "@tcp(" + dbUtil.Host + ")/" + dbUtil.Database) // open handle
  27. if err != nil {
  28. panic(err.Error()) // TODO
  29. }
  30. err = dbUtil.Handle.Ping() // try to connect
  31. if err != nil {
  32. panic(err.Error()) // TODO
  33. }
  34. }
  35. func (dbUtil DBUtils) Close() {
  36. dbUtil.Handle.Close()
  37. }
  38. func (dbUtil DBUtils) GetString(what string, from string, where string, wherevalue string) string {
  39. var buf string
  40. rows, err := dbUtil.Handle.Query("SELECT " + what + " FROM " + from + " WHERE " + where + " = '" + wherevalue + "'") // TODO Parse?
  41. if err != nil {
  42. panic(err.Error()) // TODO
  43. }
  44. defer rows.Close()
  45. for rows.Next() {
  46. err := rows.Scan(&buf)
  47. if err != nil {
  48. panic(err.Error()) // TODO
  49. }
  50. }
  51. err = rows.Err()
  52. if err != nil {
  53. panic(err.Error()) // TODO
  54. }
  55. return buf
  56. }
  57. // GetRow(what, from, where, wherevalue)
  58. func (dbUtil DBUtils) GetRow(options ...string) ([]string, error) {
  59. var err error
  60. var rows *sql.Rows // TODO fix this weird bug
  61. if len(options) > 3 { // with or without where
  62. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1] + " WHERE " + options[2] + " = \"" + options[3] + "\"") // TODO Parse?
  63. } else {
  64. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1]) // TODO Parse?
  65. }
  66. defer rows.Close()
  67. if err != nil {
  68. panic(err.Error()) // TODO
  69. }
  70. cols, err := rows.Columns()
  71. if err != nil {
  72. return []string{""}, errors.New(ERR_NO_COLUMNS)
  73. }
  74. dest := make([]interface{}, len(cols)) // interface for scanning
  75. result := make([]sql.NullString, len(cols)) // NullString to check if empty
  76. results := make([]string, len(cols)) // final return-result
  77. for i, _ := range result {
  78. dest[i] = &result[i] // Put pointers to each string in the interface slice
  79. }
  80. for rows.Next() {
  81. err = rows.Scan(dest...) // copy results in dest
  82. if err != nil {
  83. return []string{""}, errors.New(ERR_FAILED_ROW_SCAN)
  84. }
  85. }
  86. errcounter := 0 // count invalid results
  87. for i, _ := range result {
  88. if result[i].Valid {
  89. results[i] = result[i].String // store valid results in return-slice
  90. } else {
  91. errcounter++
  92. }
  93. }
  94. if errcounter == len(cols) { // if nothings valid it's empty
  95. return []string{""}, errors.New(ERR_EMPTY_RESULT)
  96. }
  97. return results, nil
  98. }
  99. // GetRows(what, from, where, wherevalue)
  100. func (dbUtil DBUtils) GetRows(options ...string) ([][]string, error) { // TODO umschreiben
  101. var err error
  102. var rows *sql.Rows // TODO fix this weird bug
  103. if len(options) > 3 { // with or without where
  104. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1] + " WHERE " + options[2] + " = \"" + options[3] + "\"") // TODO Parse?
  105. } else {
  106. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1]) // TODO Parse?
  107. }
  108. defer rows.Close()
  109. if err != nil {
  110. panic(err.Error()) // TODO
  111. }
  112. var columns []string
  113. columns, err = rows.Columns()
  114. if err != nil {
  115. fmt.Println(err.Error())
  116. }
  117. colNum := len(columns)
  118. all := [][]string{}
  119. for rows.Next() {
  120. vh := make([]string, len(columns))
  121. cols := make([]interface{}, colNum)
  122. for i := 0; i < colNum; i++ {
  123. cols[i] = &vh[i]
  124. }
  125. err = rows.Scan(cols...)
  126. if err != nil {
  127. fmt.Println(err.Error())
  128. }
  129. all = append(all, vh)
  130. }
  131. return all, err
  132. }
  133. // UpdateRow(what, where, whereval, []key=>val udpate vals)
  134. func (dbUtil DBUtils) UpdateRow(what string, where string, whereVal string, colsVals [][]string) error {
  135. query := "UPDATE `" + what + "` " // begin sql query
  136. for i, x := range colsVals { // append keys/values to update
  137. fmt.Printf("%#v", x)
  138. if (i == 0) && (i == (len(colsVals) - 1)) { // if only one thing to update
  139. query += "SET `" + string(colsVals[i][0]) + "` = '" + colsVals[i][1] + "' "
  140. } else if (i == 0) { // first, but more coming
  141. query += "SET `" + colsVals[i][0] + "` = '" + colsVals[i][1] + "', "
  142. } else if i == (len(colsVals) - 1) && i != 0 { // last one, no ',' at end
  143. query += "`" + string(colsVals[i][0]) + "` = '" + colsVals[i][1] + "' "
  144. } else if i != 0 { // everything else (in the middle of others)
  145. query += "`" + colsVals[i][0] + "` = '" + colsVals[i][1] + "', "
  146. }
  147. }
  148. query += "WHERE `" + where + "` = '" + whereVal + "';" // finish query
  149. _, err := dbUtil.Handle.Query(query) // execute query
  150. if err != nil { // check if everything went well
  151. fmt.Printf("QUERY AYY: %#v\n", err.Error())
  152. return errors.New("Query Failed") // TODO logging system
  153. }
  154. return nil
  155. }
  156. // InsertRow(what, cols)
  157. func (dbUtil DBUtils) InsertRow(what string, colsVals [][]string) error {
  158. query := "INSERT INTO `" + what + "` (" // begin sql query
  159. vals := ") VALUES ("
  160. for i, x := range colsVals { // append keys/values to update
  161. fmt.Printf("%#v", x)
  162. if (i == 0) && (i == (len(colsVals) - 1)) { // if only one thing to update
  163. query += "`" + string(colsVals[i][0]) + "`"
  164. vals +="'" + colsVals[i][1] + "'"
  165. } else if (i == 0) { // first, but more coming
  166. query += "`" + colsVals[i][0] + "`,"
  167. vals += "'" + colsVals[i][1] + "', "
  168. } else if i == (len(colsVals) - 1) && i != 0 { // last one, no ',' at end
  169. query += "`" + string(colsVals[i][0]) + "`"
  170. vals += "'" + colsVals[i][1] + "'"
  171. } else if i != 0 { // everything else (in the middle of others)
  172. query += "`" + colsVals[i][0] + "`, "
  173. vals += "'" + colsVals[i][1] + "', "
  174. }
  175. }
  176. query += vals + ");"
  177. fmt.Println(query)
  178. _, err := dbUtil.Handle.Query(query) // execute query
  179. if err != nil { // check if everything went well
  180. fmt.Printf("QUERY AYY: %#v\n", err.Error())
  181. return errors.New("Query Failed") // TODO logging system
  182. }
  183. return err
  184. }
  185. // GetRowsDoubleCond("users", "tokens", "`token-id` = `tokens`.`id`", "`tokens`.`value` = 'SefxSlkejpuJOjIN'")
  186. func (dbUtil DBUtils) GetRowsDoubleCond(fromA string, fromB string, whereA string, whereB string) ([][]string, error) { // TODO make this method great again
  187. query := "SELECT * FROM `" + fromA + "`, `" + fromB + "` WHERE " + whereA + " AND " + whereB + ";"
  188. rows, err := dbUtil.Handle.Query(query)
  189. if err != nil {
  190. return [][]string{}, err
  191. }
  192. var columns []string
  193. columns, err = rows.Columns()
  194. if err != nil {
  195. return [][]string{}, err
  196. }
  197. colNum := len(columns)
  198. all := [][]string{}
  199. for rows.Next() {
  200. vh := make([]string, len(columns))
  201. cols := make([]interface{}, colNum)
  202. for i := 0; i < colNum; i++ {
  203. cols[i] = &vh[i]
  204. }
  205. err = rows.Scan(cols...)
  206. if err != nil {
  207. return [][]string{}, err
  208. }
  209. all = append(all, vh)
  210. }
  211. if len(all) > 0 {
  212. return all, nil
  213. }
  214. return [][]string{}, errors.New(ERR_EMPTY_RESULT)
  215. }