use of org.apache.derby.iapi.sql.depend.DependencyManager in project derby by apache.
the class RenameConstantAction method execGutsRenameColumn.
// do necessary work for rename column at execute time.
private void execGutsRenameColumn(TableDescriptor td, Activation activation) throws StandardException {
ColumnDescriptor columnDescriptor = null;
int columnPosition = 0;
ConstraintDescriptorList constraintDescriptorList;
ConstraintDescriptor constraintDescriptor;
LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
TransactionController tc = lcc.getTransactionExecute();
/* get the column descriptor for column to be renamed and
* using it's position in the table, set the referenced
* column map of the table indicating which column is being
* renamed. Dependency Manager uses this to find out the
* dependents on the column.
*/
columnDescriptor = td.getColumnDescriptor(oldObjectName);
if (columnDescriptor.isAutoincrement())
columnDescriptor.setAutoinc_create_or_modify_Start_Increment(ColumnDefinitionNode.CREATE_AUTOINCREMENT);
columnPosition = columnDescriptor.getPosition();
FormatableBitSet toRename = new FormatableBitSet(td.getColumnDescriptorList().size() + 1);
toRename.set(columnPosition);
td.setReferencedColumnMap(toRename);
dm.invalidateFor(td, DependencyManager.RENAME, lcc);
// look for foreign key dependency on the column.
constraintDescriptorList = dd.getConstraintDescriptors(td);
for (int index = 0; index < constraintDescriptorList.size(); index++) {
constraintDescriptor = constraintDescriptorList.elementAt(index);
int[] referencedColumns = constraintDescriptor.getReferencedColumns();
int numRefCols = referencedColumns.length;
for (int j = 0; j < numRefCols; j++) {
if ((referencedColumns[j] == columnPosition) && (constraintDescriptor instanceof ReferencedKeyConstraintDescriptor))
dm.invalidateFor(constraintDescriptor, DependencyManager.RENAME, lcc);
}
}
// Drop the column
dd.dropColumnDescriptor(td.getUUID(), oldObjectName, tc);
columnDescriptor.setColumnName(newObjectName);
dd.addDescriptor(columnDescriptor, td, DataDictionary.SYSCOLUMNS_CATALOG_NUM, false, tc);
// Need to do following to reload the cache so that table
// descriptor now has new column name
td = dd.getTableDescriptor(td.getObjectID());
}
use of org.apache.derby.iapi.sql.depend.DependencyManager in project derby by apache.
the class RenameConstantAction method executeConstantAction.
// INTERFACE METHODS
/**
* The guts of the Execution-time logic for RENAME TABLE/COLUMN/INDEX.
*
* @see ConstantAction#executeConstantAction
*
* @exception StandardException Thrown on failure
*/
public void executeConstantAction(Activation activation) throws StandardException {
TableDescriptor td;
UUID tableID;
LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
TransactionController tc = lcc.getTransactionExecute();
/*
** 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.
*/
dd.startWriting(lcc);
td = dd.getTableDescriptor(tableId);
if (td == null) {
throw StandardException.newException(SQLState.LANG_TABLE_NOT_FOUND_DURING_EXECUTION, fullTableName);
}
/*
** If the schema descriptor is null, then
** we must have just read ourselves in.
** So we will get the corresponding schema
** descriptor from the data dictionary.
*/
if (sd == null) {
sd = getAndCheckSchemaDescriptor(dd, schemaId, "RENAME TABLE");
}
long heapId = td.getHeapConglomerateId();
/* need to lock table, beetle 4271
*/
lockTableForDDL(tc, heapId, true);
/* need to get td again, in case it's changed before lock acquired
*/
td = dd.getTableDescriptor(tableId);
if (td == null) {
throw StandardException.newException(SQLState.LANG_TABLE_NOT_FOUND_DURING_EXECUTION, fullTableName);
}
switch(renamingWhat) {
case StatementType.RENAME_TABLE:
execGutsRenameTable(td, activation);
break;
case StatementType.RENAME_COLUMN:
execGutsRenameColumn(td, activation);
break;
case StatementType.RENAME_INDEX:
execGutsRenameIndex(td, activation);
break;
default:
if (SanityManager.DEBUG) {
SanityManager.THROWASSERT("Unexpected rename action in RenameConstantAction");
}
break;
}
}
use of org.apache.derby.iapi.sql.depend.DependencyManager in project derby by apache.
the class RenameConstantAction method execGutsRenameIndex.
// do necessary work for rename index at execute time.
private void execGutsRenameIndex(TableDescriptor td, Activation activation) throws StandardException {
LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
TransactionController tc = lcc.getTransactionExecute();
// for indexes, we only invalidate sps, rest we ignore(ie views)
dm.invalidateFor(td, DependencyManager.RENAME_INDEX, lcc);
ConglomerateDescriptor conglomerateDescriptor = dd.getConglomerateDescriptor(oldObjectName, sd, true);
if (conglomerateDescriptor == null)
throw StandardException.newException(SQLState.LANG_INDEX_NOT_FOUND_DURING_EXECUTION, oldObjectName);
/* Drop the index descriptor */
dd.dropConglomerateDescriptor(conglomerateDescriptor, tc);
// Change the index name of the index descriptor
conglomerateDescriptor.setConglomerateName(newObjectName);
// add the index descriptor with new name
dd.addDescriptor(conglomerateDescriptor, sd, DataDictionary.SYSCONGLOMERATES_CATALOG_NUM, false, tc);
}
use of org.apache.derby.iapi.sql.depend.DependencyManager in project derby by apache.
the class RenameConstantAction method execGutsRenameTable.
// do necessary work for rename table at execute time.
private void execGutsRenameTable(TableDescriptor td, Activation activation) throws StandardException {
ConstraintDescriptorList constraintDescriptorList;
ConstraintDescriptor constraintDescriptor;
LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
TransactionController tc = lcc.getTransactionExecute();
dm.invalidateFor(td, DependencyManager.RENAME, lcc);
/* look for foreign key dependency on the table. If found any,
use dependency manager to pass the rename action to the
dependents. */
constraintDescriptorList = dd.getConstraintDescriptors(td);
for (int index = 0; index < constraintDescriptorList.size(); index++) {
constraintDescriptor = constraintDescriptorList.elementAt(index);
if (constraintDescriptor instanceof ReferencedKeyConstraintDescriptor)
dm.invalidateFor(constraintDescriptor, DependencyManager.RENAME, lcc);
}
// Drop the table
dd.dropTableDescriptor(td, sd, tc);
// Change the table name of the table descriptor
td.setTableName(newTableName);
// add the table descriptor with new name
dd.addDescriptor(td, sd, DataDictionary.SYSTABLES_CATALOG_NUM, false, tc);
}
use of org.apache.derby.iapi.sql.depend.DependencyManager in project derby by apache.
the class CreateViewConstantAction method executeConstantAction.
// INTERFACE METHODS
/**
* This is the guts of the Execution-time logic for CREATE VIEW.
*
* @see ConstantAction#executeConstantAction
*
* @exception StandardException Thrown on failure
*/
public void executeConstantAction(Activation activation) throws StandardException {
TableDescriptor td;
UUID toid;
ColumnDescriptor columnDescriptor;
ViewDescriptor vd;
LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
TransactionController tc = lcc.getTransactionExecute();
/*
** 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.
*/
dd.startWriting(lcc);
SchemaDescriptor sd = DDLConstantAction.getSchemaDescriptorForCreate(dd, activation, schemaName);
/* Create a new table descriptor.
* (Pass in row locking, even though meaningless for views.)
*/
DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();
td = ddg.newTableDescriptor(tableName, sd, tableType, TableDescriptor.ROW_LOCK_GRANULARITY);
dd.addDescriptor(td, sd, DataDictionary.SYSTABLES_CATALOG_NUM, false, tc);
toid = td.getUUID();
// for each column, stuff system.column
ColumnDescriptor[] cdlArray = new ColumnDescriptor[columnInfo.length];
int index = 1;
for (int ix = 0; ix < columnInfo.length; ix++) {
columnDescriptor = new ColumnDescriptor(columnInfo[ix].name, index++, columnInfo[ix].dataType, columnInfo[ix].defaultValue, columnInfo[ix].defaultInfo, td, (UUID) null, columnInfo[ix].autoincStart, columnInfo[ix].autoincInc, columnInfo[ix].autoincCycle);
cdlArray[ix] = columnDescriptor;
}
dd.addDescriptorArray(cdlArray, td, DataDictionary.SYSCOLUMNS_CATALOG_NUM, false, tc);
// add columns to the column descriptor list.
ColumnDescriptorList cdl = td.getColumnDescriptorList();
for (int i = 0; i < cdlArray.length; i++) cdl.add(cdlArray[i]);
/* Get and add a view descriptor */
vd = ddg.newViewDescriptor(toid, tableName, viewText, checkOption, (compSchemaId == null) ? lcc.getDefaultSchema().getUUID() : compSchemaId);
for (int ix = 0; ix < providerInfo.length; ix++) {
/* We should always be able to find the Provider */
Provider provider = (Provider) providerInfo[ix].getDependableFinder().getDependable(dd, providerInfo[ix].getObjectId());
dm.addDependency(vd, provider, lcc.getContextManager());
}
// store view's dependency on various privileges in the dependeny system
storeViewTriggerDependenciesOnPrivileges(activation, vd);
dd.addDescriptor(vd, sd, DataDictionary.SYSVIEWS_CATALOG_NUM, true, tc);
}
Aggregations