database.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "time"
  7. "github.com/HouzuoGuo/tiedot/db"
  8. "github.com/fatih/color"
  9. )
  10. func dbInsertDownload(download *downloadItem) error {
  11. _, err := myDB.Use("Downloads").Insert(map[string]interface{}{
  12. "URL": download.URL,
  13. "Time": download.Time.String(),
  14. "Destination": download.Destination,
  15. "Filename": download.Filename,
  16. "ChannelID": download.ChannelID,
  17. "UserID": download.UserID,
  18. })
  19. return err
  20. }
  21. func dbFindDownloadByID(id int) *downloadItem {
  22. downloads := myDB.Use("Downloads")
  23. readBack, err := downloads.Read(id)
  24. if err != nil {
  25. log.Println(lg("Database", "Downloads", color.HiRedString, "Failed to read database:\t%s", err))
  26. }
  27. timeT, _ := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", readBack["Time"].(string))
  28. return &downloadItem{
  29. URL: readBack["URL"].(string),
  30. Time: timeT,
  31. Destination: readBack["Destination"].(string),
  32. Filename: readBack["Filename"].(string),
  33. ChannelID: readBack["ChannelID"].(string),
  34. UserID: readBack["UserID"].(string),
  35. }
  36. }
  37. func dbFindDownloadByURL(inputURL string) []*downloadItem {
  38. var query interface{}
  39. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["URL"]}]`, inputURL)), &query)
  40. queryResult := make(map[int]struct{})
  41. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  42. downloadedImages := make([]*downloadItem, 0)
  43. for id := range queryResult {
  44. downloadedImages = append(downloadedImages, dbFindDownloadByID(id))
  45. }
  46. return downloadedImages
  47. }
  48. func dbDeleteByChannelID(channelID string) {
  49. var query interface{}
  50. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["ChannelID"]}]`, channelID)), &query)
  51. queryResult := make(map[int]struct{})
  52. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  53. for id := range queryResult {
  54. myDB.Use("Downloads").Delete(id)
  55. }
  56. }
  57. //#region Statistics
  58. func dbDownloadCount() int {
  59. i := 0
  60. myDB.Use("Downloads").ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
  61. i++
  62. return true
  63. })
  64. return i
  65. }
  66. func dbDownloadCountByChannel(channelID string) int {
  67. var query interface{}
  68. json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["ChannelID"]}]`, channelID)), &query)
  69. queryResult := make(map[int]struct{})
  70. db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
  71. downloadedImages := make([]*downloadItem, 0)
  72. for id := range queryResult {
  73. downloadedImages = append(downloadedImages, dbFindDownloadByID(id))
  74. }
  75. return len(downloadedImages)
  76. }
  77. //#endregion