Thread: [Squirrel-sql-commits] sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo Schema
A Java SQL client for any JDBC compliant database
Brought to you by:
colbell,
gerdwagner
From: Gerd W. <ger...@us...> - 2006-06-19 20:44:37
|
Update of /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1719/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo Modified Files: CaseInsensitiveString.java SchemaInfo.java SchemaInfoCache.java SchemaInfoUpdateCheck.java Added Files: SchemaInfoCacheSerializer.java Log Message: Configurable Schema loading and caching Index: CaseInsensitiveString.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo/CaseInsensitiveString.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** CaseInsensitiveString.java 3 May 2006 10:49:38 -0000 1.1 --- CaseInsensitiveString.java 19 Jun 2006 20:44:33 -0000 1.2 *************** *** 1,4 **** --- 1,6 ---- package net.sourceforge.squirrel_sql.client.session.schemainfo; + import java.io.Serializable; + /** *************** *** 10,157 **** * memory finger print. */ ! public class CaseInsensitiveString implements Comparable { ! private char[] value = new char[0]; ! private int offset = 0; ! private int count = 0; ! private int hash = 0; ! private boolean _isMutable; ! public CaseInsensitiveString(String s) ! { ! value = new char[s.length()]; ! s.getChars(0, s.length(), value, 0); ! offset = 0; ! count = s.length(); ! hash = 0; ! _isMutable = false; ! } ! public CaseInsensitiveString() ! { ! _isMutable = true; ! } ! public void setCharBuffer(char[] buffer, int beginIndex, int len) ! { ! if(false == _isMutable) ! { ! throw new UnsupportedOperationException("This CaseInsensitiveString is immutable"); ! } ! value = buffer; ! offset = beginIndex; ! count = len; ! hash = 0; ! } ! public int hashCode() ! { ! int h = hash; ! if (h == 0) ! { ! int off = offset; ! char val[] = value; ! int len = count; ! for (int i = 0; i < len; i++) ! { ! h = 31 * h + Character.toUpperCase(val[off++]); ! } ! hash = h; ! } ! return h; ! } ! public boolean equals(Object obj) ! { ! if(obj instanceof String) ! { ! String other = (String) obj; ! if(other.length() != count) ! { ! return false; ! } ! for(int i=0; i < count; ++i) ! { ! char c1 = value[offset + i]; ! char c2 = other.charAt(i); ! // If characters don't match but case may be ignored, ! // try converting both characters to uppercase. ! // If the results match, then the comparison scan should ! // continue. ! char u1 = Character.toUpperCase(c1); ! char u2 = Character.toUpperCase(c2); ! if (u1 == u2) ! { ! continue; ! } ! // Unfortunately, conversion to uppercase does not work properly ! // for the Georgian alphabet, which has strange rules about case ! // conversion. So we need to make one last check before ! // exiting. ! if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) ! { ! continue; ! } ! return false; ! } ! return true; ! } ! else if(obj instanceof CaseInsensitiveString) ! { ! CaseInsensitiveString other = (CaseInsensitiveString) obj; ! if(other.count != count) ! { ! return false; ! } ! for(int i=0; i < count; ++i) ! { ! char c1 = value[offset + i]; ! char c2 = other.value[other.offset + i]; ! // If characters don't match but case may be ignored, ! // try converting both characters to uppercase. ! // If the results match, then the comparison scan should ! // continue. ! char u1 = Character.toUpperCase(c1); ! char u2 = Character.toUpperCase(c2); ! if (u1 == u2) ! { ! continue; ! } ! // Unfortunately, conversion to uppercase does not work properly ! // for the Georgian alphabet, which has strange rules about case ! // conversion. So we need to make one last check before ! // exiting. ! if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) ! { ! continue; ! } ! return false; ! } ! return true; ! } ! else ! { ! return false; ! } ! } ! public String toString() ! { ! return new String(value, offset, count); ! } public int compareTo(Object o) --- 12,159 ---- * memory finger print. */ ! public class CaseInsensitiveString implements Comparable, Serializable { ! private char[] value = new char[0]; ! private int offset = 0; ! private int count = 0; ! private int hash = 0; ! private boolean _isMutable; ! public CaseInsensitiveString(String s) ! { ! value = new char[s.length()]; ! s.getChars(0, s.length(), value, 0); ! offset = 0; ! count = s.length(); ! hash = 0; ! _isMutable = false; ! } ! public CaseInsensitiveString() ! { ! _isMutable = true; ! } ! public void setCharBuffer(char[] buffer, int beginIndex, int len) ! { ! if(false == _isMutable) ! { ! throw new UnsupportedOperationException("This CaseInsensitiveString is immutable"); ! } ! value = buffer; ! offset = beginIndex; ! count = len; ! hash = 0; ! } ! public int hashCode() ! { ! int h = hash; ! if (h == 0) ! { ! int off = offset; ! char val[] = value; ! int len = count; ! for (int i = 0; i < len; i++) ! { ! h = 31 * h + Character.toUpperCase(val[off++]); ! } ! hash = h; ! } ! return h; ! } ! public boolean equals(Object obj) ! { ! if(obj instanceof String) ! { ! String other = (String) obj; ! if(other.length() != count) ! { ! return false; ! } ! for(int i=0; i < count; ++i) ! { ! char c1 = value[offset + i]; ! char c2 = other.charAt(i); ! // If characters don't match but case may be ignored, ! // try converting both characters to uppercase. ! // If the results match, then the comparison scan should ! // continue. ! char u1 = Character.toUpperCase(c1); ! char u2 = Character.toUpperCase(c2); ! if (u1 == u2) ! { ! continue; ! } ! // Unfortunately, conversion to uppercase does not work properly ! // for the Georgian alphabet, which has strange rules about case ! // conversion. So we need to make one last check before ! // exiting. ! if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) ! { ! continue; ! } ! return false; ! } ! return true; ! } ! else if(obj instanceof CaseInsensitiveString) ! { ! CaseInsensitiveString other = (CaseInsensitiveString) obj; ! if(other.count != count) ! { ! return false; ! } ! for(int i=0; i < count; ++i) ! { ! char c1 = value[offset + i]; ! char c2 = other.value[other.offset + i]; ! // If characters don't match but case may be ignored, ! // try converting both characters to uppercase. ! // If the results match, then the comparison scan should ! // continue. ! char u1 = Character.toUpperCase(c1); ! char u2 = Character.toUpperCase(c2); ! if (u1 == u2) ! { ! continue; ! } ! // Unfortunately, conversion to uppercase does not work properly ! // for the Georgian alphabet, which has strange rules about case ! // conversion. So we need to make one last check before ! // exiting. ! if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) ! { ! continue; ! } ! return false; ! } ! return true; ! } ! else ! { ! return false; ! } ! } ! public String toString() ! { ! return new String(value, offset, count); ! } public int compareTo(Object o) Index: SchemaInfoCache.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo/SchemaInfoCache.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SchemaInfoCache.java 15 Jun 2006 21:53:41 -0000 1.1 --- SchemaInfoCache.java 19 Jun 2006 20:44:33 -0000 1.2 *************** *** 1,31 **** package net.sourceforge.squirrel_sql.client.session.schemainfo; ! import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias; import java.util.*; ! public class SchemaInfoCache { ! final List catalogs = new ArrayList(); ! final List schemas = new ArrayList(); ! final HashMap cachedTableTypes = new HashMap(); ! final TreeMap keywords = new TreeMap(); ! final TreeMap dataTypes = new TreeMap(); ! final Map functions = Collections.synchronizedMap(new TreeMap()); ! final Map tableNames = Collections.synchronizedMap(new TreeMap()); ! final Map columnNames = Collections.synchronizedMap(new TreeMap()); ! final Map procedureNames = Collections.synchronizedMap(new TreeMap()); ! final Map extendedColumnInfosByTableName = Collections.synchronizedMap(new TreeMap()); ! final Map iTableInfos = Collections.synchronizedMap(new TreeMap()); ! final Map iProcedureInfos = Collections.synchronizedMap(new TreeMap()); ! final Hashtable tableInfosBySimpleName = new Hashtable(); ! final Hashtable procedureInfosBySimpleName = new Hashtable(); ! public SchemaInfoCache(SQLAlias alias) { ! //To change body of created methods use File | Settings | File Templates. } } --- 1,500 ---- package net.sourceforge.squirrel_sql.client.session.schemainfo; ! import net.sourceforge.squirrel_sql.client.gui.db.SQLAliasSchemaProperties; ! import net.sourceforge.squirrel_sql.client.gui.db.SchemaLoadInfo; ! import net.sourceforge.squirrel_sql.client.gui.db.SchemaTableTypeCombination; ! import net.sourceforge.squirrel_sql.client.gui.db.SchemaNameLoadInfo; ! import net.sourceforge.squirrel_sql.client.session.ISession; ! import net.sourceforge.squirrel_sql.client.session.ExtendedColumnInfo; ! import net.sourceforge.squirrel_sql.fw.sql.ITableInfo; ! import net.sourceforge.squirrel_sql.fw.sql.IProcedureInfo; ! import net.sourceforge.squirrel_sql.fw.sql.TableColumnInfo; ! import net.sourceforge.squirrel_sql.fw.util.log.ILogger; ! import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; ! import net.sourceforge.squirrel_sql.fw.util.Utilities; import java.util.*; + import java.sql.SQLException; + import java.io.Serializable; ! public class SchemaInfoCache implements Serializable { ! private static final ILogger s_log = LoggerController.createLogger(SchemaInfoCache.class); ! List catalogs = new ArrayList(); ! List schemas = new ArrayList(); ! TreeMap keywords = new TreeMap(); ! TreeMap dataTypes = new TreeMap(); ! Map functions = Collections.synchronizedMap(new TreeMap()); ! ///////////////////////////////////////////////////////////////////////////// ! // Schema dependent data. ! // Are changed only in this class ! // ! Map tableNames = Collections.synchronizedMap(new TreeMap()); ! Map iTableInfos = Collections.synchronizedMap(new TreeMap()); ! Hashtable tableInfosBySimpleName = new Hashtable(); ! Map extendedColumnInfosByTableName = Collections.synchronizedMap(new TreeMap()); ! Map extColumnInfosByColumnName = Collections.synchronizedMap(new TreeMap()); ! ! ! Map procedureNames = Collections.synchronizedMap(new TreeMap()); ! Map iProcedureInfos = Collections.synchronizedMap(new TreeMap()); ! Hashtable procedureInfosBySimpleName = new Hashtable(); ! // ! /////////////////////////////////////////////////////////////////////////// ! ! private java.util.Date _lastCacheRefershDate = new Date(); ! ! private SQLAliasSchemaProperties _schemaPropsCacheIsBasedOn; ! ! private transient String[] _viewTableTypesCacheable; ! private transient String[] _tabelTableTypesCacheable; ! //private transient String[] availableTypesInDataBase; ! ! private transient ISession _session = null; ! ! ! void setSession(ISession session) { ! _session = session; ! initTypes(); ! } ! ! ! public boolean loadSchemaIndependentMetaData() ! { ! return _session.getAlias().getSchemaProperties().loadSchemaIndependentMetaData(_schemaPropsCacheIsBasedOn); ! } ! ! public SchemaLoadInfo[] getAllSchemaLoadInfos() ! { ! return _session.getAlias().getSchemaProperties().getSchemaLoadInfos(_schemaPropsCacheIsBasedOn, _tabelTableTypesCacheable, _viewTableTypesCacheable); ! } ! ! public SchemaLoadInfo[] getMatchingSchemaLoadInfos(String schemaName) ! { ! return getMatchingSchemaLoadInfos(schemaName, null); ! } ! ! public SchemaLoadInfo[] getMatchingSchemaLoadInfos(String schemaName, String[] tableTypes) ! { ! if(null == schemaName) ! { ! return getAllSchemaLoadInfos(); ! } ! ! SchemaLoadInfo[] schemaLoadInfos = getAllSchemaLoadInfos(); ! ! for (int i = 0; i < schemaLoadInfos.length; i++) ! { ! if(schemaLoadInfos[i].schemaName.equals(schemaName)) ! { ! if(null != tableTypes) ! { ! SchemaLoadInfo buf = (SchemaLoadInfo) Utilities.cloneObject(schemaLoadInfos[i], getClass().getClassLoader()); ! buf.tableTypes = tableTypes; ! return new SchemaLoadInfo[]{buf}; ! } ! ! return new SchemaLoadInfo[]{schemaLoadInfos[i]}; ! } ! } ! ! throw new IllegalArgumentException("Unknown Schema " + schemaName); ! } ! ! ! ! // public String[] getAllAvailabelTypesInDatabase() ! // { ! // return availableTypesInDataBase; ! // } ! ! // public String[] getAllCachedTableTypes() ! // { ! // ArrayList ret = new ArrayList(); ! // ! // ret.addAll(Arrays.asList(_tabelTableTypesCacheable)); ! // ret.addAll(Arrays.asList(_viewTableTypesCacheable)); ! // ! // return (String[]) ret.toArray(new String[ret.size()]); ! // ! // ! // } ! ! ! private void initTypes() ! { ! ArrayList tableTypeCandidates = new ArrayList(); ! tableTypeCandidates.add("TABLE"); ! tableTypeCandidates.add("SYSTEM TABLE"); ! ! ArrayList viewTypeCandidates = new ArrayList(); ! viewTypeCandidates.add("VIEW"); ! ! // String[] availableTypesInDataBase = new String[]{"TABLE", "VIEW"}; ! try ! { ! ArrayList availableBuf = new ArrayList(); ! String[] buf = _session.getSQLConnection().getSQLMetaData().getTableTypes(); ! availableBuf.addAll(Arrays.asList(buf)); ! ! for(Iterator i=tableTypeCandidates.iterator();i.hasNext();) ! { ! if(false == availableBuf.contains(i.next())) ! { ! i.remove(); ! } ! } ! ! for(Iterator i=viewTypeCandidates.iterator();i.hasNext();) ! { ! if(false == availableBuf.contains(i.next())) ! { ! i.remove(); ! } ! } ! ! // availableTypesInDataBase = (String[]) availableBuf.toArray(new String[availableBuf.size()]); ! } ! catch (SQLException e) ! { ! s_log.error("Could not get table types", e); ! } ! ! _tabelTableTypesCacheable = (String[]) tableTypeCandidates.toArray(new String[tableTypeCandidates.size()]); ! _viewTableTypesCacheable = (String[]) viewTypeCandidates.toArray(new String[viewTypeCandidates.size()]); ! } ! ! public boolean isCachedTableType(String type) ! { ! boolean found = false; ! ! for (int i = 0; i < _viewTableTypesCacheable.length; i++) ! { ! if(_viewTableTypesCacheable[i].equals(type)) ! { ! found = true; ! break; ! } ! } ! ! for (int i = 0; i < _tabelTableTypesCacheable.length; i++) ! { ! if(_tabelTableTypesCacheable[i].equals(type)) ! { ! found = true; ! break; ! } ! } ! ! return found; ! } ! ! static boolean containsType(String[] types, String type) ! { ! if(null == types) ! { ! return true; ! } ! ! for (int i = 0; i < types.length; i++) ! { ! if(type.equals(types[i])) ! { ! return true; ! } ! } ! return false; ! } ! ! ! public void writeToTableCache(ITableInfo info) ! { ! String tableName = info.getSimpleName(); ! CaseInsensitiveString ciTableName = new CaseInsensitiveString(tableName); ! ! tableNames.put(ciTableName, tableName); ! iTableInfos.put(info, info); ! ! ArrayList aITabInfos = (ArrayList) tableInfosBySimpleName.get(ciTableName); ! if(null == aITabInfos) ! { ! aITabInfos = new ArrayList(); ! tableInfosBySimpleName.put(ciTableName, aITabInfos); ! } ! aITabInfos.add(info); ! ! if(null == _schemaPropsCacheIsBasedOn) ! { ! // We are not in initial load, so set refresh date ! _lastCacheRefershDate = new Date(); ! } ! ! } ! ! ! public void writeToProcedureCache(IProcedureInfo procedure) ! { ! String proc = procedure.getSimpleName(); ! if (proc.length() > 0) ! { ! CaseInsensitiveString ciProc = new CaseInsensitiveString(proc); ! procedureNames.put(ciProc ,proc); ! ! ArrayList aIProcInfos = (ArrayList) procedureInfosBySimpleName.get(ciProc); ! if(null == aIProcInfos) ! { ! aIProcInfos = new ArrayList(); ! procedureInfosBySimpleName.put(ciProc, aIProcInfos); ! } ! aIProcInfos.add(procedure); ! } ! iProcedureInfos.put(procedure, procedure); ! ! if(null == _schemaPropsCacheIsBasedOn) ! { ! // We are not in initial load, so set refresh date ! _lastCacheRefershDate = new Date(); ! } ! ! ! } ! ! ! public void writeColumsToCache(TableColumnInfo[] infos, CaseInsensitiveString simpleTableName) ! { ! ArrayList ecisInTable = new ArrayList(); ! for (int i = 0; i < infos.length; i++) ! { ! ExtendedColumnInfo eci = new ExtendedColumnInfo(infos[i], simpleTableName.toString()); ! ecisInTable.add(eci); ! ! CaseInsensitiveString ciColName = new CaseInsensitiveString(eci.getColumnName()); ! ArrayList ecisInColName = (ArrayList) extColumnInfosByColumnName.get(ciColName); ! if(null == ecisInColName) ! { ! ecisInColName = new ArrayList(); ! extColumnInfosByColumnName.put(ciColName, ecisInColName); ! } ! ecisInColName.add(eci); ! } ! ! // Note: A CaseInsensitiveString can be a mutable string. ! // In fact it is a mutable string here because this is usually called from ! // within Syntax coloring which uses a mutable string. ! CaseInsensitiveString imutableString = new CaseInsensitiveString(simpleTableName.toString()); ! extendedColumnInfosByTableName.put(imutableString, ecisInTable); ! } ! ! ! public void initialLoadDone() ! { ! /** ! * When _schemaPropsCacheIsBasedOn is null all loading will be done like there was no cache. ! * ! * This will make sure loading only heeds the cache during initial loading. ! * ! * Any further loading (via Object tree or tool bar) will be treated as a Cache refresh. ! */ ! _schemaPropsCacheIsBasedOn = null; ! } ! ! void prepareSerialization() ! { ! _schemaPropsCacheIsBasedOn = _session.getAlias().getSchemaProperties(); ! ! if(false == _schemaPropsCacheIsBasedOn.isCacheSchemaIndependentMetaData()) ! { ! clearSchemaIndependentData(); ! } ! ! if(SQLAliasSchemaProperties.GLOBAL_STATE_LOAD_ALL_CACHE_NONE == _schemaPropsCacheIsBasedOn.getGlobalState()) ! { ! clearAllSchemaDependentData(); ! } ! else if(SQLAliasSchemaProperties.GLOBAL_STATE_SPECIFY_SCHEMAS == _schemaPropsCacheIsBasedOn.getGlobalState()) ! { ! SchemaTableTypeCombination[] tableTypeCombis = ! _schemaPropsCacheIsBasedOn.getAllSchemaTableTypeCombinationsNotToBeCached(_tabelTableTypesCacheable, _viewTableTypesCacheable); ! ! for (int i = 0; i < tableTypeCombis.length; i++) ! { ! clearTables(null, tableTypeCombis[i].schemaName, null, tableTypeCombis[i].types); ! } ! ! String[] procedureSchemas = _schemaPropsCacheIsBasedOn.getAllSchemaProceduresNotToBeCached(); ! for (int i = 0; i < procedureSchemas.length; i++) ! { ! clearStoredProcedures(null, procedureSchemas[i], null); ! } ! ! ! } ! ! } ! ! public void clearAll() ! { ! clearSchemaIndependentData(); ! ! ! clearAllSchemaDependentData(); ! ! } ! ! private void clearAllSchemaDependentData() ! { ! tableNames.clear(); ! iTableInfos.clear(); ! tableInfosBySimpleName.clear(); ! ! extColumnInfosByColumnName.clear(); ! extendedColumnInfosByTableName.clear(); ! ! ! procedureNames.clear(); ! iProcedureInfos.clear(); ! procedureInfosBySimpleName.clear(); ! } ! ! private void clearSchemaIndependentData() ! { ! catalogs.clear(); ! schemas.clear(); ! ! keywords.clear(); ! dataTypes.clear(); ! functions.clear(); ! } ! ! public void clearTables(String catalogName, String schemaName, String simpleName, String[] types) ! { ! for(Iterator i = iTableInfos.keySet().iterator(); i.hasNext();) ! { ! ITableInfo ti = (ITableInfo) i.next(); ! ! ! boolean matches = matchesMetaString(ti.getCatalogName(), catalogName); ! matches &= matchesMetaString(ti.getSchemaName(), schemaName); ! matches &= matchesMetaString(ti.getSimpleName(), simpleName); ! ! if(null != types) ! { ! boolean found = false; ! for (int j = 0; j < types.length; j++) ! { ! if(types[j].equals(ti.getType())) ! { ! found = true; ! break; ! } ! } ! ! matches &= found; ! } ! ! if(matches) ! { ! i.remove(); ! ! CaseInsensitiveString ciSimpleName = new CaseInsensitiveString(ti.getSimpleName()); ! ArrayList tableInfos = (ArrayList) tableInfosBySimpleName.get(ciSimpleName); ! tableInfos.remove(ti); ! if(0 == tableInfos.size()) ! { ! tableInfosBySimpleName.remove(ciSimpleName); ! tableNames.remove(ciSimpleName); ! } ! ! ArrayList ecisInTable = (ArrayList) extendedColumnInfosByTableName.get(ciSimpleName); ! ! if(null == ecisInTable) ! { ! // Columns have not yet been loaded ! continue; ! } ! ! for(Iterator j=ecisInTable.iterator();j.hasNext();) ! { ! ExtendedColumnInfo eci = (ExtendedColumnInfo) j.next(); ! ! String qn1 = ti.getCatalogName() + "." + ti.getSchemaName() + "." + ti.getSimpleName(); ! String qn2 = eci.getCatalog() + "." + eci.getSchema() + "." + eci.getSimpleTableName(); ! if(qn1.equals(qn2)) ! { ! j.remove(); ! } ! ! CaseInsensitiveString ciColName = new CaseInsensitiveString(eci.getColumnName()); ! ArrayList ecisInColumn = (ArrayList) extColumnInfosByColumnName.get(ciColName); ! ecisInColumn.remove(eci); ! ! if(0 == ecisInColumn.size()) ! { ! extColumnInfosByColumnName.remove(ciColName); ! } ! } ! ! if(0 == ecisInTable.size()) ! { ! extendedColumnInfosByTableName.remove(ciSimpleName); ! } ! } ! } ! ! } ! ! public void clearStoredProcedures(String catalogName, String schemaName, String simpleName) ! { ! for(Iterator i = iProcedureInfos.keySet().iterator(); i.hasNext();) ! { ! IProcedureInfo pi = (IProcedureInfo) i.next(); ! ! ! boolean matches = matchesMetaString(pi.getCatalogName(), catalogName); ! matches &= matchesMetaString(pi.getSchemaName(), schemaName); ! matches &= matchesMetaString(pi.getSimpleName(), simpleName); ! ! ! if(matches) ! { ! i.remove(); ! ! CaseInsensitiveString ciSimpleName = new CaseInsensitiveString(pi.getSimpleName()); ! ArrayList procedureInfos = (ArrayList) procedureInfosBySimpleName.get(ciSimpleName); ! procedureInfos.remove(pi); ! if(0 == procedureInfos.size()) ! { ! procedureInfosBySimpleName.remove(ciSimpleName); ! procedureNames.remove(ciSimpleName); ! } ! ! } ! } ! } ! ! ! private boolean matchesMetaString(String s, String toCheck) ! { ! if(null == s || null == toCheck) ! { ! return true; ! } ! ! return s.equals(toCheck); ! } ! ! public boolean loadSchemaNames() ! { ! return _session.getAlias().getSchemaProperties().loadSchemaNames(_schemaPropsCacheIsBasedOn); ! } ! ! public SchemaNameLoadInfo getSchemaNameLoadInfo() ! { ! return _session.getAlias().getSchemaProperties().getSchemaNameLoadInfo(_schemaPropsCacheIsBasedOn); } } Index: SchemaInfoUpdateCheck.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo/SchemaInfoUpdateCheck.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SchemaInfoUpdateCheck.java 28 May 2006 20:22:58 -0000 1.2 --- SchemaInfoUpdateCheck.java 19 Jun 2006 20:44:33 -0000 1.3 *************** *** 148,152 **** SQLDatabaseMetaData dmd = _session.getSQLConnection().getSQLMetaData(); DatabaseObjectInfo sessionOI = new DatabaseObjectInfo(null, null, "SessionDummy", DatabaseObjectType.SESSION, dmd); ! _session.getSchemaInfo().reloadCache(sessionOI); --- 148,152 ---- SQLDatabaseMetaData dmd = _session.getSQLConnection().getSQLMetaData(); DatabaseObjectInfo sessionOI = new DatabaseObjectInfo(null, null, "SessionDummy", DatabaseObjectType.SESSION, dmd); ! _session.getSchemaInfo().reload(sessionOI); *************** *** 157,161 **** { IDatabaseObjectInfo doi = (IDatabaseObjectInfo) i.next(); ! _session.getSchemaInfo().reloadCache(doi); } --- 157,161 ---- { IDatabaseObjectInfo doi = (IDatabaseObjectInfo) i.next(); ! _session.getSchemaInfo().reload(doi); } *************** *** 163,167 **** { String simpleTableName = (String) i.next(); ! _session.getSchemaInfo().cleanAndReloadCacheForSimpleTableName(simpleTableName); } --- 163,167 ---- { String simpleTableName = (String) i.next(); ! _session.getSchemaInfo().refershCacheForSimpleTableName(simpleTableName); } *************** *** 169,173 **** { String simpleProcName = (String) i.next(); ! _session.getSchemaInfo().cleanAndReloadCacheForSimpleProcedureName(simpleProcName); } --- 169,173 ---- { String simpleProcName = (String) i.next(); ! _session.getSchemaInfo().refreshCacheForSimpleProcedureName(simpleProcName); } Index: SchemaInfo.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/schemainfo/SchemaInfo.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SchemaInfo.java 15 Jun 2006 21:53:41 -0000 1.6 --- SchemaInfo.java 19 Jun 2006 20:44:33 -0000 1.7 *************** *** 26,29 **** --- 26,31 ---- import net.sourceforge.squirrel_sql.client.IApplication; + import net.sourceforge.squirrel_sql.client.gui.db.SchemaLoadInfo; + import net.sourceforge.squirrel_sql.client.gui.db.SchemaNameLoadInfo; import net.sourceforge.squirrel_sql.client.session.event.SessionAdapter; import net.sourceforge.squirrel_sql.client.session.event.SessionEvent; *************** *** 50,57 **** - /** Logger for this class. */ private static final ILogger s_log = LoggerController.createLogger(SchemaInfo.class); private SessionAdapter _sessionListener; private static final int LOAD_METHODS_COUNT = 7; private static final int MAX_PROGRESS = 100; --- 52,63 ---- private static final ILogger s_log = LoggerController.createLogger(SchemaInfo.class); private SessionAdapter _sessionListener; + + /** + * The number of load methods + */ private static final int LOAD_METHODS_COUNT = 7; + private static final int MAX_PROGRESS = 100; *************** *** 65,70 **** private boolean _schemasAndCatalogsLoaded; - /** the status message that was written by the object tree to be restored */ - public SchemaInfo(IApplication app) { --- 71,74 ---- *************** *** 90,93 **** --- 94,102 ---- } } + + public void sessionClosing(SessionEvent evt) + { + SchemaInfoCacheSerializer.store(_session, _schemaInfoCache); + } }; *************** *** 99,103 **** ! public void load(ISession session) { synchronized (this) --- 108,154 ---- ! public void initialLoad(ISession session) ! { ! synchronized (this) ! { ! if (_loading || _loaded) ! { ! return; ! } ! } ! ! _session = session; ! ! breathing(); ! _schemaInfoCache = SchemaInfoCacheSerializer.load(_session); ! ! try ! { ! privateLoadAll(); ! } ! finally ! { ! _schemaInfoCache.initialLoadDone(); ! } ! } ! ! ! public void reloadAll() ! { ! synchronized (this) ! { ! if(_loading) ! { ! return; ! } ! } ! ! _schemaInfoCache.clearAll(); ! ! privateLoadAll(); ! } ! ! ! private void privateLoadAll() { synchronized (this) *************** *** 117,133 **** long mstart = System.currentTimeMillis(); String msg = null; - if (session == null) - { - throw new IllegalArgumentException("Session == null"); - } try { - _session = session; SQLConnection conn = _session.getSQLConnection(); _dmd = conn.getSQLMetaData(); _dmd.clearCache(); - _schemaInfoCache = new SchemaInfoCache(session.getAlias()); --- 168,178 ---- *************** *** 206,211 **** } ! String[] tableTypesToPreload = getTableTypesToCache(); ! progress = loadTables(null, null, null, tableTypesToPreload, progress); progress = loadStoredProcedures(null, null, null, progress); --- 251,255 ---- } ! progress = loadTables(null, null, null, null, progress); progress = loadStoredProcedures(null, null, null, progress); *************** *** 226,261 **** } - private String[] getTableTypesToCache() - { - String typeTable = "TABLE"; - String typeView = "VIEW"; - String[] availableTableTypes = new String[]{typeTable, typeView}; - try - { - availableTableTypes = _dmd.getTableTypes(); - } - catch (SQLException e) - { - s_log.error("Could not get table types", e); - } - - if(containsType(availableTableTypes, typeTable)) - { - _schemaInfoCache.cachedTableTypes.put(typeTable, typeTable); - } - - if (containsType(availableTableTypes, typeView)) - { - _schemaInfoCache.cachedTableTypes.put(typeView, typeView); - } - - String typeSystemTable = "SYSTEM TABLE"; - if (containsType(availableTableTypes, typeSystemTable)) - { - _schemaInfoCache.cachedTableTypes.put(typeSystemTable, typeSystemTable); - } - - return (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); - } private int loadStoredProcedures(String catalog, String schema, String procNamePattern, int progress) --- 270,273 ---- *************** *** 310,316 **** private int loadSchemas(int progress) { - String msg; try { // i18n[SchemaInfo.loadingSchemas=Loading schemas] msg = s_stringMgr.getString("SchemaInfo.loadingSchemas"); --- 322,328 ---- private int loadSchemas(int progress) { try { + String msg; // i18n[SchemaInfo.loadingSchemas=Loading schemas] msg = s_stringMgr.getString("SchemaInfo.loadingSchemas"); *************** *** 335,341 **** private int loadCatalogs(int progress) { - String msg; try { // i18n[SchemaInfo.loadingCatalogs=Loading catalogs] msg = s_stringMgr.getString("SchemaInfo.loadingCatalogs"); --- 347,353 ---- private int loadCatalogs(int progress) { try { + String msg; // i18n[SchemaInfo.loadingCatalogs=Loading catalogs] msg = s_stringMgr.getString("SchemaInfo.loadingCatalogs"); *************** *** 385,389 **** try { ! wait(100); } catch (InterruptedException e) --- 397,401 ---- try { ! wait(50); } catch (InterruptedException e) *************** *** 396,404 **** private void privateLoadStoredProcedures(String catalog, String schema, String procNamePattern, final String msg, final int beginProgress) { - - final String objFilter = _session.getProperties().getObjectFilter(); try { - s_log.debug("Loading stored procedures with filter "+objFilter); ProgressCallBack pcb = new ProgressCallBack() --- 408,413 ---- *************** *** 411,447 **** ! String[] allowedSchemas = new String[]{schema}; ! if(null == allowedSchemas[0]) ! { ! String[] buf = _session.getApplication().getSessionManager().getAllowedSchemas(_session); ! if(null != buf) ! { ! allowedSchemas = buf; ! } ! } ! for (int i = 0; i < allowedSchemas.length; i++) { ! IProcedureInfo[] procedures = _dmd.getProcedures(catalog, allowedSchemas[i], procNamePattern, pcb); ! ! for (int j = 0; j < procedures.length; j++) { ! String proc = (String) procedures[j].getSimpleName(); ! if (proc.length() > 0) ! { ! CaseInsensitiveString ciProc = new CaseInsensitiveString(proc); ! _schemaInfoCache.procedureNames.put(ciProc ,proc); ! ArrayList aIProcInfos = (ArrayList) _schemaInfoCache.procedureInfosBySimpleName.get(ciProc); ! if(null == aIProcInfos) ! { ! aIProcInfos = new ArrayList(); ! _schemaInfoCache.procedureInfosBySimpleName.put(ciProc, aIProcInfos); ! } ! aIProcInfos.add(procedures[j]); } - _schemaInfoCache.iProcedureInfos.put(procedures[j], procedures[j]); } - } } --- 420,436 ---- ! SchemaLoadInfo[] schemaLoadInfos = _schemaInfoCache.getMatchingSchemaLoadInfos(schema); ! for (int i = 0; i < schemaLoadInfos.length; i++) { ! if(schemaLoadInfos[i].loadProcedures) { ! IProcedureInfo[] procedures = _dmd.getProcedures(catalog, schemaLoadInfos[i].schemaName, procNamePattern, pcb); ! for (int j = 0; j < procedures.length; j++) ! { ! _schemaInfoCache.writeToProcedureCache(procedures[j]); } } } } *************** *** 457,460 **** --- 446,454 ---- try { + if(false == _schemaInfoCache.loadSchemaIndependentMetaData()) + { + return; + } + _schemaInfoCache.catalogs.clear(); _schemaInfoCache.catalogs.addAll(Arrays.asList(_dmd.getCatalogs())); *************** *** 470,483 **** try { ! String[] allowedSchemas = _session.getApplication().getSessionManager().getAllowedSchemas(_session); _schemaInfoCache.schemas.clear(); ! if(null == allowedSchemas) { _schemaInfoCache.schemas.addAll(Arrays.asList(_dmd.getSchemas())); } else { ! _schemaInfoCache.schemas.addAll(Arrays.asList(allowedSchemas)); } } --- 464,490 ---- try { ! ! SchemaNameLoadInfo schemaNameLoadInfo = _schemaInfoCache.getSchemaNameLoadInfo(); ! ! if(SchemaNameLoadInfo.STATE_DONT_REFERESH_SCHEMA_NAMES == schemaNameLoadInfo.state) ! { ! return; ! } _schemaInfoCache.schemas.clear(); ! if(SchemaNameLoadInfo.STATE_REFERESH_SCHEMA_NAMES_FROM_DB == schemaNameLoadInfo.state) { _schemaInfoCache.schemas.addAll(Arrays.asList(_dmd.getSchemas())); } + else if(SchemaNameLoadInfo.STATE_USES_PROVIDED_SCHEMA_NAMES == schemaNameLoadInfo.state) + { + for (int i = 0; i < schemaNameLoadInfo.schemaNames.length; i++) + { + _schemaInfoCache.schemas.add(schemaNameLoadInfo.schemaNames[i]); + } + } else { ! throw new IllegalArgumentException("Unknown SchemaNameLoadInfo.state = " + schemaNameLoadInfo.state); } } *************** *** 597,601 **** if (!_loading && data != null) { ! return _schemaInfoCache.columnNames.containsKey(data); } return false; --- 604,608 ---- if (!_loading && data != null) { ! return _schemaInfoCache.extColumnInfosByColumnName.containsKey(data); } return false; *************** *** 640,645 **** --- 647,658 ---- try { + if(false == _schemaInfoCache.loadSchemaIndependentMetaData()) + { + return; + } + setProgress(msg + " (default keywords)", beginProgress); + _schemaInfoCache.keywords.clear(); for (int i = 0; i < DefaultKeywords.KEY_WORDS.length; i++) { *************** *** 662,692 **** } ! try ! { ! addSingleKeyword(_dmd.getCatalogTerm()); ! } ! catch (Throwable ex) ! { ! s_log.error("Error", ex); ! } ! ! try ! { ! addSingleKeyword(_dmd.getSchemaTerm()); ! } ! catch (Throwable ex) ! { ! s_log.error("Error", ex); ! } ! try ! { ! addSingleKeyword(_dmd.getProcedureTerm()); ! } ! catch (Throwable ex) ! { ! s_log.error("Error", ex); ! } } } --- 675,686 ---- } + String catalogTerm = _dmd.getCatalogTerm(); + _schemaInfoCache.keywords.put(new CaseInsensitiveString(catalogTerm), catalogTerm); ! String schemaTerm = _dmd.getSchemaTerm(); ! _schemaInfoCache.keywords.put(new CaseInsensitiveString(schemaTerm), schemaTerm); ! String procedureTerm = _dmd.getProcedureTerm(); ! _schemaInfoCache.keywords.put(new CaseInsensitiveString(procedureTerm), procedureTerm); } } *************** *** 701,705 **** --- 695,705 ---- try { + if(false == _schemaInfoCache.loadSchemaIndependentMetaData()) + { + return; + } + + _schemaInfoCache.dataTypes.clear(); DataTypeInfo[] infos = _dmd.getDataTypes(); for (int i = 0; i < infos.length; i++) *************** *** 723,726 **** --- 723,731 ---- private void loadFunctions(String msg, int beginProgress) { + if(false == _schemaInfoCache.loadSchemaIndependentMetaData()) + { + return; + } + ArrayList buf = new ArrayList(); *************** *** 755,758 **** --- 760,764 ---- } + _schemaInfoCache.functions.clear(); for (int i = 0; i < buf.size(); i++) { *************** *** 767,782 **** - private void addSingleKeyword(String keyword) - { - if (keyword != null) - { - keyword = keyword.trim(); - - if (keyword.length() > 0) - { - _schemaInfoCache.keywords.put(new CaseInsensitiveString(keyword), keyword); - } - } - } public String[] getKeywords() --- 773,776 ---- *************** *** 823,837 **** public ITableInfo[] getITableInfos(String catalog, String schema, String simpleName) { ! String[] types = (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); ! return getITableInfos(catalog, schema, simpleName, types); } public ITableInfo[] getITableInfos(String catalog, String schema, String tableNamePattern, String[] types) { - ITableInfo[] tableInfosForUncachedTypes = getTableInfosForUncachedTypes(catalog, schema, tableNamePattern, types); - ArrayList ret = new ArrayList(); ! ! ret.addAll(Arrays.asList(tableInfosForUncachedTypes)); for(Iterator i=_schemaInfoCache.iTableInfos.keySet().iterator(); i.hasNext();) --- 817,832 ---- public ITableInfo[] getITableInfos(String catalog, String schema, String simpleName) { ! return getITableInfos(catalog, schema, simpleName, null); } public ITableInfo[] getITableInfos(String catalog, String schema, String tableNamePattern, String[] types) { ArrayList ret = new ArrayList(); ! if (null != types) ! { ! // By default null == types we return only cached types ! ITableInfo[] tableInfosForUncachedTypes = getTableInfosForUncachedTypes(catalog, schema, tableNamePattern, types); ! ret.addAll(Arrays.asList(tableInfosForUncachedTypes)); ! } for(Iterator i=_schemaInfoCache.iTableInfos.keySet().iterator(); i.hasNext();) *************** *** 849,853 **** } ! if(false == containsType(types, iTableInfo.getType())) { continue; --- 844,848 ---- } ! if(false == SchemaInfoCache.containsType(types, iTableInfo.getType())) { continue; *************** *** 881,885 **** for (int i = 0; i < types.length; i++) { ! if(false == _schemaInfoCache.cachedTableTypes.containsKey(types[i])) { missingTypes.add(types[i]); --- 876,880 ---- for (int i = 0; i < types.length; i++) { ! if(false == _schemaInfoCache.isCachedTableType(types[i])) { missingTypes.add(types[i]); *************** *** 917,931 **** } - private boolean containsType(String[] types, String type) - { - for (int i = 0; i < types.length; i++) - { - if(type.equals(types[i])) - { - return true; - } - } - return false; - } --- 912,915 ---- *************** *** 1007,1045 **** }; ! String[] allowedSchemas = new String[]{schema}; ! if(null == allowedSchemas[0]) ! { ! String[] buf = _session.getApplication().getSessionManager().getAllowedSchemas(_session); ! if(null != buf) ! { ! allowedSchemas = buf; ! } ! } ! ! for (int i = 0; i < allowedSchemas.length; i++) { ! ITableInfo[] infos = _dmd.getTables(catalog, allowedSchemas[i], tableNamePattern, types, pcb); for (int j = 0; j < infos.length; j++) { ! String tableName = infos[j].getSimpleName(); ! CaseInsensitiveString ciTableName = new CaseInsensitiveString(tableName); ! ! _schemaInfoCache.tableNames.put(ciTableName, tableName); ! _schemaInfoCache.iTableInfos.put(infos[j], infos[j]); ! ! ArrayList aITabInfos = (ArrayList) _schemaInfoCache.tableInfosBySimpleName.get(ciTableName); ! if(null == aITabInfos) ! { ! aITabInfos = new ArrayList(); ! _schemaInfoCache.tableInfosBySimpleName.put(ciTableName, aITabInfos); ! } ! aITabInfos.add(infos[j]); ! ! _schemaInfoCache.extendedColumnInfosByTableName.remove(ciTableName); ! ! // Note: do not clear _schemaInfoCache.columnNames because the same column ! // names might be used in more than one table. ! // We live with a bit of inexact column names. } } --- 991,1002 ---- }; + SchemaLoadInfo[] schemaLoadInfos = _schemaInfoCache.getMatchingSchemaLoadInfos(schema, types); ! for (int i = 0; i < schemaLoadInfos.length; i++) { ! ITableInfo[] infos = _dmd.getTables(catalog, schemaLoadInfos[i].schemaName, tableNamePattern, schemaLoadInfos[i].tableTypes, pcb); for (int j = 0; j < infos.length; j++) { ! _schemaInfoCache.writeToTableCache(infos[j]); } } *************** *** 1112,1132 **** new TableInfo(null, null, name, "TABLE", null, _dmd); TableColumnInfo[] infos = _dmd.getColumnInfo(ti); ! ArrayList result = new ArrayList(); ! for (int i = 0; i < infos.length; i++) ! { ! ExtendedColumnInfo buf = new ExtendedColumnInfo(infos[i]); ! result.add(buf); ! _schemaInfoCache.columnNames.put(new CaseInsensitiveString(buf.getColumnName()), buf.getColumnName()); ! ! } ! ! ! // Note: A CaseInsensitiveString can be a mutable string. ! // In fact it is a mutable string here because this is usually called from ! // within Syntax coloring which uses a mutable string. ! CaseInsensitiveString imutableString = new CaseInsensitiveString(tableName.toString()); ! _schemaInfoCache.extendedColumnInfosByTableName.put(imutableString, result); } public ExtendedColumnInfo[] getExtendedColumnInfos(String tableName) { --- 1069,1076 ---- new TableInfo(null, null, name, "TABLE", null, _dmd); TableColumnInfo[] infos = _dmd.getColumnInfo(ti); ! _schemaInfoCache.writeColumsToCache(infos, tableName); } + public ExtendedColumnInfo[] getExtendedColumnInfos(String tableName) { *************** *** 1190,1194 **** } ! public void reloadCache(IDatabaseObjectInfo doi) { try --- 1134,1138 ---- } ! public void reload(IDatabaseObjectInfo doi) { try *************** *** 1199,1203 **** DatabaseObjectType dot = ti.getDatabaseObjectType(); ! String[] types = (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); if(DatabaseObjectType.TABLE == dot) { --- 1143,1147 ---- DatabaseObjectType dot = ti.getDatabaseObjectType(); ! String[] types = null; if(DatabaseObjectType.TABLE == dot) { *************** *** 1209,1212 **** --- 1153,1157 ---- } + _schemaInfoCache.clearTables(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName(), types); loadTables(ti.getCatalogName(), ti.getSchemaName(), ti.getSimpleName(), types, 1); } *************** *** 1214,1217 **** --- 1159,1163 ---- { IProcedureInfo pi = (IProcedureInfo) doi; + _schemaInfoCache.clearStoredProcedures(pi.getCatalogName(), pi.getSchemaName(), pi.getSimpleName()); loadStoredProcedures(pi.getCatalogName(), pi.getSchemaName(), pi.getSimpleName(), 1); } *************** *** 1219,1228 **** { // load all table types with catalog = doi.getCatalog() and schema = doi.getSchema() ! String[] types = (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); ! loadTables(doi.getCatalogName(), doi.getSchemaName(), null, types, 0); } else if(DatabaseObjectType.TABLE == doi.getDatabaseObjectType()) { // load tables with catalog = doi.getCatalog() and schema = doi.getSchema() loadTables(doi.getCatalogName(), doi.getSchemaName(), null, new String[]{"TABLE"}, 1); } --- 1165,1175 ---- { // load all table types with catalog = doi.getCatalog() and schema = doi.getSchema() ! _schemaInfoCache.clearTables(doi.getCatalogName(), doi.getSchemaName(), null, null); ! loadTables(doi.getCatalogName(), doi.getSchemaName(), null, null, 0); } else if(DatabaseObjectType.TABLE == doi.getDatabaseObjectType()) { // load tables with catalog = doi.getCatalog() and schema = doi.getSchema() + _schemaInfoCache.clearTables(doi.getCatalogName(), doi.getSchemaName(), null, new String[]{"TABLE"}); loadTables(doi.getCatalogName(), doi.getSchemaName(), null, new String[]{"TABLE"}, 1); } *************** *** 1230,1237 **** --- 1177,1186 ---- { // load views with catalog = doi.getCatalog() and schema = doi.getSchema() + _schemaInfoCache.clearTables(doi.getCatalogName(), doi.getSchemaName(), null, new String[]{"VIEW"}); loadTables(doi.getCatalogName(), doi.getSchemaName(), null, new String[]{"VIEW"}, 1); } else if(DatabaseObjectType.PROCEDURE == doi.getDatabaseObjectType() || DatabaseObjectType.PROC_TYPE_DBO == doi.getDatabaseObjectType()) { + _schemaInfoCache.clearStoredProcedures(doi.getCatalogName(), doi.getSchemaName(), null); loadStoredProcedures(doi.getCatalogName(), doi.getSchemaName(), null, 1); } *************** *** 1240,1247 **** int progress = loadSchemas(1); // load tables with catalog = null ! String[] types = (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); ! progress = loadTables(null, doi.getSchemaName(), null, types, progress); // load procedures with catalog = null loadStoredProcedures(null, doi.getSchemaName(), null, progress); } --- 1189,1197 ---- int progress = loadSchemas(1); // load tables with catalog = null ! _schemaInfoCache.clearTables(null, doi.getSchemaName(), null, null); ! progress = loadTables(null, doi.getSchemaName(), null, null, progress); // load procedures with catalog = null + _schemaInfoCache.clearStoredProcedures(null, doi.getSchemaName(), null); loadStoredProcedures(null, doi.getSchemaName(), null, progress); } *************** *** 1250,1262 **** int progress = loadCatalogs(1); // load tables with schema = null ! String[] types = (String[]) _schemaInfoCache.cachedTableTypes.keySet().toArray(new String[0]); ! progress = loadTables(doi.getCatalogName(), null, null, types, progress); // load procedures with schema = null loadStoredProcedures(doi.getCatalogName(), null, null, progress); } else if(DatabaseObjectType.SESSION == doi.getDatabaseObjectType()) { ! load(_session); } --- 1200,1213 ---- int progress = loadCatalogs(1); // load tables with schema = null ! _schemaInfoCache.clearTables(doi.getCatalogName(), null, null, null); ! progress = loadTables(doi.getCatalogName(), null, null, null, progress); // load procedures with schema = null + _schemaInfoCache.clearStoredProcedures(doi.getCatalogName(), null, null); loadStoredProcedures(doi.getCatalogName(), null, null, progress); } else if(DatabaseObjectType.SESSION == doi.getDatabaseObjectType()) { ! reloadAll(); } *************** *** 1297,1331 **** } ! public void cleanAndReloadCacheForSimpleTableName(String simpleTableName) { - ///////////////////////////////////////////////////////////////////////////////////////// - // Remove all matching table types from cache HashMap caseSensitiveTableNames = new HashMap(); CaseInsensitiveString caseInsensitiveTableName = new CaseInsensitiveString(simpleTableName); ! String caseSensitiveTableName = (String) _schemaInfoCache.tableNames.remove(caseInsensitiveTableName); caseSensitiveTableNames.put(caseSensitiveTableName, caseSensitiveTableName); - ArrayList iTableInfos = (ArrayList) _schemaInfoCache.tableInfosBySimpleName.remove(caseInsensitiveTableName); - - for (int i = 0; i < iTableInfos.size(); i++) - { - ITableInfo iTableInfo = (ITableInfo) iTableInfos.get(i); - _schemaInfoCache.iTableInfos.remove(iTableInfo); - caseSensitiveTableNames.put(iTableInfo.getSimpleName(), iTableInfo.getSimpleName()); - } - - _schemaInfoCache.extendedColumnInfosByTableName.remove(caseInsensitiveTableName); - - // Note: do not clear _schemaInfoCache.columnNames because the same column - // names might be used in more than one table. - // We live with a bit of inexact column names. - - // - ///////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////// // Reload all matching table types --- 1248,1260 ---- } ! public void refershCacheForSimpleTableName(String simpleTableName) { HashMap caseSensitiveTableNames = new HashMap(); CaseInsensitiveString caseInsensitiveTableName = new CaseInsensitiveString(simpleTableName); ! String caseSensitiveTableName = (String) _schemaInfoCache.tableNames.get(caseInsensitiveTableName); caseSensitiveTableNames.put(caseSensitiveTableName, caseSensitiveTableName); //////////////////////////////////////////////////////////////////////// // Reload all matching table types *************** *** 1334,1338 **** String buf = (String) i.next(); TableInfo ti = new TableInfo(null, null, buf, null, null, _dmd); ! reloadCache(ti); } // --- 1263,1267 ---- String buf = (String) i.next(); TableInfo ti = new TableInfo(null, null, buf, null, null, _dmd); ! reload(ti); } // *************** *** 1340,1347 **** } ! public void cleanAndReloadCacheForSimpleProcedureName(String simpleProcName) { - ///////////////////////////////////////////////////////////////////////////////////////// - // Remove all matching procedures from cache HashMap caseSensitiveProcNames = new HashMap(); --- 1269,1274 ---- } ! public void refreshCacheForSimpleProcedureName(String simpleProcName) { HashMap caseSensitiveProcNames = new HashMap(); *************** *** 1351,1367 **** caseSensitiveProcNames.put(caseSensitiveProcName, caseSensitiveProcName); - ArrayList iProcInfos = (ArrayList) _schemaInfoCache.procedureInfosBySimpleName.remove(caseInsensitiveProcName); - - for (int i = 0; i < iProcInfos.size(); i++) - { - IProcedureInfo iProcInfo = (IProcedureInfo) iProcInfos.get(i); - _schemaInfoCache.iProcedureInfos.remove(iProcInfo); - caseSensitiveProcNames.put(iProcInfo.getSimpleName(), iProcInfo.getSimpleName()); - } - // - ///////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////// // Reload all matching procedure types --- 1278,1281 ---- *************** *** 1370,1374 **** String buf = (String) i.next(); ProcedureInfo pi = new ProcedureInfo(null, null, buf, null, DatabaseMetaData.procedureResultUnknown, _dmd); ! reloadCache(pi); } // --- 1284,1288 ---- String buf = (String) i.next(); ProcedureInfo pi = new ProcedureInfo(null, null, buf, null, DatabaseMetaData.procedureResultUnknown, _dmd); ! reload(pi); } // --- NEW FILE: SchemaInfoCacheSerializer.java --- package net.sourceforge.squirrel_sql.client.session.schemainfo; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.util.ApplicationFiles; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import net.sourceforge.squirrel_sql.fw.id.IIdentifier; import java.io.*; import java.util.Hashtable; public class SchemaInfoCacheSerializer { private static final ILogger s_log = LoggerController.createLogger(SchemaInfoCacheSerializer.class); private static Hashtable _storingSessionIDs = new Hashtable(); private static boolean _waitingForStoring = false; public static SchemaInfoCache load(ISession session) { SchemaInfoCache ret = privateLoad(session); ret.setSession(session); return ret; } private static SchemaInfoCache privateLoad(ISession session) { File schemaCacheFile = getSchemaCacheFile(session); if(false == session.getAlias().getSchemaProperties().getExpectsSomeCachedData()) { // Current Alias Schema properties dont want cache. // so we don't cache. try { if(schemaCacheFile.exists() && false == schemaCacheFile.delete()) { s_log.error("Failed to delete Schema cache file " + schemaCacheFile.getPath()); } } catch (Exception e) { s_log.error("Could not delete Schema cache file " + schemaCacheFile.getPath(), e); } return new SchemaInfoCache(); } if(false == schemaCacheFile.exists()) { return new SchemaInfoCache(); } try { FileInputStream fis = new FileInputStream(schemaCacheFile); ObjectInputStream ois = new ObjectInputStream(fis) { protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { return SchemaInfoCache.class.getClassLoader().loadClass(desc.getName()); } }; SchemaInfoCache ret = (SchemaInfoCache) ois.readObject(); ois.close(); fis.close(); ... [truncated message content] |