Guest User

Untitled

a guest
May 2nd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "database/sql"
  5. "fmt"
  6. "log"
  7. "reflect"
  8. "strconv"
  9. _ "github.com/denisenkom/go-mssqldb"
  10. )
  11.  
  12. //work in progress database class
  13.  
  14.  
  15. type conn struct {
  16. *sql.DB //you know, provides access to everyhing, 42
  17. }
  18.  
  19. func connect() *conn {
  20.  
  21. server := "HOST"
  22. user := "sa"
  23. password := "PASSWORD"
  24. port := 1433
  25. database := "IAMADATABASE"
  26. connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s", server, user, password, port, database)
  27.  
  28. if *debug {
  29. fmt.Printf(" connString:%s\n", connString)
  30. }
  31. dbconn, err := sql.Open("mssql", connString)
  32.  
  33. fmt.Printf(reflect.TypeOf(dbconn).String())
  34. if err != nil {
  35. log.Fatal("Open connection failed:", err.Error())
  36. }
  37. retcon := new(conn)
  38. retcon.DB = dbconn
  39. return retcon
  40.  
  41. }
  42.  
  43. func (db *conn) fetchAll(query string) ([]map[string]interface{}, error) {
  44. rows, err := db.DB.Query(query)
  45. if err != nil {
  46. return nil, err //most likely a query error
  47. }
  48. defer rows.Close() // close when we leave the method..
  49.  
  50. columnTypes, err := rows.ColumnTypes()
  51. columnNames, err := rows.Columns()
  52.  
  53. var resRows []map[string]interface{} //row container
  54. rawResult := make([][]byte, len(columnNames)) // Result is our slice string/int/whatever.
  55. dest := make([]interface{}, len(columnNames)) // An interface{} slice
  56. for i := range rawResult {
  57. dest[i] = &rawResult[i] // pointers to each string in the result interface slice
  58. }
  59. for rows.Next() {
  60. err = rows.Scan(dest...)
  61. if err != nil {
  62. fmt.Println("Failed to scan row", err)
  63. return nil, err
  64. }
  65. resRow := make(map[string]interface{})
  66. for i, raw := range rawResult {
  67. if raw == nil {
  68. resRow[columnNames[i]] = "" // usually NULL value, output "" (lazy)
  69. } else {
  70. switch columnTypes[i].DatabaseTypeName() { //handle database types. i guess there's a better way through columnTypes[i].scan.., but i need to get it working now
  71. case "NVARCHAR":
  72. resRow[columnNames[i]] = string(raw)
  73. case "INT":
  74. s := string(raw)
  75. ss, err := strconv.Atoi(s)
  76. if err != nil {
  77. fmt.Printf("cant convert to int")
  78. }
  79. resRow[columnNames[i]] = ss
  80. default:
  81. resRow[columnNames[i]] = string(raw) //tired to website
  82. }
  83. }
  84. }
  85. resRows = append(resRows, resRow)
  86. }
  87. err = rows.Err()
  88. if err != nil {
  89. log.Fatal(err)
  90. }
  91. return resRows, nil
  92. }
Add Comment
Please, Sign In to add comment