001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.catalog.TDCacheable
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.sql.catalog;
023:
024: import org.apache.derby.iapi.services.cache.Cacheable;
025: import org.apache.derby.iapi.services.cache.CacheManager;
026:
027: import org.apache.derby.iapi.services.monitor.Monitor;
028:
029: import org.apache.derby.iapi.services.sanity.SanityManager;
030:
031: import org.apache.derby.iapi.services.stream.HeaderPrintWriter;
032:
033: import org.apache.derby.iapi.error.StandardException;
034:
035: import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
036:
037: /**
038: * This class implements a Cacheable for a DataDictionary cache of
039: * table descriptors. It is an abstract class - there is more than
040: * one cache of table descriptors per data dictionary, and this class
041: * provides the implementation that's common to all of them. The lookup
042: * key for the cache (the "identity" of the cache item) is provided by
043: * the subclass.
044: *
045: * Another design alternative was to make the table descriptors themselves
046: * the cacheable objects. This was rejected because: we would have only
047: * one way of caching table descriptors, and we need at least two (by UUID
048: * and by name); the contents of a table descriptor would have to be
049: * split out into a separate class, so it could be used as the createParameter
050: * to the createIdentity() method; the releasing of the Cacheable would
051: * have to be done when at the end of compilation by traversing the tree -
052: * by creating a separate Cacheable object, we can release the object within
053: * the getTableDescriptor() method after getting the table descriptor out
054: * of it.
055: */
056: abstract class TDCacheable implements Cacheable {
057: protected TableDescriptor td;
058: protected final DataDictionaryImpl dd;
059:
060: TDCacheable(DataDictionaryImpl dd) {
061: this .dd = dd;
062: }
063:
064: /* Cacheable interface */
065:
066: /** @see Cacheable#clean */
067: public void clean(boolean forRemove) {
068: return;
069: }
070:
071: /** @see Cacheable#isDirty */
072: public boolean isDirty() {
073: return false;
074: }
075:
076: /**
077: * Get the table descriptor that is associated with this Cacheable
078: */
079: public TableDescriptor getTableDescriptor() {
080: return td;
081: }
082:
083: /**
084: * Check the consistency of the table descriptor held by this TDCacheable
085: * versus an uncached table descriptor.
086: *
087: * @param uncachedTD The uncached descriptor to compare to
088: * @param identity The identity of the table descriptor
089: * @param reportInconsistent A HeaderPrintWriter to send complaints to
090: *
091: * @return true if the descriptors are the same, false if they're different
092: *
093: * @exception StandardException Thrown on error
094: */
095: protected boolean checkConsistency(TableDescriptor uncachedTD,
096: Object identity, HeaderPrintWriter reportInconsistent)
097: throws StandardException {
098: boolean retval = true;
099:
100: if (SanityManager.DEBUG) {
101: if (uncachedTD == null) {
102: reportInconsistent
103: .println("Inconsistent NameTDCacheable: identity = "
104: + identity
105: + ", uncached table descriptor not found.");
106: retval = false;
107: } else {
108: if ((uncachedTD.getHeapConglomerateId() != td
109: .getHeapConglomerateId())
110: || (!uncachedTD.getUUID().equals(td.getUUID()))
111: || (!uncachedTD.getSchemaName().equals(
112: td.getSchemaName()))
113: || (!uncachedTD.getName().equals(td.getName()))
114: || (uncachedTD.getTableType() != td
115: .getTableType())) {
116: reportInconsistent
117: .println("Inconsistent NameTDCacheable: identity = "
118: + identity
119: + ", cached TD = "
120: + td
121: + ", uncached TD = " + uncachedTD);
122:
123: retval = false;
124: }
125: }
126: }
127:
128: return retval;
129: }
130: }
|