The storage system and conversion tools for the new Logs website.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
4.0 KiB

7 years ago
  1. package storage
  2. import (
  3. "database/sql"
  4. "errors"
  5. "strings"
  6. "time"
  7. )
  8. const logHeaderInsert = "INSERT INTO `logheader` (id,channel,time,status,status_time,title,tag,description) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"
  9. const logHeaderUpdate = "UPDATE `logheader` SET channel=?,time=?,status=?,status_time=?,title=?,tag=?,description=? WHERE id=?;"
  10. const logNicksInsert = "INSERT INTO `lognicks` (log_id,nick) VALUES (?, ?);"
  11. const logNicksDelete = "DELETE FROM `lognicks` WHERE log_id=? AND nick=?;"
  12. // LogHeader is the struct
  13. type LogHeader struct {
  14. ID string `json:"id"`
  15. Channel string `json:"channel"`
  16. Time time.Time `json:"time"`
  17. Status string `json:"status"`
  18. StatusTime time.Time `json:"statusTime"`
  19. Title string `json:"title"`
  20. Tag string `json:"tag"`
  21. Description string `json:"description"`
  22. Nicks []string `json:"nicks"`
  23. nicksAdded []string
  24. nicksRemoved []string
  25. }
  26. // SetStatus changes the value of header.Status and updates
  27. // header.StatusTime.
  28. func (header *LogHeader) SetStatus(value string) {
  29. header.Status = strings.ToLower(value)
  30. header.StatusTime = time.Now()
  31. }
  32. // HasNick returns whether a nick exists
  33. func (header *LogHeader) HasNick(nick string) bool {
  34. for _, existingNick := range header.Nicks {
  35. if existingNick == nick {
  36. return true
  37. }
  38. }
  39. return false
  40. }
  41. // AddNick adds a nick to the Nicks array, recording the
  42. // change. If the nick exists, it will not be added, though
  43. // it won't throw an error.
  44. func (header *LogHeader) AddNick(nick string) {
  45. if !header.HasNick(nick) {
  46. header.Nicks = append(header.Nicks, nick)
  47. header.nicksAdded = append(header.nicksAdded, nick)
  48. }
  49. }
  50. // RemoveNick removes a nick from the Nicks array, recording
  51. // the change.
  52. func (header *LogHeader) RemoveNick(nick string) {
  53. for i, existingNick := range header.Nicks {
  54. if existingNick == nick {
  55. header.Nicks = append(header.Nicks[:i], header.Nicks[i+1:]...)
  56. header.nicksRemoved = append(header.nicksRemoved, nick)
  57. return
  58. }
  59. }
  60. }
  61. // Insert inserts the LogHeader into the database, as well as all nicks
  62. func (header *LogHeader) Insert(db *sql.DB) error {
  63. // Insert the header
  64. result, err := db.Exec(logHeaderInsert, header.ID, header.Channel, header.Time, header.Status, header.StatusTime, header.Title, header.Tag, header.Description)
  65. if err != nil {
  66. return err
  67. }
  68. // Check if it was actually inserted
  69. rows, err := result.RowsAffected()
  70. if err != nil {
  71. return err
  72. }
  73. if rows != 1 {
  74. return errors.New("storage: No LogHeader inserted")
  75. }
  76. // Insert all lognicks
  77. for _, nick := range header.Nicks {
  78. _, err := db.Exec(logNicksInsert, header.ID, nick)
  79. if err != nil {
  80. return err
  81. }
  82. }
  83. // Clear the nicksAdded and nicksRemoved lists
  84. header.nicksAdded = nil
  85. header.nicksRemoved = nil
  86. // Success
  87. return nil
  88. }
  89. // Save updates the logheader
  90. func (header *LogHeader) Save(db *sql.DB) error {
  91. // Insert the header
  92. _, err := db.Exec(logHeaderUpdate, header.Channel, header.Time, header.Status, header.StatusTime, header.Title, header.Tag, header.Description, header.ID)
  93. if err != nil {
  94. return err
  95. }
  96. // Delete all removed lognicks
  97. for _, nick := range header.nicksRemoved {
  98. _, err := db.Exec(logNicksDelete, header.ID, nick)
  99. if err != nil {
  100. return err
  101. }
  102. }
  103. // Insert all new lognicks
  104. for _, nick := range header.nicksAdded {
  105. _, err := db.Exec(logNicksInsert, header.ID, nick)
  106. if err != nil {
  107. return err
  108. }
  109. }
  110. // Clear the nicksAdded and nicksRemoved lists
  111. header.nicksAdded = nil
  112. header.nicksRemoved = nil
  113. // Success
  114. return nil
  115. }
  116. // NewLogHeader creates a new LogHeader with an ID based the time and channel
  117. // value. It also sets StatusTime to the current time. It leaves
  118. // Title, Tag and Nicks blank.
  119. func NewLogHeader(logTime time.Time, channel, status string) *LogHeader {
  120. header := new(LogHeader)
  121. header.ID = logTime.Format("2006-01-02_150405999_") + channel[1:]
  122. header.Channel = channel
  123. header.Time = logTime
  124. header.Status = status
  125. header.StatusTime = time.Now()
  126. return header
  127. }