Search in sources :

Example 1 with ClassView

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);
        }
    }
}
Also used : ClassView(org.datanucleus.store.rdbms.table.ClassView) NucleusUserException(org.datanucleus.exceptions.NucleusUserException) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass) DatastoreClass(org.datanucleus.store.rdbms.table.DatastoreClass) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass)

Example 2 with ClassView

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);
    }
}
Also used : ClassView(org.datanucleus.store.rdbms.table.ClassView) NucleusUserException(org.datanucleus.exceptions.NucleusUserException) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass) DatastoreClass(org.datanucleus.store.rdbms.table.DatastoreClass)

Example 3 with ClassView

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);
        }
    }
}
Also used : ClassView(org.datanucleus.store.rdbms.table.ClassView) NucleusUserException(org.datanucleus.exceptions.NucleusUserException) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass) DatastoreClass(org.datanucleus.store.rdbms.table.DatastoreClass) SecondaryDatastoreClass(org.datanucleus.store.rdbms.table.SecondaryDatastoreClass)

Example 4 with ClassView

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");
        }
    }
}
Also used : ClassView(org.datanucleus.store.rdbms.table.ClassView) HashMap(java.util.HashMap) NucleusUserException(org.datanucleus.exceptions.NucleusUserException) TableImpl(org.datanucleus.store.rdbms.table.TableImpl) IOException(java.io.IOException) NucleusException(org.datanucleus.exceptions.NucleusException) IOException(java.io.IOException) SQLException(java.sql.SQLException) NucleusUserException(org.datanucleus.exceptions.NucleusUserException) ClassTable(org.datanucleus.store.rdbms.table.ClassTable) RDBMSSchemaHandler(org.datanucleus.store.rdbms.schema.RDBMSSchemaHandler) Iterator(java.util.Iterator) ViewImpl(org.datanucleus.store.rdbms.table.ViewImpl) StoreSchemaData(org.datanucleus.store.schema.StoreSchemaData) NucleusException(org.datanucleus.exceptions.NucleusException) HashMap(java.util.HashMap) Map(java.util.Map) JoinTable(org.datanucleus.store.rdbms.table.JoinTable)

Aggregations

NucleusUserException (org.datanucleus.exceptions.NucleusUserException)4 ClassView (org.datanucleus.store.rdbms.table.ClassView)4 DatastoreClass (org.datanucleus.store.rdbms.table.DatastoreClass)3 SecondaryDatastoreClass (org.datanucleus.store.rdbms.table.SecondaryDatastoreClass)3 IOException (java.io.IOException)1 SQLException (java.sql.SQLException)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 Map (java.util.Map)1 NucleusException (org.datanucleus.exceptions.NucleusException)1 RDBMSSchemaHandler (org.datanucleus.store.rdbms.schema.RDBMSSchemaHandler)1 ClassTable (org.datanucleus.store.rdbms.table.ClassTable)1 JoinTable (org.datanucleus.store.rdbms.table.JoinTable)1 TableImpl (org.datanucleus.store.rdbms.table.TableImpl)1 ViewImpl (org.datanucleus.store.rdbms.table.ViewImpl)1 StoreSchemaData (org.datanucleus.store.schema.StoreSchemaData)1