⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 createtableconstantaction.java

📁 derby database source code.good for you.
💻 JAVA
字号:
/*   Derby - Class org.apache.derby.impl.sql.execute.CreateTableConstantAction   Copyright 1997, 2005 The Apache Software Foundation or its licensors, as applicable.   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.apache.derby.impl.sql.execute;import org.apache.derby.iapi.sql.execute.ConstantAction;import org.apache.derby.iapi.store.access.TransactionController;import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;import org.apache.derby.iapi.sql.dictionary.DataDictionary;import org.apache.derby.iapi.sql.dictionary.DefaultDescriptor;import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptorList;import org.apache.derby.iapi.sql.dictionary.ColumnDescriptor;import org.apache.derby.iapi.sql.dictionary.ColumnDescriptorList;import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;import org.apache.derby.iapi.sql.dictionary.TableDescriptor;import org.apache.derby.iapi.sql.depend.Provider;import org.apache.derby.iapi.sql.depend.ProviderInfo;import org.apache.derby.iapi.sql.execute.ExecRow;import org.apache.derby.iapi.sql.Activation;import org.apache.derby.iapi.sql.depend.DependencyManager;import org.apache.derby.iapi.error.StandardException;import org.apache.derby.iapi.services.sanity.SanityManager;import org.apache.derby.catalog.UUID;import org.apache.derby.catalog.types.DefaultInfoImpl;import java.util.Properties;/** *	This class  describes actions that are ALWAYS performed for a *	CREATE TABLE Statement at Execution time. * *	@author Rick Hillegas	Extracted code from CreateTableResultSet. */class CreateTableConstantAction extends DDLConstantAction{	private char					lockGranularity;	private boolean					onCommitDeleteRows; //If true, on commit delete rows else on commit preserve rows of temporary table.	private boolean					onRollbackDeleteRows; //If true, on rollback delete rows from temp table if it was logically modified in that UOW. true is the only supported value	private String					tableName;	private String					schemaName;	private int						tableType;	private ColumnInfo[]			columnInfo;	private CreateConstraintConstantAction[]	constraintActions;	private Properties				properties;		/**	 *	Make the ConstantAction for a CREATE TABLE statement.	 *	 *  @param schemaName	name for the schema that table lives in.	 *  @param tableName	Name of table.	 *  @param tableType	Type of table (e.g., BASE, global temporary table).	 *  @param columnInfo	Information on all the columns in the table.	 *		 (REMIND tableDescriptor ignored)	 *  @param constraintActions	CreateConstraintConstantAction[] for constraints	 *  @param properties	Optional table properties	 * @param lockGranularity	The lock granularity.	 * @param onCommitDeleteRows	If true, on commit delete rows else on commit preserve rows of temporary table.	 * @param onRollbackDeleteRows	If true, on rollback, delete rows from temp tables which were logically modified. true is the only supported value	 */	CreateTableConstantAction(								String			schemaName,								String			tableName,								int				tableType,								ColumnInfo[]	columnInfo,								CreateConstraintConstantAction[] constraintActions,								Properties		properties,								char			lockGranularity,								boolean			onCommitDeleteRows,								boolean			onRollbackDeleteRows)	{		this.schemaName = schemaName;		this.tableName = tableName;		this.tableType = tableType;		this.columnInfo = columnInfo;		this.constraintActions = constraintActions;		this.properties = properties;		this.lockGranularity = lockGranularity;		this.onCommitDeleteRows = onCommitDeleteRows;		this.onRollbackDeleteRows = onRollbackDeleteRows;		if (SanityManager.DEBUG)		{			if (tableType == TableDescriptor.BASE_TABLE_TYPE && lockGranularity != TableDescriptor.TABLE_LOCK_GRANULARITY &&				lockGranularity != TableDescriptor.ROW_LOCK_GRANULARITY)			{				SanityManager.THROWASSERT(					"Unexpected value for lockGranularity = " + lockGranularity);			}			if (tableType == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE && onRollbackDeleteRows == false)			{				SanityManager.THROWASSERT(					"Unexpected value for onRollbackDeleteRows = " + onRollbackDeleteRows);			}			SanityManager.ASSERT(schemaName != null, "SchemaName is null");		}	}	// OBJECT METHODS	public	String	toString()	{		if (tableType == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE)			return constructToString("DECLARE GLOBAL TEMPORARY TABLE ", tableName);		else			return constructToString("CREATE TABLE ", tableName);	}	// INTERFACE METHODS	/**	 *	This is the guts of the Execution-time logic for CREATE TABLE.	 *	 *	@see ConstantAction#executeConstantAction	 *	 * @exception StandardException		Thrown on failure	 */	public void	executeConstantAction( Activation activation )		throws StandardException	{		TableDescriptor 			td;		UUID 						toid;		SchemaDescriptor			schemaDescriptor;		ColumnDescriptor			columnDescriptor;		ExecRow						template;		LanguageConnectionContext lcc = activation.getLanguageConnectionContext();		DataDictionary dd = lcc.getDataDictionary();		DependencyManager dm = dd.getDependencyManager();		TransactionController tc = lcc.getTransactionExecute();		/* Mark the activation as being for create table */		activation.setForCreateTable();		/*		** Create a row template to tell the store what type of rows this table		** holds.		*/		template = RowUtil.getEmptyValueRow(columnInfo.length, lcc);		/* Get a template value for each column */		for (int ix = 0; ix < columnInfo.length; ix++)		{			/* If there is a default value, use it, otherwise use null */			if (columnInfo[ix].defaultValue != null)				template.setColumn(ix + 1, columnInfo[ix].defaultValue);			else				template.setColumn(ix + 1,									columnInfo[ix].dataType.getNull()								);		}		/* create the conglomerate to hold the table's rows		 * RESOLVE - If we ever have a conglomerate creator		 * that lets us specify the conglomerate number then		 * we will need to handle it here.		 */		long conglomId = tc.createConglomerate(				"heap", // we're requesting a heap conglomerate				template.getRowArray(), // row template				null, //column sort order - not required for heap				properties, // properties				tableType == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE ?				(TransactionController.IS_TEMPORARY | TransactionController.IS_KEPT) : TransactionController.IS_DEFAULT);		/*		** Inform the data dictionary that we are about to write to it.		** There are several calls to data dictionary "get" methods here		** that might be done in "read" mode in the data dictionary, but		** it seemed safer to do this whole operation in "write" mode.		**		** We tell the data dictionary we're done writing at the end of		** the transaction.		*/		if ( tableType != TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE )			dd.startWriting(lcc);		SchemaDescriptor sd;		if (tableType == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE)			sd = dd.getSchemaDescriptor(schemaName, tc, true);		else			sd = DDLConstantAction.getSchemaDescriptorForCreate(dd, activation, schemaName);		//		// Create a new table descriptor.		// 		DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();		if ( tableType != TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE )		{			td = ddg.newTableDescriptor(tableName, sd, tableType, lockGranularity);			dd.addDescriptor(td, sd, DataDictionary.SYSTABLES_CATALOG_NUM, false, tc);		} else		{			td = ddg.newTableDescriptor(tableName, sd, tableType, onCommitDeleteRows, onRollbackDeleteRows);			td.setUUID(dd.getUUIDFactory().createUUID());		}		toid = td.getUUID();		// Save the TableDescriptor off in the Activation		activation.setDDLTableDescriptor(td);		/* NOTE: We must write the columns out to the system		 * tables before any of the conglomerates, including		 * the heap, since we read the columns before the		 * conglomerates when building a TableDescriptor.		 * This will hopefully reduce the probability of		 * a deadlock involving those system tables.		 */				// for each column, stuff system.column		int index = 1;		ColumnDescriptor[] cdlArray = new ColumnDescriptor[columnInfo.length];		for (int ix = 0; ix < columnInfo.length; ix++)		{			UUID defaultUUID = columnInfo[ix].newDefaultUUID;			/* Generate a UUID for the default, if one exists			 * and there is no default id yet.			 */			if (columnInfo[ix].defaultInfo != null &&				defaultUUID == null)			{				defaultUUID = dd.getUUIDFactory().createUUID();			}			columnDescriptor = new ColumnDescriptor(				                   columnInfo[ix].name,								   index++,								   columnInfo[ix].dataType,								   columnInfo[ix].defaultValue,								   columnInfo[ix].defaultInfo,								   td,								   defaultUUID,								   columnInfo[ix].autoincStart,								   columnInfo[ix].autoincInc							   );			cdlArray[ix] = columnDescriptor;		}		if ( tableType != TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE )		{			dd.addDescriptorArray(cdlArray, td,							  DataDictionary.SYSCOLUMNS_CATALOG_NUM,							  false, tc);		}		// now add the column descriptors to the table.		ColumnDescriptorList cdl = td.getColumnDescriptorList();		for (int i = 0; i < cdlArray.length; i++)			cdl.add(cdlArray[i]);				 		//		// Create a conglomerate desciptor with the conglomId filled in and		// add it.		//		// RESOLVE: Get information from the conglomerate descriptor which		//          was provided. 		//		ConglomerateDescriptor cgd =			ddg.newConglomerateDescriptor(conglomId, null, false, null, false, null, toid,										  sd.getUUID());		if ( tableType != TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE )		{			dd.addDescriptor(cgd, sd, DataDictionary.SYSCONGLOMERATES_CATALOG_NUM,						 false, tc);		}		// add the newly added conglomerate to the table descriptor		ConglomerateDescriptorList conglomList = td.getConglomerateDescriptorList();		conglomList.add(cgd);		/* Create any constraints */		if (constraintActions != null)		{			/*			** Do everything but FK constraints first,			** then FK constraints on 2nd pass.			*/			for (int conIndex = 0; conIndex < constraintActions.length; conIndex++)			{				// skip fks				if (!constraintActions[conIndex].isForeignKeyConstraint())				{					constraintActions[conIndex].executeConstantAction(activation);				}			}			for (int conIndex = 0; conIndex < constraintActions.length; conIndex++)			{				// only foreign keys				if (constraintActions[conIndex].isForeignKeyConstraint())				{					constraintActions[conIndex].executeConstantAction(activation);				}			}		}		if ( tableType == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE )		{			lcc.addDeclaredGlobalTempTable(td);		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -