1 package org.apache.jcs.auxiliary.disk.jdbc.hsql;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.Serializable;
23 import java.sql.Connection;
24 import java.sql.DriverManager;
25 import java.sql.SQLException;
26 import java.sql.Statement;
27 import java.util.Collections;
28 import java.util.HashSet;
29 import java.util.Set;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.jcs.auxiliary.AuxiliaryCache;
34 import org.apache.jcs.auxiliary.AuxiliaryCacheAttributes;
35 import org.apache.jcs.auxiliary.AuxiliaryCacheFactory;
36 import org.apache.jcs.auxiliary.disk.jdbc.JDBCDiskCacheAttributes;
37 import org.apache.jcs.auxiliary.disk.jdbc.JDBCDiskCacheManager;
38 import org.apache.jcs.engine.behavior.ICompositeCacheManager;
39 import org.apache.jcs.engine.behavior.IElementSerializer;
40 import org.apache.jcs.engine.control.CompositeCacheManager;
41 import org.apache.jcs.engine.logging.behavior.ICacheEventLogger;
42
43
44
45
46
47
48 public class HSQLDiskCacheFactory
49 implements AuxiliaryCacheFactory
50 {
51
52 private final static Log log = LogFactory.getLog( HSQLDiskCacheFactory.class );
53
54
55 private String name = "HSQLDiskCacheFactory";
56
57
58 private final Set<String> databases = Collections.synchronizedSet( new HashSet<String>() );
59
60
61
62
63
64
65
66
67
68
69 public <K extends Serializable, V extends Serializable> AuxiliaryCache<K, V> createCache( AuxiliaryCacheAttributes rawAttr, ICompositeCacheManager arg1,
70 ICacheEventLogger cacheEventLogger, IElementSerializer elementSerializer )
71 {
72 JDBCDiskCacheManager mgr = JDBCDiskCacheManager.getInstance( (JDBCDiskCacheAttributes) rawAttr,
73 CompositeCacheManager.getUnconfiguredInstance(),
74 cacheEventLogger, elementSerializer );
75 try
76 {
77 setupDatabase( (JDBCDiskCacheAttributes) rawAttr );
78 }
79 catch ( Exception e )
80 {
81
82 log.error( "Problem setting up database.", e );
83 }
84 return mgr.getCache( (JDBCDiskCacheAttributes) rawAttr );
85 }
86
87
88
89
90
91
92 public void setName( String nameArg )
93 {
94 name = nameArg;
95 }
96
97
98
99
100
101
102 public String getName()
103 {
104 return name;
105 }
106
107
108
109
110
111
112
113 protected void setupDatabase( JDBCDiskCacheAttributes attributes )
114 throws Exception
115 {
116 if ( attributes == null )
117 {
118 throw new Exception( "The attributes are null." );
119 }
120
121
122 String database = attributes.getUrl() + attributes.getDatabase();
123
124 if ( databases.contains( database ) )
125 {
126 if ( log.isInfoEnabled() )
127 {
128 log.info( "We already setup database [" + database + "]" );
129 }
130 return;
131 }
132
133
134 System.setProperty( "hsqldb.cache_scale", "8" );
135
136
137 String driver = attributes.getDriverClassName();
138
139 String user = attributes.getUserName();
140
141 String password = attributes.getPassword();
142
143 new org.hsqldb.jdbcDriver();
144 try
145 {
146 Class.forName( driver ).newInstance();
147
148 Connection cConn = DriverManager.getConnection( database, user, password );
149
150 setupTABLE( cConn, attributes.getTableName() );
151
152 if ( log.isInfoEnabled() )
153 {
154 log.info( "Finished setting up database [" + database + "]" );
155 }
156
157 databases.add( database );
158 }
159 catch ( Exception e )
160 {
161 log.error( "Fatal problem setting up the database.", e );
162 }
163 }
164
165
166
167
168
169
170
171 private void setupTABLE( Connection cConn, String tableName ) throws SQLException
172 {
173 boolean newT = true;
174
175
176 StringBuffer createSql = new StringBuffer();
177 createSql.append( "CREATE CACHED TABLE " + tableName );
178 createSql.append( "( " );
179 createSql.append( "CACHE_KEY VARCHAR(250) NOT NULL, " );
180 createSql.append( "REGION VARCHAR(250) NOT NULL, " );
181 createSql.append( "ELEMENT BINARY, " );
182 createSql.append( "CREATE_TIME DATE, " );
183 createSql.append( "CREATE_TIME_SECONDS BIGINT, " );
184 createSql.append( "MAX_LIFE_SECONDS BIGINT, " );
185 createSql.append( "SYSTEM_EXPIRE_TIME_SECONDS BIGINT, " );
186 createSql.append( "IS_ETERNAL CHAR(1), " );
187 createSql.append( "PRIMARY KEY (CACHE_KEY, REGION) " );
188 createSql.append( ");" );
189
190 Statement sStatement = cConn.createStatement();
191
192 try
193 {
194 sStatement.executeQuery( createSql.toString() );
195 sStatement.close();
196 }
197 catch ( SQLException e )
198 {
199
200 if ( e.toString().indexOf( "already exists" ) != -1 )
201 {
202 newT = false;
203 }
204 else
205 {
206 throw e;
207 }
208 }
209
210
211 String setupData[] = { "create index iKEY on " + tableName + " (CACHE_KEY, REGION)" };
212
213 if ( newT )
214 {
215 for ( int i = 1; i < setupData.length; i++ )
216 {
217 try
218 {
219 sStatement.executeQuery( setupData[i] );
220 }
221 catch ( SQLException e )
222 {
223 log.error( "Exception caught when creating index." + e );
224 }
225 }
226 }
227 }
228 }