Make System.Web.Script.Serialization.JavaScriptSerializer.ConvertToType(Type, object...
[mono.git] / mcs / class / Npgsql / Npgsql / Cache.cs
1 // created on 29/11/2007\r
2 \r
3 // Npgsql.NpgsqlConnectionStringBuilder.cs\r
4 //\r
5 // Author:\r
6 //      Glen Parker (glenebob@nwlink.com)\r
7 //      Ben Sagal (bensagal@gmail.com)\r
8 //      Tao Wang (dancefire@gmail.com)\r
9 //\r
10 //      Copyright (C) 2007 The Npgsql Development Team\r
11 //      npgsql-general@gborg.postgresql.org\r
12 //      http://gborg.postgresql.org/project/npgsql/projdisplay.php\r
13 //\r
14 // Permission to use, copy, modify, and distribute this software and its\r
15 // documentation for any purpose, without fee, and without a written\r
16 // agreement is hereby granted, provided that the above copyright notice\r
17 // and this paragraph and the following two paragraphs appear in all copies.\r
18 // \r
19 // IN NO EVENT SHALL THE NPGSQL DEVELOPMENT TEAM BE LIABLE TO ANY PARTY\r
20 // FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,\r
21 // INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS\r
22 // DOCUMENTATION, EVEN IF THE NPGSQL DEVELOPMENT TEAM HAS BEEN ADVISED OF\r
23 // THE POSSIBILITY OF SUCH DAMAGE.\r
24 // \r
25 // THE NPGSQL DEVELOPMENT TEAM SPECIFICALLY DISCLAIMS ANY WARRANTIES,\r
26 // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\r
27 // AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS\r
28 // ON AN "AS IS" BASIS, AND THE NPGSQL DEVELOPMENT TEAM HAS NO OBLIGATIONS\r
29 // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\r
30 \r
31 using System;\r
32 using System.Collections.Generic;\r
33 //using System.Text;\r
34 \r
35 namespace Npgsql\r
36 {\r
37         internal class Cache<TEntity> : LinkedList<KeyValuePair<string, TEntity>>\r
38                 where TEntity : class\r
39         {\r
40                 private int _cache_size = 20;\r
41 \r
42                 /// <summary>\r
43                 /// Set Cache Size. The default value is 20.\r
44                 /// </summary>\r
45                 public int CacheSize\r
46                 {\r
47                         get { return _cache_size; }\r
48                         set\r
49                         {\r
50                                 if (value < 0) { throw new ArgumentOutOfRangeException("CacheSize"); }\r
51 \r
52                                 _cache_size = value;\r
53 \r
54                                 if (this.Count > _cache_size)\r
55                                 {\r
56                                         lock (this)\r
57                                         {\r
58                                                 while (_cache_size < this.Count)\r
59                                                 {\r
60                                                         RemoveLast();\r
61                                                 }\r
62                                         }\r
63                                 }\r
64                         }\r
65                 }\r
66 \r
67                 /// <summary>\r
68                 /// Lookup cached entity. null will returned if not match.\r
69                 /// For both get{} and set{} apply LRU rule.\r
70                 /// </summary>\r
71                 /// <param name="key">key</param>\r
72                 /// <returns></returns>\r
73                 public TEntity this[string key]\r
74                 {\r
75                         get\r
76                         {\r
77                                 lock (this)\r
78                                 {\r
79                                         for (LinkedListNode<KeyValuePair<string, TEntity>> node = this.First; node != null; node = node.Next)\r
80                                         {\r
81                                                 if (node.Value.Key == key)\r
82                                                 {\r
83                                                         this.Remove(node);\r
84                                                         this.AddFirst(node);\r
85                                                         return node.Value.Value;\r
86                                                 }\r
87                                         }\r
88                                 }\r
89                                 return null;\r
90                         }\r
91                         set\r
92                         {\r
93                                 lock (this)\r
94                                 {\r
95                                         for (LinkedListNode<KeyValuePair<string, TEntity>> node = this.First; node != null; node = node.Next)\r
96                                         {\r
97                                                 if (node.Value.Key == key)\r
98                                                 {\r
99                                                         this.Remove(node);\r
100                                                         this.AddFirst(node);\r
101                                                         return;\r
102                                                 }\r
103                                         }\r
104                                         if (this.CacheSize > 0)\r
105                                         {\r
106                                                 this.AddFirst(new KeyValuePair<string, TEntity>(key, value));\r
107                                                 if (this.Count > this.CacheSize)\r
108                                                 {\r
109                                                         this.RemoveLast();\r
110                                                 }\r
111                                         }\r
112                                 }\r
113                         }\r
114                 }\r
115 \r
116                 public Cache() : base() { }\r
117                 public Cache(int cacheSize) : base()\r
118                 {\r
119                         this._cache_size = cacheSize;\r
120                 }\r
121         }\r
122 }\r