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