use of org.datanucleus.store.rdbms.table.ClassView in project datanucleus-rdbms by datanucleus.
the class RDBMSPersistenceHandler method insertObjectInTable.
/**
* Convenience method to handle the insert into the various tables that this object is persisted into.
* @param table The table to process
* @param op ObjectProvider for the object being inserted
* @param clr ClassLoader resolver
*/
private void insertObjectInTable(DatastoreClass table, ObjectProvider op, ClassLoaderResolver clr) {
if (table instanceof ClassView) {
throw new NucleusUserException("Cannot perform InsertRequest on RDBMS view " + table);
}
DatastoreClass supertable = table.getSuperDatastoreClass();
if (supertable != null) {
// Process the superclass table first
insertObjectInTable(supertable, op, clr);
}
// Do the actual insert of this table
getInsertRequest(table, op.getClassMetaData(), clr).execute(op);
// Process any secondary tables
Collection<SecondaryDatastoreClass> secondaryTables = table.getSecondaryDatastoreClasses();
if (secondaryTables != null) {
for (SecondaryDatastoreClass secTable : secondaryTables) {
// Process the secondary table
insertObjectInTable(secTable, op, clr);
}
}
}
use of org.datanucleus.store.rdbms.table.ClassView in project datanucleus-rdbms by datanucleus.
the class RDBMSPersistenceHandler method deleteObjectFromTable.
/**
* Convenience method to handle the delete from the various tables that this object is persisted into.
* @param table The table to process
* @param sm ObjectProvider for the object being deleted
* @param clr ClassLoader resolver
*/
private void deleteObjectFromTable(DatastoreClass table, ObjectProvider sm, ClassLoaderResolver clr) {
if (table instanceof ClassView) {
throw new NucleusUserException("Cannot perform DeleteRequest on RDBMS view " + table);
}
// Delete any secondary tables
Collection<SecondaryDatastoreClass> secondaryTables = table.getSecondaryDatastoreClasses();
if (secondaryTables != null) {
for (SecondaryDatastoreClass secTable : secondaryTables) {
// Process the secondary table
deleteObjectFromTable(secTable, sm, clr);
}
}
// Do the actual delete of this table
getDeleteRequest(table, sm.getClassMetaData(), clr).execute(sm);
DatastoreClass supertable = table.getSuperDatastoreClass();
if (supertable != null) {
// Process the superclass table last
deleteObjectFromTable(supertable, sm, clr);
}
}
use of org.datanucleus.store.rdbms.table.ClassView in project datanucleus-rdbms by datanucleus.
the class RDBMSPersistenceHandler method updateObjectInTable.
/**
* Convenience method to handle the update into the various tables that this object is persisted into.
* @param table The table to process
* @param op ObjectProvider for the object being updated
* @param clr ClassLoader resolver
* @param mmds MetaData for the fields being updated
*/
private void updateObjectInTable(DatastoreClass table, ObjectProvider op, ClassLoaderResolver clr, AbstractMemberMetaData[] mmds) {
if (table instanceof ClassView) {
throw new NucleusUserException("Cannot perform UpdateRequest on RDBMS view " + table);
}
DatastoreClass supertable = table.getSuperDatastoreClass();
if (supertable != null) {
// Process the superclass table first
updateObjectInTable(supertable, op, clr, mmds);
}
// Do the actual update of this table
getUpdateRequest(table, mmds, op.getClassMetaData(), clr).execute(op);
// Update any secondary tables
Collection<SecondaryDatastoreClass> secondaryTables = table.getSecondaryDatastoreClasses();
if (secondaryTables != null) {
for (SecondaryDatastoreClass secTable : secondaryTables) {
// Process the secondary table
updateObjectInTable(secTable, op, clr, mmds);
}
}
}
use of org.datanucleus.store.rdbms.table.ClassView in project datanucleus-rdbms by datanucleus.
the class DeleteTablesSchemaTransaction method run.
/* (non-Javadoc)
* @see org.datanucleus.store.rdbms.AbstractSchemaTransaction#run(org.datanucleus.ClassLoaderResolver)
*/
protected void run(ClassLoaderResolver clr) throws SQLException {
synchronized (rdbmsMgr) {
boolean success = true;
try {
NucleusLogger.DATASTORE_SCHEMA.debug(Localiser.msg("050045", rdbmsMgr.getCatalogName(), rdbmsMgr.getSchemaName()));
// Build up map of tables and views TODO Why use maps?
Map baseTablesByName = new HashMap();
Map viewsByName = new HashMap();
for (Iterator i = storeDataMgr.getManagedStoreData().iterator(); i.hasNext(); ) {
RDBMSStoreData data = (RDBMSStoreData) i.next();
if (NucleusLogger.DATASTORE_SCHEMA.isDebugEnabled()) {
NucleusLogger.DATASTORE_SCHEMA.debug(Localiser.msg("050046", data.getName()));
}
// If the class has a table/view to remove, add it to the list
if (data.hasTable()) {
if (data.mapsToView()) {
viewsByName.put(data.getDatastoreIdentifier(), data.getTable());
} else {
baseTablesByName.put(data.getDatastoreIdentifier(), data.getTable());
}
}
}
// Remove views
Iterator viewsIter = viewsByName.values().iterator();
while (viewsIter.hasNext()) {
ViewImpl view = (ViewImpl) viewsIter.next();
if (writer != null) {
try {
if (view instanceof ClassView) {
writer.write("-- ClassView " + view.toString() + " for classes " + StringUtils.objectArrayToString(((ClassView) view).getManagedClasses()) + "\n");
}
} catch (IOException ioe) {
NucleusLogger.DATASTORE_SCHEMA.error("error writing DDL into file", ioe);
}
((ViewImpl) viewsIter.next()).drop(getCurrentConnection());
} else {
// Drop view if exists in the datastore
StoreSchemaData info = rdbmsMgr.getSchemaHandler().getSchemaData(getCurrentConnection(), RDBMSSchemaHandler.TYPE_COLUMNS, new Object[] { view });
if (info != null) {
((ViewImpl) viewsIter.next()).drop(getCurrentConnection());
}
}
}
// Remove table constraints
Map<TableImpl, Boolean> schemaExistsForTableMap = new HashMap();
Iterator tablesIter = baseTablesByName.values().iterator();
while (tablesIter.hasNext()) {
TableImpl tbl = (TableImpl) tablesIter.next();
if (writer != null) {
try {
if (tbl instanceof ClassTable) {
writer.write("-- Constraints for ClassTable " + tbl.toString() + " for classes " + StringUtils.objectArrayToString(((ClassTable) tbl).getManagedClasses()) + "\n");
} else if (tbl instanceof JoinTable) {
writer.write("-- Constraints for JoinTable " + tbl.toString() + " for join relationship\n");
}
} catch (IOException ioe) {
NucleusLogger.DATASTORE_SCHEMA.error("error writing DDL into file", ioe);
}
tbl.dropConstraints(getCurrentConnection());
} else {
// Drop constraints if exists in the datastore
boolean exists = false;
try {
// Check table type as way of detecting existence
String tableType = ((RDBMSSchemaHandler) rdbmsMgr.getSchemaHandler()).getTableType(getCurrentConnection(), tbl);
if (tableType != null) {
exists = true;
}
} catch (Exception e) {
exists = false;
}
schemaExistsForTableMap.put(tbl, exists);
if (exists) {
tbl.dropConstraints(getCurrentConnection());
}
}
}
// Remove tables
tablesIter = baseTablesByName.values().iterator();
while (tablesIter.hasNext()) {
TableImpl tbl = (TableImpl) tablesIter.next();
if (writer != null) {
try {
if (tbl instanceof ClassTable) {
writer.write("-- ClassTable " + tbl.toString() + " for classes " + StringUtils.objectArrayToString(((ClassTable) tbl).getManagedClasses()) + "\n");
} else if (tbl instanceof JoinTable) {
writer.write("-- JoinTable " + tbl.toString() + " for join relationship\n");
}
} catch (IOException ioe) {
NucleusLogger.DATASTORE_SCHEMA.error("error writing DDL into file", ioe);
}
tbl.drop(getCurrentConnection());
} else {
// Drop table if exists in the datastore
Boolean schemaExists = schemaExistsForTableMap.get(tbl);
if (schemaExists != null && schemaExists == Boolean.TRUE) {
tbl.drop(getCurrentConnection());
}
}
}
} catch (Exception e) {
success = false;
String errorMsg = Localiser.msg("050047", e);
NucleusLogger.DATASTORE_SCHEMA.error(errorMsg);
throw new NucleusUserException(errorMsg, e);
}
if (!success) {
throw new NucleusException("DeleteTables operation failed");
}
}
}
Aggregations