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.

manager.go 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package nosql
  4. import (
  5. "context"
  6. "strconv"
  7. "sync"
  8. "time"
  9. "code.gitea.io/gitea/modules/process"
  10. "github.com/redis/go-redis/v9"
  11. "github.com/syndtr/goleveldb/leveldb"
  12. )
  13. var manager *Manager
  14. // Manager is the nosql connection manager
  15. type Manager struct {
  16. ctx context.Context
  17. finished context.CancelFunc
  18. mutex sync.Mutex
  19. RedisConnections map[string]*redisClientHolder
  20. LevelDBConnections map[string]*levelDBHolder
  21. }
  22. type redisClientHolder struct {
  23. redis.UniversalClient
  24. name []string
  25. count int64
  26. }
  27. func (r *redisClientHolder) Close() error {
  28. return manager.CloseRedisClient(r.name[0])
  29. }
  30. type levelDBHolder struct {
  31. name []string
  32. count int64
  33. db *leveldb.DB
  34. }
  35. func init() {
  36. _ = GetManager()
  37. }
  38. // GetManager returns a Manager and initializes one as singleton is there's none yet
  39. func GetManager() *Manager {
  40. if manager == nil {
  41. ctx, _, finished := process.GetManager().AddTypedContext(context.Background(), "Service: NoSQL", process.SystemProcessType, false)
  42. manager = &Manager{
  43. ctx: ctx,
  44. finished: finished,
  45. RedisConnections: make(map[string]*redisClientHolder),
  46. LevelDBConnections: make(map[string]*levelDBHolder),
  47. }
  48. }
  49. return manager
  50. }
  51. func valToTimeDuration(vs []string) (result time.Duration) {
  52. var err error
  53. for _, v := range vs {
  54. result, err = time.ParseDuration(v)
  55. if err != nil {
  56. var val int
  57. val, err = strconv.Atoi(v)
  58. result = time.Duration(val)
  59. }
  60. if err == nil {
  61. return
  62. }
  63. }
  64. return result
  65. }