1 module hunt.cache.manger;
2 import hunt.cache.ucache;
3 
4 class CacheManger
5 {
6 	UCache createCache( string cacheName ,  string driverName = "memory"  ,string args = "" , bool enableL2Cache = false)
7 	{
8 		synchronized(this)
9 		{
10 			if(getCache(cacheName)){
11 				return null;
12 			}
13 
14 			auto ucache  = UCache.CreateUCache(driverName , args , enableL2Cache);
15 			_mapCaches[cacheName] = ucache;
16 			return ucache;
17 		}
18 	}
19 
20 	string[] getAllCacheNames()
21 	{
22 		synchronized(this){
23 			return _mapCaches.keys;
24 		}
25 	}
26 
27 	UCache getCache(string cacheName)
28 	{
29 		synchronized(this){
30 			UCache *ucache = cacheName in _mapCaches;
31 			if(ucache == null)
32 				return null;
33 			else
34 				return *ucache;
35 		}
36 	}
37 
38 	void destroyCache(string cacheName)
39 	{
40 		synchronized(this){
41 			_mapCaches.remove(cacheName);
42 		}
43 	}
44 
45 private:
46 	UCache[string]			_mapCaches;
47 }
48 
49 
50 // unittest{
51 
52 // 	import core.thread;
53 // 	import std.algorithm;
54 // 	import std.stdio;
55 
56 
57 // 	CacheManger manger = new CacheManger();
58 
59 // 	//test manger.
60 // 	string[] allkeys = ["memory" , "memory_l2"];
61 
62 // 	auto memory = manger.createCache(allkeys[0]);
63 // 	auto memory_l2 = manger.createCache(allkeys[1] , "memory" , "" , true);
64 
65 // 	version(WITH_HUNT_REDIS)
66 // 	{
67 // 		allkeys ~= ["redis" ,"redis_l2"];
68 
69 // 		auto redis = manger.createCache(allkeys[$ - 2] , "redis" , "127.0.0.1:6379");
70 // 		auto redis_l2 = manger.createCache(allkeys[$ - 1] , "redis" , "127.0.0.1:6379" , true);
71 // 	}
72 
73 // 	version(WITH_HUNT_MEMCACHE)
74 // 	{
75 // 		allkeys ~= ["memcached" , "memcached_l2"];
76 // 		auto memcached = manger.createCache(allkeys[$ - 2] , "memcached" , "--SERVER=127.0.0.1:11211" );
77 // 		auto memcached_l2 = manger.createCache(allkeys[$ -1] , "memcached" , "--SERVER=127.0.0.1:11211" , true);
78 // 	}
79 
80 // 	version(WITH_HUNT_ROCKSDB)
81 // 	{
82 // 		allkeys ~= ["rocksdb" , "rocksdb_l2"];
83 // 		auto rocksdb = manger.createCache(allkeys[$ - 2] , "rocksdb" , "/tmp/test1");
84 // 		auto rocksdb_l2 = manger.createCache(allkeys[$ -1] , "rocksdb" , "/tmp/test2" , true);
85 // 	}
86 
87 
88 // 	auto names = manger.getAllCacheNames();
89 // 	names.sort;
90 // 	allkeys.sort;
91 // 	assert(allkeys.length == names.length);
92 
93 // 	void  test(UCache cache)
94 // 	{
95 // 		cache.put("key1" ,"value1" , 1);
96 // 		string[string] map = ["key2":"value2" , "key3":"value3"];
97 // 		cache.putAll(map);
98 
99 // 		string value = cache.get("key1");
100 // 		assert(value == "value1");
101 // 		assert(cache.containsKey("key2"));
102 // 		assert(!cache.putifAbsent("key1" , "value11"));
103 // 		auto kvs = cache.getall(["key2" , "key3"]);
104 // 		foreach(k,v ; kvs)
105 // 		{
106 // 			assert(map[k] == v.origin);
107 // 		}
108 		
109 // 		assert(cache.remove("key2"));
110 // 		assert(!cache.containsKey("key2"));
111 // 		Thread.sleep(dur!"seconds"(2));
112 // 		assert(!cache.containsKey("key1"));
113 // 		assert(cache.putifAbsent("key1" , "value11"));
114 // 		cache.clear();
115 // 		assert(!cache.containsKey("key3"));
116 // 	}
117 
118 // 	foreach(k ; allkeys)
119 // 	{
120 // 		import std.stdio;
121 // 		writeln("test " ,k);
122 
123 // 		test(manger.getCache(k));
124 // 	}
125 
126 // 	foreach(k ; allkeys)
127 // 		manger.destroyCache(k);
128 
129 // 	assert(manger.getAllCacheNames().length == 0);
130 
131 // }