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 // DB handle for global access
  9. )
  10. const ( // Error constants
  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. func (dbUtil *DBUtils) Connect() { // setup handle for db
  23. var err error
  24. dbUtil.Handle, err = sql.Open("mysql", dbUtil.User + ":" + dbUtil.Password + "@tcp(" + dbUtil.Host + ")/" + dbUtil.Database) // open handle
  25. if err != nil {
  26. panic(err.Error()) // TODO
  27. }
  28. err = dbUtil.Handle.Ping() // try to connect
  29. if err != nil {
  30. panic(err.Error()) // TODO
  31. }
  32. }
  33. func (dbUtil DBUtils) Close() {
  34. dbUtil.Handle.Close()
  35. }
  36. func (dbUtil DBUtils) GetString(what string, from string, where string, wherevalue string) string {
  37. var buf string
  38. rows, err := dbUtil.Handle.Query("SELECT " + what + " FROM " + from + " WHERE " + where + " = " + wherevalue) // TODO Parse?
  39. if err != nil {
  40. panic(err.Error()) // TODO
  41. }
  42. defer rows.Close()
  43. for rows.Next() {
  44. err := rows.Scan(&buf)
  45. if err != nil {
  46. panic(err.Error()) // TODO
  47. }
  48. }
  49. err = rows.Err()
  50. if err != nil {
  51. panic(err.Error()) // TODO
  52. }
  53. return buf
  54. }
  55. // GetRow(what, from, where, wherevalue)
  56. func (dbUtil DBUtils) GetRow(options ...string) ([]string, error) {
  57. var err error
  58. var rows *sql.Rows // TODO fix this weird bug
  59. if len(options) > 3 { // with or without where
  60. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1] + " WHERE " + options[2] + " = \"" + options[3] + "\"") // TODO Parse?
  61. } else {
  62. rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1]) // TODO Parse?
  63. }
  64. defer rows.Close()
  65. if err != nil {
  66. panic(err.Error()) // TODO
  67. }
  68. cols, err := rows.Columns()
  69. if err != nil {
  70. return []string{""}, errors.New(ERR_NO_COLUMNS)
  71. }
  72. dest := make([]interface{}, len(cols)) // interface for scanning
  73. result := make([]sql.NullString, len(cols)) // NullString to check if empty
  74. results := make([]string, len(cols)) // final return-result
  75. for i, _ := range result {
  76. dest[i] = &result[i] // Put pointers to each string in the interface slice
  77. }
  78. for rows.Next() {
  79. err = rows.Scan(dest...) // copy results in dest
  80. if err != nil {
  81. return []string{""}, errors.New(ERR_FAILED_ROW_SCAN)
  82. }
  83. }
  84. errcounter := 0 // count invalid results
  85. for i, _ := range result {
  86. if result[i].Valid {
  87. results[i] = result[i].String // store valid results in return-slice
  88. } else {
  89. errcounter++
  90. }
  91. }
  92. if errcounter == len(cols) { // if nothings valid it's empty
  93. return []string{""}, errors.New(ERR_EMPTY_RESULT)
  94. }
  95. return results, nil
  96. }
  97. //TODO GetRows