/* * (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 OClass doCreateClass( final String className, final int[] clusterIds, int retry, OClass... superClasses) throws ClusterIdsAreEmptyException { OClass result; final ODatabaseDocumentInternal db = getDatabase(); final OStorage storage = db.getStorage(); StringBuilder cmd = null; getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); acquireSchemaWriteLock(); try { final String key = className.toLowerCase(); if (classes.containsKey(key) && retry == 0) throw new OSchemaException("Class " + className + " already exists in current database"); if (!isDistributedCommand()) checkClustersAreAbsent(clusterIds); cmd = new StringBuilder("create class "); // if (getDatabase().getStorage().getConfiguration().isStrictSql()) // cmd.append('`'); cmd.append(className); // if (getDatabase().getStorage().getConfiguration().isStrictSql()) // cmd.append('`'); List<OClass> superClassesList = new ArrayList<OClass>(); if (superClasses != null && superClasses.length > 0) { boolean first = true; for (OClass superClass : superClasses) { // Filtering for null if (superClass != null) { if (first) cmd.append(" extends "); else cmd.append(", "); cmd.append(superClass.getName()); first = false; superClassesList.add(superClass); } } } if (clusterIds != null) { if (clusterIds.length == 1 && clusterIds[0] == -1) cmd.append(" abstract"); else { cmd.append(" cluster "); for (int i = 0; i < clusterIds.length; ++i) { if (i > 0) cmd.append(','); else cmd.append(' '); cmd.append(clusterIds[i]); } } } if (isDistributedCommand()) { createClassInternal(className, clusterIds, superClassesList); final OAutoshardedStorage autoshardedStorage = (OAutoshardedStorage) storage; OCommandSQL commandSQL = new OCommandSQL(cmd.toString()); commandSQL.addExcludedNode(autoshardedStorage.getNodeId()); final Object res = db.command(commandSQL).execute(); } else if (storage instanceof OStorageProxy) { db.command(new OCommandSQL(cmd.toString())).execute(); reload(); } else createClassInternal(className, clusterIds, superClassesList); result = classes.get(className.toLowerCase()); // WAKE UP DB LIFECYCLE LISTENER for (Iterator<ODatabaseLifecycleListener> it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); ) it.next().onCreateClass(getDatabase(), result); } finally { releaseSchemaWriteLock(); } return result; }