/mssql.go

https://github.com/Azareal/Gosora · Go · 97 lines · 50 code · 14 blank · 33 comment · 9 complexity · c3105e75ff77bb9e3bb6331ed25943e1 MD5 · raw file

  1. // +build mssql
  2. /*
  3. *
  4. * Gosora MSSQL Interface
  5. * Copyright Azareal 2016 - 2020
  6. *
  7. */
  8. package main
  9. import (
  10. "database/sql"
  11. "net/url"
  12. "github.com/Azareal/Gosora/common"
  13. c "github.com/Azareal/Gosora/common"
  14. qgen "github.com/Azareal/Gosora/query_gen"
  15. _ "github.com/denisenkom/go-mssqldb"
  16. )
  17. var dbInstance string = ""
  18. func init() {
  19. dbAdapter = "mssql"
  20. _initDatabase = initMSSQL
  21. }
  22. func initMSSQL() (err error) {
  23. // TODO: Move this bit to the query gen lib
  24. query := url.Values{}
  25. query.Add("database", common.DbConfig.Dbname)
  26. u := &url.URL{
  27. Scheme: "sqlserver",
  28. User: url.UserPassword(common.DbConfig.Username, common.DbConfig.Password),
  29. Host: common.DbConfig.Host + ":" + common.DbConfig.Port,
  30. Path: dbInstance,
  31. RawQuery: query.Encode(),
  32. }
  33. db, err = sql.Open("mssql", u.String())
  34. if err != nil {
  35. return err
  36. }
  37. // Make sure that the connection is alive
  38. err = db.Ping()
  39. if err != nil {
  40. return err
  41. }
  42. // Set the number of max open connections
  43. db.SetMaxOpenConns(64)
  44. db.SetMaxIdleConns(32)
  45. // Only hold connections open for five seconds to avoid accumulating a large number of stale connections
  46. //db.SetConnMaxLifetime(5 * time.Second)
  47. db.SetConnMaxLifetime(c.DBTimeout())
  48. // Build the generated prepared statements, we are going to slowly move the queries over to the query generator rather than writing them all by hand, this'll make it easier for us to implement database adapters for other databases like PostgreSQL, MSSQL, SQlite, etc.
  49. err = _gen_mssql()
  50. if err != nil {
  51. return err
  52. }
  53. // Ready the query builder
  54. qgen.Builder.SetConn(db)
  55. err = qgen.Builder.SetAdapter("mssql")
  56. if err != nil {
  57. return err
  58. }
  59. setter, ok := qgen.Builder.GetAdapter().(qgen.SetPrimaryKeys)
  60. if ok {
  61. setter.SetPrimaryKeys(dbTablePrimaryKeys)
  62. }
  63. // TODO: Is there a less noisy way of doing this for tests?
  64. /*log.Print("Preparing getActivityFeedByWatcher statement.")
  65. stmts.getActivityFeedByWatcherStmt, err = db.Prepare("SELECT activity_stream_matches.asid, activity_stream.actor, activity_stream.targetUser, activity_stream.event, activity_stream.elementType, activity_stream.elementID, activity_stream.createdAt FROM [activity_stream_matches] INNER JOIN [activity_stream] ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE [watcher] = ? ORDER BY activity_stream.asid DESC OFFSET 0 ROWS FETCH NEXT 16 ROWS ONLY")
  66. if err != nil {
  67. return err
  68. }
  69. log.Print("Preparing getActivityFeedByWatcher statement.")
  70. stmts.getActivityFeedByWatcherStmt, err = db.Prepare("SELECT activity_stream_matches.asid, activity_stream.actor, activity_stream.targetUser, activity_stream.event, activity_stream.elementType, activity_stream.elementID, activity_stream.createdAt FROM [activity_stream_matches] INNER JOIN [activity_stream] ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE [watcher] = ? ORDER BY activity_stream.asid DESC OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY")
  71. if err != nil {
  72. return err
  73. }
  74. log.Print("Preparing getActivityCountByWatcher statement.")
  75. stmts.getActivityCountByWatcherStmt, err = db.Prepare("SELECT count(*) FROM [activity_stream_matches] INNER JOIN [activity_stream] ON activity_stream_matches.asid = activity_stream.asid AND activity_stream_matches.watcher != activity_stream.actor WHERE [watcher] = ?")
  76. if err != nil {
  77. return err
  78. }
  79. */
  80. return nil
  81. }