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  }