use of com.orientechnologies.orient.core.exception.OSchemaException in project orientdb by orientechnologies.
the class OSchemaShared method createClassInternal.
private OClass createClassInternal(final String className, final int[] clusterIdsToAdd, final List<OClass> superClasses) throws ClusterIdsAreEmptyException {
acquireSchemaWriteLock();
try {
if (className == null || className.length() == 0)
throw new OSchemaException("Found class name null or empty");
if (Character.isDigit(className.charAt(0)))
throw new OSchemaException("Found invalid class name. Cannot start with numbers");
final Character wrongCharacter = checkClassNameIfValid(className);
if (wrongCharacter != null)
throw new OSchemaException("Found invalid class name. Character '" + wrongCharacter + "' cannot be used in class name.");
final ODatabaseDocumentInternal database = getDatabase();
final OStorage storage = database.getStorage();
checkEmbedded(storage);
checkClustersAreAbsent(clusterIdsToAdd);
final int[] clusterIds;
if (clusterIdsToAdd == null || clusterIdsToAdd.length == 0) {
throw new ClusterIdsAreEmptyException();
} else
clusterIds = clusterIdsToAdd;
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
final String key = className.toLowerCase();
if (classes.containsKey(key))
throw new OSchemaException("Class '" + className + "' already exists in current database");
OClassImpl cls = new OClassImpl(this, className, clusterIds);
classes.put(key, cls);
if (superClasses != null && superClasses.size() > 0) {
cls.setSuperClassesInternal(superClasses);
for (OClass superClass : superClasses) {
// UPDATE INDEXES
final int[] clustersToIndex = superClass.getPolymorphicClusterIds();
final String[] clusterNames = new String[clustersToIndex.length];
for (int i = 0; i < clustersToIndex.length; i++) clusterNames[i] = database.getClusterNameById(clustersToIndex[i]);
for (OIndex<?> index : superClass.getIndexes()) for (String clusterName : clusterNames) if (clusterName != null)
database.getMetadata().getIndexManager().addClusterToIndex(clusterName, index.getName());
}
}
addClusterClassMap(cls);
return cls;
} finally {
releaseSchemaWriteLock();
}
}
use of com.orientechnologies.orient.core.exception.OSchemaException in project orientdb by orientechnologies.
the class OSchemaShared method dropClass.
/*
* (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 " + cls.getSubclasses() + ". Remove the dependencies before trying to drop it again");
cmd = new StringBuilder("drop class ");
cmd.append(className);
cmd.append(" unsafe");
if (executeThroughDistributedStorage()) {
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();
final OClass classToDrop = getClass(className);
reload();
if (// really dropped, for example there may be no rights to drop a class
getClass(className) == null)
dropClassIndexes(classToDrop);
} else
dropClassInternal(className);
// FREE THE RECORD CACHE
getDatabase().getLocalCache().freeCluster(cls.getDefaultClusterId());
} finally {
releaseSchemaWriteLock();
}
}
use of com.orientechnologies.orient.core.exception.OSchemaException in project orientdb by orientechnologies.
the class OSchemaShared method doCreateClass.
private OClass doCreateClass(final String className, final int clusters, final int retry, OClass... superClasses) {
OClass result;
final ODatabaseDocumentInternal db = getDatabase();
final OStorage storage = db.getStorage();
StringBuilder cmd = null;
getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
if (superClasses != null)
OClassImpl.checkParametersConflict(Arrays.asList(superClasses));
acquireSchemaWriteLock();
try {
final String key = className.toLowerCase();
if (classes.containsKey(key) && retry == 0)
throw new OSchemaException("Class '" + className + "' already exists in current database");
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 (clusters == 0)
cmd.append(" abstract");
else {
cmd.append(" clusters ");
cmd.append(clusters);
}
if (executeThroughDistributedStorage()) {
final int[] clusterIds = createClusters(className, clusters);
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 {
final int[] clusterIds = createClusters(className, clusters);
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);
} catch (ClusterIdsAreEmptyException e) {
throw OException.wrapException(new OSchemaException("Cannot create class '" + className + "'"), e);
} finally {
releaseSchemaWriteLock();
}
return result;
}
use of com.orientechnologies.orient.core.exception.OSchemaException in project orientdb by orientechnologies.
the class OSchemaShared method createClass.
@Override
public OClass createClass(final String className, int[] clusterIds, OClass... superClasses) {
final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(className);
if (wrongCharacter != null)
throw new OSchemaException("Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + className + "'");
OClass result;
int retry = 0;
while (true) try {
result = doCreateClass(className, clusterIds, retry, superClasses);
break;
} catch (ClusterIdsAreEmptyException e) {
classes.remove(className.toLowerCase());
clusterIds = (int[]) OScenarioThreadLocal.executeAsDefault(new Callable<int[]>() {
@Override
public int[] call() throws Exception {
return createClusters(className);
}
});
retry++;
}
return result;
}
use of com.orientechnologies.orient.core.exception.OSchemaException in project orientdb by orientechnologies.
the class OClassImpl method setName.
public OClass setName(final String name) {
if (getName().equals(name))
return this;
getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(name);
OClass oClass = getDatabase().getMetadata().getSchema().getClass(name);
if (oClass != null) {
String error = String.format("Cannot rename class %s to %s. A Class with name %s exists", this.name, name, name);
throw new OSchemaException(error);
}
if (wrongCharacter != null)
throw new OSchemaException("Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + name + "'");
acquireSchemaWriteLock();
try {
final ODatabaseDocumentInternal database = getDatabase();
final OStorage storage = database.getStorage();
if (storage instanceof OStorageProxy) {
final String cmd = String.format("alter class `%s` name `%s`", this.name, name);
database.command(new OCommandSQL(cmd)).execute();
} else if (isDistributedCommand()) {
final String cmd = String.format("alter class `%s` name `%s`", this.name, name);
final OCommandSQL commandSQL = new OCommandSQL(cmd);
commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId());
database.command(commandSQL).execute();
setNameInternal(name);
} else
setNameInternal(name);
} finally {
releaseSchemaWriteLock();
}
return this;
}
Aggregations