databaseutils.go 6.2 KB

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