databaseutils.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package databaseutils
  2. import (
  3. "database/sql"
  4. _ "github.com/go-sql-driver/mysql"
  5. "errors"
  6. )
  7. var (
  8. DBUtil *DBUtils
  9. )
  10. const (
  11. ERR_EMPTY_RESULT = "ERR_EMPTY_RESULT"
  12. ERR_NO_COLUMNS = "ERR_NO_COLUMNS"
  13. ERR_FAILED_ROW_SCAN = "ERR_FAILED_ROW_SCAN"
  14. )
  15. type DBUtils struct {
  16. User string
  17. Password string
  18. Host string
  19. Database string
  20. Handle *sql.DB
  21. }
  22. // db := dbUtils{"root", "root", "127.0.0.1", "gotest"}
  23. func (dbUtil *DBUtils) Connect() {
  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
  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. }