blob: 3d19710c2174f79140680598d91d1be3d6cf9392 [file] [log] [blame]
package apidApigeeSync
const (
readCache int = iota
updateCache
removeCache
clearAndInit
)
/*
* structs for DatascopeCache
*/
type cacheOperationRequest struct {
Operation int
Scope *dataDataScope
version string
}
// maintain an in-mem cache of datascope
type DatascopeCache struct {
requestChan chan *cacheOperationRequest
readDoneChan chan []string
scopeMap map[string]*dataDataScope
version string
}
var scopeCache *DatascopeCache
func (cache *DatascopeCache) datascopeCacheManager() {
for request := range cache.requestChan {
switch request.Operation {
case readCache:
log.Debug("datascopeCacheManager: readCache")
scopes := make([]string, 0, len(cache.scopeMap))
for _, ds := range cache.scopeMap {
scopes = append(scopes, ds.Scope)
}
cache.readDoneChan <- scopes
case updateCache:
log.Debug("datascopeCacheManager: updateCache")
cache.scopeMap[request.Scope.ID] = request.Scope
case removeCache:
log.Debug("datascopeCacheManager: removeCache")
delete(cache.scopeMap, request.Scope.ID)
case clearAndInit:
log.Debug("datascopeCacheManager: clearAndInit")
if cache.version != request.version {
cache.scopeMap = make(map[string]*dataDataScope)
cache.version = request.version
}
}
}
//chan closed
cache.scopeMap = nil
close(cache.readDoneChan)
}
/*
* The output of readAllScope() should be identical to findScopesForId(apidInfo.ClusterID)
*/
func (cache *DatascopeCache) readAllScope() []string {
cache.requestChan <- &cacheOperationRequest{readCache, nil, ""}
scopes := <-cache.readDoneChan
// eliminate duplicates
tmpMap := make(map[string]bool)
for _, scope := range scopes {
tmpMap[scope] = true
}
scopes = make([]string, 0)
for scope := range tmpMap {
scopes = append(scopes, scope)
}
return scopes
}
func (cache *DatascopeCache) removeCache(scope *dataDataScope) {
cache.requestChan <- &cacheOperationRequest{removeCache, scope, ""}
}
func (cache *DatascopeCache) updateCache(scope *dataDataScope) {
cache.requestChan <- &cacheOperationRequest{updateCache, scope, ""}
}
func (cache *DatascopeCache) clearAndInitCache(version string) {
cache.requestChan <- &cacheOperationRequest{clearAndInit, nil, version}
}
func (cache *DatascopeCache) closeCache() {
close(cache.requestChan)
}