/* * (non-Javadoc) * * @see com.orientechnologies.orient.core.metadata.schema.OSchema#dropClass(java.lang.String) */ public void dropClass(final String className) { final ODatabaseDocumentInternal db = getDatabase(); final OStorage storage = db.getStorage(); final StringBuilder cmd; acquireSchemaWriteLock(); try { if (getDatabase().getTransaction().isActive()) throw new IllegalStateException("Cannot drop a class inside a transaction"); if (className == null) throw new IllegalArgumentException("Class name is null"); getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); final String key = className.toLowerCase(); OClass cls = classes.get(key); if (cls == null) throw new OSchemaException("Class '" + className + "' was not found in current database"); if (!cls.getSubclasses().isEmpty()) throw new OSchemaException( "Class '" + className + "' cannot be dropped because it has sub classes. Remove the dependencies before trying to drop it again"); cmd = new StringBuilder("drop class "); cmd.append(className); cmd.append(" unsafe"); if (isDistributedCommand()) { final OAutoshardedStorage autoshardedStorage = (OAutoshardedStorage) storage; OCommandSQL commandSQL = new OCommandSQL(cmd.toString()); commandSQL.addExcludedNode(autoshardedStorage.getNodeId()); db.command(commandSQL).execute(); dropClassInternal(className); } else if (storage instanceof OStorageProxy) { final OCommandSQL commandSQL = new OCommandSQL(cmd.toString()); db.command(commandSQL).execute(); reload(); } else dropClassInternal(className); // FREE THE RECORD CACHE getDatabase().getLocalCache().freeCluster(cls.getDefaultClusterId()); } finally { releaseSchemaWriteLock(); } }
private void dropClassInternal(final String className) { acquireSchemaWriteLock(); try { if (getDatabase().getTransaction().isActive()) throw new IllegalStateException("Cannot drop a class inside a transaction"); if (className == null) throw new IllegalArgumentException("Class name is null"); getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); final String key = className.toLowerCase(); final OClass cls = classes.get(key); if (cls == null) throw new OSchemaException("Class '" + className + "' was not found in current database"); if (!cls.getSubclasses().isEmpty()) throw new OSchemaException( "Class '" + className + "' cannot be dropped because it has sub classes. Remove the dependencies before trying to drop it again"); checkEmbedded(getDatabase().getStorage()); for (OClass superClass : cls.getSuperClasses()) { // REMOVE DEPENDENCY FROM SUPERCLASS ((OClassImpl) superClass).removeBaseClassInternal(cls); } deleteDefaultCluster(cls); dropClassIndexes(cls); classes.remove(key); if (cls.getShortName() != null) // REMOVE THE ALIAS TOO classes.remove(cls.getShortName().toLowerCase()); removeClusterClassMap(cls); } finally { releaseSchemaWriteLock(); } }