/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.frameworkset.persitent.util;
import java.lang.ref.SoftReference;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import com.frameworkset.common.poolman.sql.PoolManResultSetMetaData;
import com.frameworkset.util.VariableHandler;
import com.frameworkset.util.VariableHandler.SQLStruction;
/**
* <p>Title: SQLCache.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2012-12-5 下午6:15:07
* @author biaoping.yin
* @version 1.0
*/
public class SQLCache {
private Object lock = new Object();
private Map<String,SQLStruction> parserSQLStructions = new java.util.WeakHashMap<String,SQLStruction>();
private Map<String,SQLStruction> parsertotalsizeSQLStructions = new java.util.WeakHashMap<String,SQLStruction>();
protected Map<String,Map<String, SoftReference<PoolManResultSetMetaData>>> metas = new HashMap<String,Map<String, SoftReference<PoolManResultSetMetaData>>>();
public SQLCache() {
// TODO Auto-generated constructor stub
}
public void clear()
{
metas.clear();
parserSQLStructions.clear();
parsertotalsizeSQLStructions.clear();
}
private boolean needRefreshMeta(PoolManResultSetMetaData meta,ResultSetMetaData rsmetadata) throws SQLException
{
if(meta.getColumnCount() != rsmetadata.getColumnCount())//列数发生变化
return true;
String[] labels = meta.get_columnLabel();//判断列名称是否变化
int coltypes[] = meta.get_columnType();
for(int i = 0; i < labels.length;i ++)
{
if(!labels[i].equals(rsmetadata.getColumnLabel(i + 1)))//列名变化
{
return true;
}
if(coltypes[i] != rsmetadata.getColumnType(i + 1))//类型变化
return true;
}
return false;
}
public PoolManResultSetMetaData getPoolManResultSetMetaData(com.frameworkset.orm.adapter.DB db,String dbname,String sqlkey,ResultSetMetaData rsmetadata) throws SQLException
{
PoolManResultSetMetaData meta = null;
Map<String, SoftReference<PoolManResultSetMetaData>> dbmetas = metas.get(dbname);
if(dbmetas == null)
{
synchronized(metas)
{
dbmetas = metas.get(dbname);
if(dbmetas == null)
{
dbmetas = new HashMap<String, SoftReference<PoolManResultSetMetaData>>();
metas.put(dbname, dbmetas);
}
}
}
// sqlkey = sqlkey + "__pagine" ;
// if (dbmetas.containsKey(sqlkey)) {
SoftReference<PoolManResultSetMetaData> wr = dbmetas.get(sqlkey);
if (wr != null) {
meta = (PoolManResultSetMetaData) wr.get();
if (meta == null) {
meta = PoolManResultSetMetaData.getCopy(db,rsmetadata);
SoftReference<PoolManResultSetMetaData> wr1 = new SoftReference<PoolManResultSetMetaData>(meta);
dbmetas.put(sqlkey, wr1);
}
else
{
if(needRefreshMeta(meta,rsmetadata))
{
meta = PoolManResultSetMetaData.getCopy(db,rsmetadata);
wr = new SoftReference<PoolManResultSetMetaData>(meta);
dbmetas.put(sqlkey, wr);
}
}
} else {
meta = PoolManResultSetMetaData.getCopy(db,rsmetadata);
wr = new SoftReference<PoolManResultSetMetaData>(meta);
dbmetas.put(sqlkey, wr);
}
return meta;
}
public SQLStruction getSQLStruction(SQLInfo sqlinfo,String newsql)
{
String sql = newsql;
String key = null;
if(sqlinfo.getSqlutil() == null
|| sqlinfo.getSqlutil() == SQLUtil.getGlobalSQLUtil())
key = sql;
else
{
if(sqlinfo.istpl() )
{
key = sql;
}
else
{
key = sqlinfo.getSqlname();
}
}
SQLStruction sqlstruction = parserSQLStructions.get(key);
if(sqlstruction == null)
{
synchronized(lock)
{
sqlstruction = parserSQLStructions.get(key);
if(sqlstruction == null)
{
sqlstruction = VariableHandler.parserSQLStruction(sql);
parserSQLStructions.put(key,sqlstruction);
}
}
}
return sqlstruction;
}
public SQLStruction getTotalsizeSQLStruction(SQLInfo totalsizesqlinfo,String newtotalsizesql)
{
String totalsizesql = newtotalsizesql;
String key = null;
if(totalsizesqlinfo.getSqlutil() == null
|| totalsizesqlinfo.getSqlutil() == SQLUtil.getGlobalSQLUtil())
key = totalsizesql;
else
{
if(totalsizesqlinfo.istpl() )
{
key = totalsizesql;
}
else
{
key = totalsizesqlinfo.getSqlname();
}
}
SQLStruction totalsizesqlstruction = parsertotalsizeSQLStructions.get(key);
if(totalsizesqlstruction == null)
{
synchronized(lock)
{
totalsizesqlstruction = parsertotalsizeSQLStructions.get(key);
if(totalsizesqlstruction == null)
{
totalsizesqlstruction = VariableHandler.parserSQLStruction(totalsizesql);
parsertotalsizeSQLStructions.put(key,totalsizesqlstruction);
}
}
}
return totalsizesqlstruction;
}
}