001: /*
002:
003: Derby - Class org.apache.derby.iapi.db.PropertyInfo
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.iapi.db;
023:
024: import org.apache.derby.iapi.error.StandardException;
025: import org.apache.derby.iapi.error.PublicAPI;
026:
027: import org.apache.derby.iapi.sql.Activation;
028: import org.apache.derby.iapi.sql.conn.Authorizer;
029: import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
030: import org.apache.derby.iapi.sql.conn.ConnectionUtil;
031:
032: import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
033: import org.apache.derby.iapi.sql.dictionary.DataDictionaryContext;
034: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
035: import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
036: import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
037:
038: import org.apache.derby.iapi.store.access.ConglomerateController;
039: import org.apache.derby.iapi.store.access.TransactionController;
040:
041: import org.apache.derby.iapi.services.property.PropertyUtil;
042: import org.apache.derby.iapi.reference.SQLState;
043:
044: import java.util.Properties;
045: import java.sql.SQLException;
046:
047: /**
048: * PropertyInfo is a class with static methods that retrieve the properties
049: * associated with a table or index and set and retrieve properties associated
050: * with a database.
051: *
052: * <P>
053: This class can only be used within an SQL-J statement, a Java procedure or a server side Java method.
054: <p>This class can be accessed using the class alias <code> PROPERTYINFO </code> in SQL-J statements.
055: */
056: public final class PropertyInfo {
057:
058: /**
059: * Get the Properties associated with a given table.
060: *
061: * @param schemaName The name of the schema that the table is in.
062: * @param tableName The name of the table.
063: *
064: * @return Properties The Properties associated with the specified table.
065: * (An empty Properties is returned if the table does not exist.)
066: * @exception SQLException on error
067: */
068: public static Properties getTableProperties(String schemaName,
069: String tableName) throws SQLException {
070: return PropertyInfo.getConglomerateProperties(schemaName,
071: tableName, false);
072: }
073:
074: /**
075: * Get the Properties associated with a given index.
076: *
077: * @param schemaName The name of the schema that the index is in.
078: * @param indexName The name of the index.
079: *
080: * @return Properties The Properties associated with the specified index.
081: * (An empty Properties is returned if the index does not exist.)
082: * @exception SQLException on error
083: */
084: public static Properties getIndexProperties(String schemaName,
085: String indexName) throws SQLException {
086: return PropertyInfo.getConglomerateProperties(schemaName,
087: indexName, true);
088: }
089:
090: /**
091: Fetch the value of a property of the database on the current connection.
092:
093: @param key the property key
094:
095: @return the value of the property or null if the property is not set.
096:
097: @exception SQLException on error
098: */
099: public static String getDatabaseProperty(String key)
100: throws SQLException {
101: LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
102:
103: try {
104: return PropertyUtil.getDatabaseProperty(lcc
105: .getTransactionExecute(), key);
106: } catch (StandardException se) {
107: throw PublicAPI.wrapStandardException(se);
108: }
109: }
110:
111: /**
112: Set or delete the value of a property of the database on the current connection.
113:
114: @param key the property key
115: @param value the new value, if null the property is deleted.
116:
117: @exception SQLException on error
118: */
119: public static void setDatabaseProperty(String key, String value)
120: throws SQLException {
121: LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
122:
123: try {
124: Authorizer a = lcc.getAuthorizer();
125: a
126: .authorize((Activation) null,
127: Authorizer.PROPERTY_WRITE_OP);
128:
129: // Get the current transaction controller
130: TransactionController tc = lcc.getTransactionExecute();
131:
132: tc.setProperty(key, value, false);
133: } catch (StandardException se) {
134: throw PublicAPI.wrapStandardException(se);
135: }
136: }
137:
138: /**
139: Internal use only.
140: */
141: private PropertyInfo() {
142: }
143:
144: //////////////////////////////////////////////////////////////////////////////
145: //
146: // PRIVATE METHODS
147: //
148: /////////////////////////////////////////////////////////////////////////////
149:
150: /**
151: * Get the Properties associated with a given conglomerate
152: *
153: * @param schemaName The name of the schema that the conglomerate is in.
154: * @param conglomerateName The name of the conglomerate.
155: *
156: * @return Properties The Properties associated with the specified conglomerate.
157: * (An empty Properties is returned if the conglomerate does not exist.)
158: * @exception SQLException on error
159: */
160: private static Properties getConglomerateProperties(
161: String schemaName, String conglomerateName, boolean isIndex)
162: throws SQLException {
163: long conglomerateNumber;
164:
165: // find the language context.
166: LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
167:
168: // Get the current transaction controller
169: TransactionController tc = lcc.getTransactionExecute();
170:
171: try {
172:
173: // find the DataDictionary
174: DataDictionary dd = lcc.getDataDictionary();
175:
176: // get the SchemaDescriptor
177: SchemaDescriptor sd = dd.getSchemaDescriptor(schemaName,
178: tc, true);
179: if (!isIndex) {
180: // get the TableDescriptor for the table
181: TableDescriptor td = dd.getTableDescriptor(
182: conglomerateName, sd);
183:
184: // Return an empty Properties if table does not exist or if it is for a view.
185: if ((td == null)
186: || td.getTableType() == TableDescriptor.VIEW_TYPE) {
187: return new Properties();
188: }
189:
190: conglomerateNumber = td.getHeapConglomerateId();
191: } else {
192: // get the ConglomerateDescriptor for the index
193: ConglomerateDescriptor cd = dd
194: .getConglomerateDescriptor(conglomerateName,
195: sd, false);
196:
197: // Return an empty Properties if index does not exist
198: if (cd == null) {
199: return new Properties();
200: }
201:
202: conglomerateNumber = cd.getConglomerateNumber();
203: }
204:
205: ConglomerateController cc = tc.openConglomerate(
206: conglomerateNumber, false, 0,
207: TransactionController.MODE_RECORD,
208: TransactionController.ISOLATION_SERIALIZABLE);
209:
210: Properties properties = tc.getUserCreateConglomPropList();
211: cc.getTableProperties(properties);
212:
213: cc.close();
214: return properties;
215:
216: } catch (StandardException se) {
217: throw PublicAPI.wrapStandardException(se);
218: }
219:
220: }
221: }
|