diff --git a/client/src/main/java/com/orientechnologies/orient/client/remote/OStorageRemote.java b/client/src/main/java/com/orientechnologies/orient/client/remote/OStorageRemote.java index fdf9379c48d..5e8bca73687 100755 --- a/client/src/main/java/com/orientechnologies/orient/client/remote/OStorageRemote.java +++ b/client/src/main/java/com/orientechnologies/orient/client/remote/OStorageRemote.java @@ -893,7 +893,7 @@ public List commit(final OTransaction iTx, final Runnable call ORecordInternal.setVersion(rop.getRecord(), updated.getVersion()); } } - updateCollectionsFromChanges(ODatabaseRecordThreadLocal.INSTANCE.get().getSbTreeCollectionManager(), + updateCollectionsFromChanges(((OTransactionOptimistic)iTx).getDatabase().getSbTreeCollectionManager(), response.getCollectionChanges()); // SET ALL THE RECORDS AS UNDIRTY for (ORecordOperation txEntry : iTx.getAllRecordEntries()) diff --git a/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassRemote.java b/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassRemote.java index bd3c82ffc24..8d706070e41 100644 --- a/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassRemote.java +++ b/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassRemote.java @@ -180,11 +180,12 @@ public OClass setSuperClasses(final List classes) { @Override public OClass addSuperClass(final OClass superClass) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); checkParametersConflict(superClass); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); + final String cmd = String.format("alter class `%s` superclass +`%s`", name, superClass != null ? superClass.getName() : null); database.command(cmd); @@ -196,10 +197,10 @@ public OClass addSuperClass(final OClass superClass) { @Override public OClass removeSuperClass(OClass superClass) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final String cmd = String.format("alter class `%s` superclass -`%s`", name, superClass != null ? superClass.getName() : null); database.command(cmd); } finally { @@ -211,10 +212,10 @@ public OClass removeSuperClass(OClass superClass) { public OClass setName(final String name) { if (getName().equals(name)) return this; - - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(name); - OClass oClass = getDatabase().getMetadata().getSchema().getClass(name); + OClass oClass = database.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); @@ -224,7 +225,6 @@ public OClass setName(final String name) { "Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + name + "'"); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final String cmd = String.format("alter class `%s` name `%s`", this.name, name); database.command(cmd); @@ -242,11 +242,11 @@ public OClass setShortName(String shortName) { if (shortName.isEmpty()) shortName = null; } - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final String cmd = String.format("alter class `%s` shortname `%s`", name, shortName); database.command(cmd); } finally { diff --git a/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaRemote.java b/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaRemote.java index e254dd62025..4d67e43c16b 100644 --- a/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaRemote.java +++ b/client/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaRemote.java @@ -20,7 +20,7 @@ public OSchemaRemote() { } @Override - public OClass getOrCreateClass(String iClassName, OClass... superClasses) { + public OClass getOrCreateClass(ODatabaseDocumentInternal database, String iClassName, OClass... superClasses) { if (iClassName == null) return null; @@ -37,17 +37,17 @@ public OClass getOrCreateClass(String iClassName, OClass... superClasses) { int[] clusterIds = null; - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { cls = classes.get(iClassName.toLowerCase(Locale.ENGLISH)); if (cls != null) return cls; - cls = createClass(iClassName, clusterIds, superClasses); + cls = createClass(database, iClassName, clusterIds, superClasses); addClusterClassMap(cls); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return cls; @@ -57,21 +57,18 @@ protected OClassImpl createClassInstance(ODocument c) { return new OClassRemote(this, c, (String) c.field("name")); } - - public OClass createClass(final String className, int[] clusterIds, OClass... superClasses) { + public OClass createClass(ODatabaseDocumentInternal database, 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; - final ODatabaseDocumentInternal db = getDatabase(); - - db.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); if (superClasses != null) OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { final String key = className.toLowerCase(Locale.ENGLISH); @@ -118,26 +115,26 @@ public OClass createClass(final String className, int[] clusterIds, OClass... su } } - db.command(cmd.toString()); + database.command(cmd.toString()); reload(); result = classes.get(className.toLowerCase(Locale.ENGLISH)); // WAKE UP DB LIFECYCLE LISTENER for (Iterator it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + it.next().onCreateClass(database, result); - for (Iterator it = db.getListeners().iterator(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + for (Iterator it = database.getListeners().iterator(); it.hasNext(); ) + it.next().onCreateClass(database, result); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return result; } - public OClass createClass(final String className, int clusters, OClass... superClasses) { + public OClass createClass(ODatabaseDocumentInternal database, final String className, int clusters, OClass... superClasses) { final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(className); if (wrongCharacter != null) throw new OSchemaException( @@ -145,11 +142,10 @@ public OClass createClass(final String className, int clusters, OClass... superC OClass result; - final ODatabaseDocumentInternal db = getDatabase(); - db.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); if (superClasses != null) OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { final String key = className.toLowerCase(Locale.ENGLISH); @@ -185,19 +181,19 @@ public OClass createClass(final String className, int clusters, OClass... superC cmd.append(clusters); } - db.command(cmd.toString()); + database.command(cmd.toString()); reload(); result = classes.get(className.toLowerCase(Locale.ENGLISH)); // WAKE UP DB LIFECYCLE LISTENER for (Iterator it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + it.next().onCreateClass(database, result); - for (Iterator it = db.getListeners().iterator(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + for (Iterator it = database.getListeners().iterator(); it.hasNext(); ) + it.next().onCreateClass(database, result); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return result; @@ -217,18 +213,17 @@ private void checkClustersAreAbsent(final int[] iClusterIds) { } } - public void dropClass(final String className) { - final ODatabaseDocumentInternal db = getDatabase(); + public void dropClass(ODatabaseDocumentInternal database, final String className) { - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { - if (getDatabase().getTransaction().isActive()) + if (database.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); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); final String key = className.toLowerCase(Locale.ENGLISH); @@ -244,15 +239,19 @@ public void dropClass(final String className) { final StringBuilder cmd = new StringBuilder("drop class "); cmd.append(className); cmd.append(" unsafe"); - db.command(cmd.toString()); + database.command(cmd.toString()); reload(); // FREE THE RECORD CACHE - getDatabase().getLocalCache().freeCluster(cls.getDefaultClusterId()); + database.getLocalCache().freeCluster(cls.getDefaultClusterId()); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } + @Override + public void checkEmbedded() { + throw new OSchemaException("'Internal' schema modification methods can be used only inside of embedded database"); + } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/db/OSharedContextEmbedded.java b/core/src/main/java/com/orientechnologies/orient/core/db/OSharedContextEmbedded.java index 361d1b6ded9..a5bdb5c508e 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/db/OSharedContextEmbedded.java +++ b/core/src/main/java/com/orientechnologies/orient/core/db/OSharedContextEmbedded.java @@ -12,7 +12,6 @@ import com.orientechnologies.orient.core.sql.executor.OQueryStats; import com.orientechnologies.orient.core.sql.parser.OStatementCache; import com.orientechnologies.orient.core.storage.OStorage; -import com.orientechnologies.orient.core.storage.OStorageProxy; /** * Created by tglman on 13/06/17. @@ -88,8 +87,8 @@ public synchronized void create(ODatabaseDocumentInternal database) { scheduler.create(database); // CREATE BASE VERTEX AND EDGE CLASSES - schema.createClass("V"); - schema.createClass("E"); + schema.createClass(database, "V"); + schema.createClass(database, "E"); loaded = true; } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassEmbedded.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassEmbedded.java index f95d2ebf586..0b12a2cbe53 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassEmbedded.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassEmbedded.java @@ -9,7 +9,6 @@ import com.orientechnologies.orient.core.sql.OCommandSQL; import com.orientechnologies.orient.core.storage.OAutoshardedStorage; import com.orientechnologies.orient.core.storage.OStorage; -import com.orientechnologies.orient.core.storage.OStorageProxy; import java.util.ArrayList; import java.util.List; @@ -86,7 +85,7 @@ protected OProperty addProperty(final String propertyName, final OType type, fin cmd.append(" unsafe "); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final OProperty prop = (OProperty) OScenarioThreadLocal.executeAsDistributed(new Callable() { @Override public OProperty call() throws Exception { @@ -113,27 +112,27 @@ public OProperty call() throws Exception { } } - private boolean isDistributedCommand() { - return getDatabase().getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); + private boolean isDistributedCommand(ODatabaseDocumentInternal database) { + return database.getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); } public OClassImpl setEncryption(final String iValue) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String.format("alter class `%s` encryption %s", name, iValue); final OCommandSQL commandSQL = new OCommandSQL(cmd); commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId()); database.command(commandSQL).execute(); - setEncryptionInternal(iValue); + setEncryptionInternal(database, iValue); } else - setEncryptionInternal(iValue); + setEncryptionInternal(database, iValue); } finally { releaseSchemaWriteLock(); } @@ -142,13 +141,13 @@ public OClassImpl setEncryption(final String iValue) { @Override public OClass setClusterSelection(final String value) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String.format("alter class `%s` clusterselection '%s'", name, value); OCommandSQL commandSQL = new OCommandSQL(cmd); commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId()); @@ -165,13 +164,13 @@ public OClass setClusterSelection(final String value) { } public OClassImpl setCustom(final String name, final String value) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String.format("alter class `%s` custom %s=%s", getName(), name, value); final OCommandSQL commandSQL = new OCommandSQL(cmd); commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId()); @@ -189,14 +188,13 @@ public OClassImpl setCustom(final String name, final String value) { } public void clearCustom() { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String.format("alter class `%s` custom clear", getName()); final OCommandSQL commandSQL = new OCommandSQL(cmd); commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId()); @@ -213,7 +211,8 @@ public void clearCustom() { @Override public OClass setSuperClasses(final List classes) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); if (classes != null) { List toCheck = new ArrayList(classes); toCheck.add(this); @@ -221,7 +220,6 @@ public OClass setSuperClasses(final List classes) { } acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); final StringBuilder sb = new StringBuilder(); @@ -234,7 +232,7 @@ public OClass setSuperClasses(final List classes) { sb.append("null"); final String cmd = String.format("alter class `%s` superclasses %s", name, sb); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final OCommandSQL commandSQL = new OCommandSQL(cmd); commandSQL.addExcludedNode(((OAutoshardedStorage) storage).getNodeId()); @@ -252,13 +250,13 @@ public OClass setSuperClasses(final List classes) { @Override public OClass addSuperClass(final OClass superClass) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); checkParametersConflict(superClass); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String .format("alter class `%s` superclass +`%s`", name, superClass != null ? superClass.getName() : null); final OCommandSQL commandSQL = new OCommandSQL(cmd); @@ -266,9 +264,9 @@ public OClass addSuperClass(final OClass superClass) { database.command(commandSQL).execute(); - addSuperClassInternal(superClass); + addSuperClassInternal(database, superClass); } else - addSuperClassInternal(superClass); + addSuperClassInternal(database, superClass); } finally { releaseSchemaWriteLock(); @@ -278,12 +276,12 @@ public OClass addSuperClass(final OClass superClass) { @Override public OClass removeSuperClass(OClass superClass) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String .format("alter class `%s` superclass -`%s`", name, superClass != null ? superClass.getName() : null); final OCommandSQL commandSQL = new OCommandSQL(cmd); @@ -304,10 +302,10 @@ public OClass removeSuperClass(OClass superClass) { public OClass setName(final String name) { if (getName().equals(name)) return this; - - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(name); - OClass oClass = getDatabase().getMetadata().getSchema().getClass(name); + OClass oClass = database.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); @@ -317,18 +315,18 @@ public OClass setName(final String name) { "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 (isDistributedCommand()) { + if (isDistributedCommand(database)) { 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); + setNameInternal(database, name); } else - setNameInternal(name); + setNameInternal(database, name); } finally { releaseSchemaWriteLock(); @@ -343,13 +341,14 @@ public OClass setShortName(String shortName) { if (shortName.isEmpty()) shortName = null; } - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); + final OStorage storage = database.getStorage(); - if (isDistributedCommand()) { + if (isDistributedCommand(database)) { final String cmd = String.format("alter class `%s` shortname `%s`", name, shortName); final OCommandSQL commandSQL = new OCommandSQL(cmd); @@ -357,9 +356,9 @@ public OClass setShortName(String shortName) { database.command(commandSQL).execute(); - setShortNameInternal(shortName); + setShortNameInternal(database, shortName); } else - setShortNameInternal(shortName); + setShortNameInternal(database, shortName); } finally { releaseSchemaWriteLock(); } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java index abfb1dc2934..86d9e0dfe2b 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OClassImpl.java @@ -36,7 +36,6 @@ import com.orientechnologies.orient.core.exception.OSchemaException; import com.orientechnologies.orient.core.exception.OSecurityAccessException; import com.orientechnologies.orient.core.exception.OSecurityException; -import com.orientechnologies.orient.core.id.ORecordId; import com.orientechnologies.orient.core.index.*; import com.orientechnologies.orient.core.metadata.schema.clusterselection.OClusterSelectionStrategy; import com.orientechnologies.orient.core.metadata.security.ORole; @@ -343,7 +342,7 @@ void setSuperClassesInternal(final List classes) { } } - void addSuperClassInternal(final OClass superClass) { + void addSuperClassInternal(ODatabaseDocumentInternal database, final OClass superClass) { acquireSchemaWriteLock(); try { final OClassImpl cls; @@ -356,7 +355,7 @@ void addSuperClassInternal(final OClass superClass) { if (cls != null) { // CHECK THE USER HAS UPDATE PRIVILEGE AGAINST EXTENDING CLASS - final OSecurityUser user = getDatabase().getUser(); + final OSecurityUser user = database.getUser(); if (user != null) user.allow(ORule.ResourceGeneric.CLASS, cls.getName(), ORole.PERMISSION_UPDATE); @@ -616,7 +615,7 @@ public void dropProperty(final String propertyName) { OScenarioThreadLocal.executeAsDistributed(new Callable() { @Override public OProperty call() throws Exception { - dropPropertyInternal(propertyName); + dropPropertyInternal(database, propertyName); return null; } }); @@ -629,7 +628,7 @@ public OProperty call() throws Exception { OScenarioThreadLocal.executeAsDistributed(new Callable() { @Override public OProperty call() throws Exception { - dropPropertyInternal(propertyName); + dropPropertyInternal(database, propertyName); return null; } }); @@ -824,7 +823,8 @@ public void renameProperty(final String iOldName, final String iNewName) { } public OClass addClusterId(final int clusterId) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); if (isAbstract()) { throw new OSchemaException("Impossible to associate a cluster to an abstract class class"); @@ -832,8 +832,6 @@ public OClass addClusterId(final int clusterId) { acquireSchemaWriteLock(); try { - - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); if (storage instanceof OStorageProxy) { @@ -847,9 +845,9 @@ public OClass addClusterId(final int clusterId) { database.command(commandSQL).execute(); - addClusterIdInternal(clusterId); + addClusterIdInternal(database, clusterId); } else - addClusterIdInternal(clusterId); + addClusterIdInternal(database, clusterId); } finally { releaseSchemaWriteLock(); @@ -867,7 +865,8 @@ public static OClass addClusters(final OClass cls, final int iClusters) { @Override public OClass addCluster(final String clusterNameOrId) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); if (isAbstract()) { throw new OSchemaException("Impossible to associate a cluster to an abstract class class"); @@ -875,15 +874,15 @@ public OClass addCluster(final String clusterNameOrId) { acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); + final OStorage storage = database.getStorage(); if (storage instanceof OStorageProxy) { final String cmd = String.format("alter class `%s` addcluster `%s`", name, clusterNameOrId); database.command(cmd); } else if (isDistributedCommand()) { - final int clusterId = owner.createClusterIfNeeded(clusterNameOrId); - addClusterIdInternal(clusterId); + final int clusterId = owner.createClusterIfNeeded(database, clusterNameOrId); + addClusterIdInternal(database, clusterId); final String cmd = String.format("alter class `%s` addcluster `%s`", name, clusterNameOrId); @@ -892,8 +891,8 @@ public OClass addCluster(final String clusterNameOrId) { database.command(commandSQL).execute(); } else { - final int clusterId = owner.createClusterIfNeeded(clusterNameOrId); - addClusterIdInternal(clusterId); + final int clusterId = owner.createClusterIfNeeded(database, clusterNameOrId); + addClusterIdInternal(database, clusterId); } } finally { releaseSchemaWriteLock(); @@ -953,14 +952,15 @@ private void truncateClusterInternal(final String clusterName, final ODatabaseDo } public OClass removeClusterId(final int clusterId) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); if (clusterIds.length == 1 && clusterId == clusterIds[0]) throw new ODatabaseException(" Impossible to remove the last cluster of class '" + getName() + "' drop the class instead"); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); + final OStorage storage = database.getStorage(); if (storage instanceof OStorageProxy) { @@ -974,9 +974,9 @@ public OClass removeClusterId(final int clusterId) { database.command(commandSQL).execute(); - removeClusterIdInternal(clusterId); + removeClusterIdInternal(database,clusterId); } else - removeClusterIdInternal(clusterId); + removeClusterIdInternal(database, clusterId); } finally { releaseSchemaWriteLock(); } @@ -1093,9 +1093,9 @@ public OClass setOverSize(final float overSize) { database.command(commandSQL).execute(); - setOverSizeInternal(overSize); + setOverSizeInternal(database, overSize); } else - setOverSizeInternal(overSize); + setOverSizeInternal(database, overSize); } finally { releaseSchemaWriteLock(); } @@ -1123,11 +1123,12 @@ public boolean isAbstract() { } public OClass setAbstract(boolean isAbstract) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + final ODatabaseDocumentInternal database = getDatabase(); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { - final ODatabaseDocumentInternal database = getDatabase(); + final OStorage storage = database.getStorage(); if (storage instanceof OStorageProxy) { @@ -1140,9 +1141,9 @@ public OClass setAbstract(boolean isAbstract) { database.command(commandSQL).execute(); - setAbstractInternal(isAbstract); + setAbstractInternal(database, isAbstract); } else - setAbstractInternal(isAbstract); + setAbstractInternal(database, isAbstract); } finally { releaseSchemaWriteLock(); } @@ -1440,7 +1441,7 @@ public OClass set(final ATTRIBUTES attribute, final Object iValue) { break; } case REMOVECLUSTER: - int clId = owner.getClusterId(stringValue); + int clId = owner.getClusterId(getDatabase(), stringValue); if (clId == NOT_EXISTENT_CLUSTER_ID) throw new IllegalArgumentException("Cluster id '" + stringValue + "' cannot be removed"); removeClusterId(clId); @@ -1496,9 +1497,9 @@ private boolean isQuoted(String s) { public abstract OClassImpl setEncryption(final String iValue); - protected void setEncryptionInternal(final String iValue) { + protected void setEncryptionInternal(ODatabaseDocumentInternal database, final String iValue) { for (int cl : getClusterIds()) { - final OCluster c = getDatabase().getStorage().getClusterById(cl); + final OCluster c = database.getStorage().getClusterById(cl); if (c != null) try { c.set(OCluster.ATTRIBUTES.ENCRYPTION, iValue); @@ -1651,7 +1652,7 @@ public void getClassIndexes(final Collection> indexes) { @Override public OIndex getAutoShardingIndex() { - final ODatabaseDocumentInternal db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); + final ODatabaseDocumentInternal db = getDatabase(); return db != null ? db.getMetadata().getIndexManager().getClassAutoShardingIndex(name) : null; } @@ -1716,7 +1717,7 @@ public void releaseSchemaReadLock() { } public void acquireSchemaWriteLock() { - owner.acquireSchemaWriteLock(); + owner.acquireSchemaWriteLock(getDatabase()); } public void releaseSchemaWriteLock() { @@ -1725,11 +1726,11 @@ public void releaseSchemaWriteLock() { public void releaseSchemaWriteLock(final boolean iSave) { calculateHashCode(); - owner.releaseSchemaWriteLock(iSave); + owner.releaseSchemaWriteLock(getDatabase(), iSave); } public void checkEmbedded() { - owner.checkEmbedded(getDatabase().getStorage().getUnderlying().getUnderlying()); + owner.checkEmbedded(); } public void setClusterSelectionInternal(final String clusterSelection) { @@ -1858,8 +1859,8 @@ private void calculateHashCode() { hashCode = result; } - private void setOverSizeInternal(final float overSize) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + private void setOverSizeInternal(ODatabaseDocumentInternal database, final float overSize) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { checkEmbedded(); @@ -1897,13 +1898,13 @@ protected void clearCustomInternal() { } } - protected void setNameInternal(final String name) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + protected void setNameInternal(ODatabaseDocumentInternal database, final String name) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { checkEmbedded(); final String oldName = this.name; - owner.changeClassName(this.name, name, this); + owner.changeClassName(database, this.name, name, this); this.name = name; renameCluster(oldName, this.name); } finally { @@ -1931,8 +1932,8 @@ private void renameCluster(String oldName, String newName) { database.command("alter cluster `" + oldName + "` NAME \"" + newName + "\""); } - protected void setShortNameInternal(final String iShortName) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + protected void setShortNameInternal(ODatabaseDocumentInternal database, final String iShortName) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { @@ -1943,7 +1944,7 @@ protected void setShortNameInternal(final String iShortName) { if (this.shortName != null) oldName = this.shortName; - owner.changeClassName(oldName, iShortName, this); + owner.changeClassName(database, oldName, iShortName, this); this.shortName = iShortName; } finally { @@ -1961,10 +1962,10 @@ private void setDescriptionInternal(final String iDescription) { } } - private void dropPropertyInternal(final String iPropertyName) { - if (getDatabase().getTransaction().isActive()) + private void dropPropertyInternal(ODatabaseDocumentInternal database, final String iPropertyName) { + if (database.getTransaction().isActive()) throw new IllegalStateException("Cannot drop a property inside a transaction"); - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); acquireSchemaWriteLock(); try { @@ -1979,7 +1980,7 @@ private void dropPropertyInternal(final String iPropertyName) { } } - private OClass addClusterIdInternal(final int clusterId) { + private OClass addClusterIdInternal(ODatabaseDocumentInternal database, final int clusterId) { acquireSchemaWriteLock(); try { checkEmbedded(); @@ -2000,7 +2001,7 @@ private OClass addClusterIdInternal(final int clusterId) { if (defaultClusterId == NOT_EXISTENT_CLUSTER_ID) defaultClusterId = clusterId; - owner.addClusterForClass(clusterId, this); + owner.addClusterForClass(database, clusterId, this); return this; } finally { releaseSchemaWriteLock(); @@ -2022,7 +2023,7 @@ private void addPolymorphicClusterId(int clusterId) { } } - private OClass removeClusterIdInternal(final int clusterToRemove) { + private OClass removeClusterIdInternal(ODatabaseDocumentInternal database, final int clusterToRemove) { acquireSchemaWriteLock(); try { @@ -2058,7 +2059,7 @@ private OClass removeClusterIdInternal(final int clusterToRemove) { defaultClusterId = NOT_EXISTENT_CLUSTER_ID; } - owner.removeClusterForClass(clusterToRemove, this); + owner.removeClusterForClass(database, clusterToRemove, this); } finally { releaseSchemaWriteLock(); } @@ -2066,8 +2067,8 @@ private OClass removeClusterIdInternal(final int clusterToRemove) { return this; } - private void setAbstractInternal(final boolean isAbstract) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); + private void setAbstractInternal(ODatabaseDocumentInternal database, final boolean isAbstract) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE); acquireSchemaWriteLock(); try { @@ -2082,7 +2083,7 @@ private void setAbstractInternal(final boolean isAbstract) { for (int clusterId : getClusterIds()) { tryDropCluster(clusterId); removePolymorphicClusterId(clusterId); - owner.removeClusterForClass(clusterId, this); + owner.removeClusterForClass(database, clusterId, this); } setClusterIds(new int[] { NOT_EXISTENT_CLUSTER_ID }); @@ -2093,9 +2094,9 @@ private void setAbstractInternal(final boolean isAbstract) { if (!abstractClass) return; - int clusterId = getDatabase().getClusterIdByName(name); + int clusterId = database.getClusterIdByName(name); if (clusterId == -1) - clusterId = getDatabase().addCluster(name); + clusterId = database.addCluster(name); this.defaultClusterId = clusterId; this.clusterIds[0] = this.defaultClusterId; diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableClass.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableClass.java index fac3b7a54f1..c68aafa3432 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableClass.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableClass.java @@ -152,7 +152,7 @@ public void init() { this.ouser = isSubClassOf(OUser.CLASS_NAME); this.orole = isSubClassOf(ORole.CLASS_NAME); - final ODatabaseDocumentInternal db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined(); + final ODatabaseDocumentInternal db = getDatabase(); this.autoShardingIndex = db != null && db.getMetadata() != null && db.getMetadata().getIndexManager() != null ? db.getMetadata().getIndexManager().getClassAutoShardingIndex(name) : null; } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableSchema.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableSchema.java index af6708fa4a7..9fe69c798e0 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableSchema.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OImmutableSchema.java @@ -32,7 +32,6 @@ import com.orientechnologies.common.util.OArrays; import com.orientechnologies.orient.core.db.ODatabaseDocumentInternal; import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal; -import com.orientechnologies.orient.core.exception.OSchemaException; import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.id.ORecordId; import com.orientechnologies.orient.core.metadata.schema.clusterselection.OClusterSelectionFactory; @@ -59,10 +58,11 @@ public OImmutableSchema(OSchemaShared schemaShared) { identity = schemaShared.getIdentity(); clusterSelectionFactory = schemaShared.getClusterSelectionFactory(); - clustersToClasses = new HashMap(schemaShared.getClasses().size() * 3); - classes = new HashMap(schemaShared.getClasses().size()); + ODatabaseDocumentInternal database = getDatabase(); + clustersToClasses = new HashMap(schemaShared.getClasses(database).size() * 3); + classes = new HashMap(schemaShared.getClasses(database).size()); - for (OClass oClass : schemaShared.getClasses()) { + for (OClass oClass : schemaShared.getClasses(database)) { final OImmutableClass immutableClass = new OImmutableClass(oClass, this); classes.put(immutableClass.getName().toLowerCase(Locale.ENGLISH), immutableClass); diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaEmbedded.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaEmbedded.java index 35278340818..b44ee74eeea 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaEmbedded.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaEmbedded.java @@ -5,7 +5,6 @@ import com.orientechnologies.orient.core.db.ODatabaseDocumentInternal; import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener; import com.orientechnologies.orient.core.db.ODatabaseListener; -import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.exception.OSchemaException; import com.orientechnologies.orient.core.index.OIndex; import com.orientechnologies.orient.core.index.OIndexManager; @@ -26,7 +25,7 @@ public OSchemaEmbedded() { super(); } - public OClass createClass(final String className, int[] clusterIds, OClass... superClasses) { + public OClass createClass(ODatabaseDocumentInternal database, final String className, int[] clusterIds, OClass... superClasses) { final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(className); if (wrongCharacter != null) throw new OSchemaException( @@ -38,42 +37,41 @@ public OClass createClass(final String className, int[] clusterIds, OClass... su while (true) try { - result = doCreateClass(className, clusterIds, retry, superClasses); + result = doCreateClass(database, className, clusterIds, retry, superClasses); break; } catch (ClusterIdsAreEmptyException e) { classes.remove(className.toLowerCase(Locale.ENGLISH)); - clusterIds = createClusters(className); + clusterIds = createClusters(database, className); retry++; } return result; } - public OClass createClass(final String className, int clusters, OClass... superClasses) { + public OClass createClass(ODatabaseDocumentInternal database, final String className, int clusters, 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 + "'"); - return doCreateClass(className, clusters, 1, superClasses); + return doCreateClass(database, className, clusters, 1, superClasses); } - private OClass doCreateClass(final String className, final int clusters, final int retry, OClass... superClasses) { + private OClass doCreateClass(ODatabaseDocumentInternal database, final String className, final int clusters, final int retry, + OClass... superClasses) { OClass result; - final ODatabaseDocumentInternal db = getDatabase(); - - db.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); if (superClasses != null) OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { final String key = className.toLowerCase(Locale.ENGLISH); if (classes.containsKey(key) && retry == 0) throw new OSchemaException("Class '" + className + "' already exists in current database"); - if (executeThroughDistributedStorage()) { - final OStorage storage = db.getStorage(); + if (executeThroughDistributedStorage(database)) { + final OStorage storage = database.getStorage(); StringBuilder cmd = new StringBuilder("create class "); cmd.append('`'); cmd.append(className); @@ -102,14 +100,14 @@ private OClass doCreateClass(final String className, final int clusters, final i cmd.append(" clusters "); cmd.append(clusters); } - final int[] clusterIds = createClusters(className, clusters); - createClassInternal(className, clusterIds, superClassesList); + final int[] clusterIds = createClusters(database, className, clusters); + createClassInternal(database, 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(); + final Object res = database.command(commandSQL).execute(); } else { @@ -122,38 +120,37 @@ private OClass doCreateClass(final String className, final int clusters, final i } } } - final int[] clusterIds = createClusters(className, clusters); - createClassInternal(className, clusterIds, superClassesList); + final int[] clusterIds = createClusters(database, className, clusters); + createClassInternal(database, className, clusterIds, superClassesList); } result = classes.get(className.toLowerCase(Locale.ENGLISH)); // WAKE UP DB LIFECYCLE LISTENER for (Iterator it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + it.next().onCreateClass(database, result); - for (Iterator it = db.getListeners().iterator(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + for (Iterator it = database.getListeners().iterator(); it.hasNext(); ) + it.next().onCreateClass(database, result); } catch (ClusterIdsAreEmptyException e) { throw OException.wrapException(new OSchemaException("Cannot create class '" + className + "'"), e); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return result; } - private OClass createClassInternal(final String className, final int[] clusterIdsToAdd, final List superClasses) - throws ClusterIdsAreEmptyException { - acquireSchemaWriteLock(); + private OClass createClassInternal(ODatabaseDocumentInternal database, final String className, final int[] clusterIdsToAdd, + final List superClasses) throws ClusterIdsAreEmptyException { + acquireSchemaWriteLock(database); try { if (className == null || className.length() == 0) throw new OSchemaException("Found class name null or empty"); - final ODatabaseDocumentInternal database = getDatabase(); final OStorage storage = database.getStorage(); - checkEmbedded(storage); + checkEmbedded(); checkClustersAreAbsent(clusterIdsToAdd); @@ -195,11 +192,11 @@ private OClass createClassInternal(final String className, final int[] clusterId return cls; } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } - public OClass getOrCreateClass(final String iClassName, final OClass... superClasses) { + public OClass getOrCreateClass(ODatabaseDocumentInternal database, final String iClassName, final OClass... superClasses) { if (iClassName == null) return null; @@ -219,51 +216,49 @@ public OClass getOrCreateClass(final String iClassName, final OClass... superCla while (true) try { - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { cls = classes.get(iClassName.toLowerCase(Locale.ENGLISH)); if (cls != null) return cls; - cls = doCreateClass(iClassName, clusterIds, retry, superClasses); + cls = doCreateClass(database, iClassName, clusterIds, retry, superClasses); addClusterClassMap(cls); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } break; } catch (ClusterIdsAreEmptyException e) { - clusterIds = createClusters(iClassName); + clusterIds = createClusters(database, iClassName); retry++; } return cls; } - private OClass doCreateClass(final String className, int[] clusterIds, int retry, OClass... superClasses) - throws ClusterIdsAreEmptyException { + private OClass doCreateClass(ODatabaseDocumentInternal database, final String className, int[] clusterIds, int retry, + OClass... superClasses) throws ClusterIdsAreEmptyException { OClass result; - final ODatabaseDocumentInternal db = getDatabase(); - - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE); if (superClasses != null) OClassImpl.checkParametersConflict(Arrays.asList(superClasses)); - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { final String key = className.toLowerCase(Locale.ENGLISH); if (classes.containsKey(key) && retry == 0) throw new OSchemaException("Class '" + className + "' already exists in current database"); - if (!executeThroughDistributedStorage()) + if (!executeThroughDistributedStorage(database)) checkClustersAreAbsent(clusterIds); if (clusterIds == null || clusterIds.length == 0) { - clusterIds = createClusters(className, getDatabase().getStorage().getConfiguration().getMinimumClusters()); + clusterIds = createClusters(database, className, database.getStorage().getConfiguration().getMinimumClusters()); } - if (executeThroughDistributedStorage()) { - final OStorage storage = db.getStorage(); + if (executeThroughDistributedStorage(database)) { + final OStorage storage = database.getStorage(); StringBuilder cmd = new StringBuilder("create class "); cmd.append('`'); cmd.append(className); @@ -302,13 +297,13 @@ private OClass doCreateClass(final String className, int[] clusterIds, int retry } } - createClassInternal(className, clusterIds, superClassesList); + createClassInternal(database, 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(); + final Object res = database.command(commandSQL).execute(); } else { List superClassesList = new ArrayList(); if (superClasses != null && superClasses.length > 0) { @@ -318,34 +313,32 @@ private OClass doCreateClass(final String className, int[] clusterIds, int retry } } } - createClassInternal(className, clusterIds, superClassesList); + createClassInternal(database, className, clusterIds, superClassesList); } result = classes.get(className.toLowerCase(Locale.ENGLISH)); // WAKE UP DB LIFECYCLE LISTENER for (Iterator it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + it.next().onCreateClass(database, result); - for (Iterator it = db.getListeners().iterator(); it.hasNext(); ) - it.next().onCreateClass(getDatabase(), result); + for (Iterator it = database.getListeners().iterator(); it.hasNext(); ) + it.next().onCreateClass(database, result); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return result; } - private int[] createClusters(final String iClassName) { - return createClusters(iClassName, getDatabase().getStorage().getConfiguration().getMinimumClusters()); + private int[] createClusters(ODatabaseDocumentInternal database, final String iClassName) { + return createClusters(database, iClassName, database.getStorage().getConfiguration().getMinimumClusters()); } - private int[] createClusters(String className, int minimumClusters) { + private int[] createClusters(ODatabaseDocumentInternal database, String className, int minimumClusters) { className = className.toLowerCase(Locale.ENGLISH); - final ODatabaseDocumentInternal database = getDatabase(); - int[] clusterIds; if (internalClasses.contains(className.toLowerCase(Locale.ENGLISH))) { @@ -359,21 +352,21 @@ private int[] createClusters(String className, int minimumClusters) { // CHECK THE CLUSTER HAS NOT BEEN ALREADY ASSIGNED final OClass cls = clustersToClasses.get(clusterIds[0]); if (cls != null) - clusterIds[0] = database.addCluster(getNextAvailableClusterName(className)); + clusterIds[0] = database.addCluster(getNextAvailableClusterName(database, className)); } else // JUST KEEP THE CLASS NAME. THIS IS FOR LEGACY REASONS clusterIds[0] = database.addCluster(className); for (int i = 1; i < minimumClusters; ++i) - clusterIds[i] = database.addCluster(getNextAvailableClusterName(className)); + clusterIds[i] = database.addCluster(getNextAvailableClusterName(database, className)); return clusterIds; } - private String getNextAvailableClusterName(final String className) { + private String getNextAvailableClusterName(ODatabaseDocumentInternal database, final String className) { for (int i = 1; ; ++i) { final String clusterName = className + "_" + i; - if (getDatabase().getClusterIdByName(clusterName) < 0) + if (database.getClusterIdByName(clusterName) < 0) // FREE NAME return clusterName; } @@ -393,20 +386,19 @@ private void checkClustersAreAbsent(final int[] iClusterIds) { } } - public void dropClass(final String className) { - final ODatabaseDocumentInternal db = getDatabase(); - final OStorage storage = db.getStorage(); + public void dropClass(ODatabaseDocumentInternal database, final String className) { + final OStorage storage = database.getStorage(); final StringBuilder cmd; - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { - if (getDatabase().getTransaction().isActive()) + if (database.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); + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE); final String key = className.toLowerCase(Locale.ENGLISH); @@ -419,7 +411,7 @@ public void dropClass(final String className) { throw new OSchemaException("Class '" + className + "' cannot be dropped because it has sub classes " + cls.getSubclasses() + ". Remove the dependencies before trying to drop it again"); - if (executeThroughDistributedStorage()) { + if (executeThroughDistributedStorage(database)) { cmd = new StringBuilder("drop class "); cmd.append(className); cmd.append(" unsafe"); @@ -427,24 +419,23 @@ public void dropClass(final String className) { final OAutoshardedStorage autoshardedStorage = (OAutoshardedStorage) storage; OCommandSQL commandSQL = new OCommandSQL(cmd.toString()); commandSQL.addExcludedNode(autoshardedStorage.getNodeId()); - db.command(commandSQL).execute(); + database.command(commandSQL).execute(); - dropClassInternal(className); + dropClassInternal(database, className); } else - dropClassInternal(className); + dropClassInternal(database, className); // FREE THE RECORD CACHE - getDatabase().getLocalCache().freeCluster(cls.getDefaultClusterId()); + database.getLocalCache().freeCluster(cls.getDefaultClusterId()); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } - private void dropClassInternal(final String className) { - acquireSchemaWriteLock(); + private void dropClassInternal(ODatabaseDocumentInternal database, final String className) { + acquireSchemaWriteLock(database); try { - ODatabaseDocumentInternal database = getDatabase(); if (database.getTransaction().isActive()) throw new IllegalStateException("Cannot drop a class inside a transaction"); @@ -463,7 +454,7 @@ private void dropClassInternal(final String className) { throw new OSchemaException("Class '" + className + "' cannot be dropped because it has sub classes " + cls.getSubclasses() + ". Remove the dependencies before trying to drop it again"); - checkEmbedded(database.getStorage()); + checkEmbedded(); for (OClass superClass : cls.getSuperClasses()) { // REMOVE DEPENDENCY FROM SUPERCLASS @@ -474,7 +465,7 @@ private void dropClassInternal(final String className) { deleteCluster(database, id); } - dropClassIndexes(cls); + dropClassIndexes(database, cls); classes.remove(key); @@ -491,7 +482,7 @@ private void dropClassInternal(final String className) { for (Iterator it = database.getListeners().iterator(); it.hasNext(); ) it.next().onDropClass(database, cls); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } @@ -499,8 +490,7 @@ protected OClassImpl createClassInstance(ODocument c) { return new OClassEmbedded(this, c, (String) c.field("name")); } - private void dropClassIndexes(final OClass cls) { - final ODatabaseDocument database = getDatabase(); + private void dropClassIndexes(ODatabaseDocumentInternal database, final OClass cls) { final OIndexManager indexManager = database.getMetadata().getIndexManager(); for (final OIndex index : indexManager.getClassIndexes(cls.getName())) @@ -521,4 +511,8 @@ private void removeClusterClassMap(final OClass cls) { } } + public void checkEmbedded() { + } + + } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaProxy.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaProxy.java index 5fb7bb0b2f1..d772871c41f 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaProxy.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaProxy.java @@ -34,12 +34,11 @@ /** * Proxy class to use the shared OSchemaShared instance. Before to delegate each operations it sets the current database in the * thread local. - * + * * @author Luca - * */ @SuppressWarnings("unchecked") -public class OSchemaProxy extends OProxedResourceimplements OSchema { +public class OSchemaProxy extends OProxedResource implements OSchema { public OSchemaProxy(final OSchemaShared iDelegate, final ODatabaseDocumentInternal iDatabase) { super(iDelegate, iDatabase); @@ -55,12 +54,11 @@ public void create() { } public int countClasses() { - return delegate.countClasses(); + return delegate.countClasses(database); } public OClass createClass(final String iClassName) { - - return delegate.createClass(iClassName); + return delegate.createClass(database, iClassName); } public OClass getOrCreateClass(final String iClassName) { @@ -75,61 +73,52 @@ public OClass getOrCreateClass(final String iClassName, final OClass iSuperClass if (cls != null) return cls; - cls = delegate.getOrCreateClass(iClassName, iSuperClass); + cls = delegate.getOrCreateClass(database, iClassName, iSuperClass); return cls; } @Override public OClass getOrCreateClass(String iClassName, OClass... superClasses) { - - return delegate.getOrCreateClass(iClassName, superClasses); + return delegate.getOrCreateClass(database, iClassName, superClasses); } @Override public OClass createClass(final String iClassName, final OClass iSuperClass) { - - return delegate.createClass(iClassName, iSuperClass, (int[]) null); + return delegate.createClass(database, iClassName, iSuperClass, (int[]) null); } @Override public OClass createClass(String iClassName, OClass... superClasses) { - - return delegate.createClass(iClassName, superClasses); + return delegate.createClass(database, iClassName, superClasses); } public OClass createClass(final String iClassName, final OClass iSuperClass, final int[] iClusterIds) { - - return delegate.createClass(iClassName, iSuperClass, iClusterIds); + return delegate.createClass(database, iClassName, iSuperClass, iClusterIds); } @Override public OClass createClass(String className, int[] clusterIds, OClass... superClasses) { - - return delegate.createClass(className, clusterIds, superClasses); + return delegate.createClass(database, className, clusterIds, superClasses); } - + @Override public OClass createAbstractClass(final String iClassName) { - - return delegate.createAbstractClass(iClassName); + return delegate.createAbstractClass(database, iClassName); } @Override public OClass createAbstractClass(final String iClassName, final OClass iSuperClass) { - - return delegate.createAbstractClass(iClassName, iSuperClass); + return delegate.createAbstractClass(database, iClassName, iSuperClass); } @Override public OClass createAbstractClass(String iClassName, OClass... superClasses) { - - return delegate.createAbstractClass(iClassName, superClasses); + return delegate.createAbstractClass(database, iClassName, superClasses); } public void dropClass(final String iClassName) { - - delegate.dropClass(iClassName); + delegate.dropClass(database, iClassName); } public boolean existsClass(final String iClassName) { @@ -154,7 +143,7 @@ public OClass getClass(final String iClassName) { } public Collection getClasses() { - return delegate.getClasses(); + return delegate.getClasses(database); } @Deprecated @@ -199,12 +188,12 @@ public String toString() { @Override public Set getClassesRelyOnCluster(final String iClusterName) { - return delegate.getClassesRelyOnCluster(iClusterName); + return delegate.getClassesRelyOnCluster(database, iClusterName); } @Override public OClass createClass(String className, int clusters, OClass... superClasses) { - return delegate.createClass(className, clusters, superClasses); + return delegate.createClass(database, className, clusters, superClasses); } @Override @@ -226,23 +215,21 @@ public OGlobalProperty createGlobalProperty(String name, OType type, Integer id) return delegate.createGlobalProperty(name, type, id); } - @Override public OClusterSelectionFactory getClusterSelectionFactory() { return delegate.getClusterSelectionFactory(); } - public Set getBlobClusters() { return delegate.getBlobClusters(); } public int addBlobCluster(final int clusterId) { - return delegate.addBlobCluster(clusterId); + return delegate.addBlobCluster(database, clusterId); } - public void removeBlobCluster(String clusterName){ - delegate.removeBlobCluster(clusterName); + public void removeBlobCluster(String clusterName) { + delegate.removeBlobCluster(database, clusterName); } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java index c617439c13f..3f697271cde 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OSchemaShared.java @@ -27,7 +27,6 @@ import com.orientechnologies.orient.core.db.ODatabaseDocumentInternal; import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal; import com.orientechnologies.orient.core.db.OScenarioThreadLocal; -import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.db.record.ORecordElement; import com.orientechnologies.orient.core.exception.OConcurrentModificationException; import com.orientechnologies.orient.core.exception.OConfigurationException; @@ -161,8 +160,8 @@ public OClusterSelectionFactory getClusterSelectionFactory() { return clusterSelectionFactory; } - public int countClasses() { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); + public int countClasses(ODatabaseDocumentInternal database) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); acquireSchemaReadLock(); try { @@ -182,61 +181,57 @@ public void onPostIndexManagement() { } } - public OClass createClass(final String className) { - return createClass(className, (OClass) null, (int[]) null); + public OClass createClass(ODatabaseDocumentInternal database, final String className) { + return createClass(database, className, (OClass) null, (int[]) null); } - public OClass createClass(final String iClassName, final OClass iSuperClass) { - return createClass(iClassName, iSuperClass, (int[]) null); + public OClass createClass(ODatabaseDocumentInternal database, final String iClassName, final OClass iSuperClass) { + return createClass(database, iClassName, iSuperClass, (int[]) null); } - public OClass createClass(String iClassName, OClass... superClasses) { - return createClass(iClassName, (int[]) null, superClasses); + public OClass createClass(ODatabaseDocumentInternal database, String iClassName, OClass... superClasses) { + return createClass(database, iClassName, (int[]) null, superClasses); } - public OClass getOrCreateClass(final String iClassName) { - return getOrCreateClass(iClassName, (OClass) null); + public OClass getOrCreateClass(ODatabaseDocumentInternal database, final String iClassName) { + return getOrCreateClass(database, iClassName, (OClass) null); } - public OClass getOrCreateClass(final String iClassName, final OClass superClass) { - return getOrCreateClass(iClassName, superClass == null ? new OClass[0] : new OClass[] { superClass }); + public OClass getOrCreateClass(ODatabaseDocumentInternal database, final String iClassName, final OClass superClass) { + return getOrCreateClass(database, iClassName, superClass == null ? new OClass[0] : new OClass[] { superClass }); } - public abstract OClass getOrCreateClass(final String iClassName, final OClass... superClasses); + public abstract OClass getOrCreateClass(ODatabaseDocumentInternal database, final String iClassName, final OClass... superClasses); - public OClass createAbstractClass(final String className) { - return createClass(className, null, new int[] { -1 }); + public OClass createAbstractClass(ODatabaseDocumentInternal database, final String className) { + return createClass(database, className, null, new int[] { -1 }); } - public OClass createAbstractClass(final String className, final OClass superClass) { - return createClass(className, superClass, new int[] { -1 }); + public OClass createAbstractClass(ODatabaseDocumentInternal database, final String className, final OClass superClass) { + return createClass(database, className, superClass, new int[] { -1 }); } - public OClass createAbstractClass(String iClassName, OClass... superClasses) { - return createClass(iClassName, new int[] { -1 }, superClasses); + public OClass createAbstractClass(ODatabaseDocumentInternal database, String iClassName, OClass... superClasses) { + return createClass(database, iClassName, new int[] { -1 }, superClasses); } - public OClass createClass(final String className, final OClass superClass, int[] clusterIds) { - return createClass(className, clusterIds, superClass); + public OClass createClass(ODatabaseDocumentInternal database, final String className, final OClass superClass, int[] clusterIds) { + return createClass(database, className, clusterIds, superClass); } - public abstract OClass createClass(final String className, int[] clusterIds, OClass... superClasses); + public abstract OClass createClass(ODatabaseDocumentInternal database, final String className, int[] clusterIds, OClass... superClasses); - public abstract OClass createClass(final String className, int clusters, OClass... superClasses); + public abstract OClass createClass(ODatabaseDocumentInternal database, final String className, int clusters, OClass... superClasses); - public void checkEmbedded(final OStorage storage) { - if (!(storage.getUnderlying() instanceof OAbstractPaginatedStorage)) - throw new OSchemaException("'Internal' schema modification methods can be used only inside of embedded database"); - } + public abstract void checkEmbedded(); - void addClusterForClass(final int clusterId, final OClass cls) { - acquireSchemaWriteLock(); + void addClusterForClass(ODatabaseDocumentInternal database, final int clusterId, final OClass cls) { + acquireSchemaWriteLock(database); try { if (clusterId < 0) return; - final OStorage storage = getDatabase().getStorage(); - checkEmbedded(storage); + checkEmbedded(); final OClass existingCls = clustersToClasses.get(clusterId); if (existingCls != null && !cls.equals(existingCls)) @@ -245,22 +240,21 @@ void addClusterForClass(final int clusterId, final OClass cls) { clustersToClasses.put(clusterId, cls); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } - void removeClusterForClass(int clusterId, OClass cls) { - acquireSchemaWriteLock(); + void removeClusterForClass(ODatabaseDocumentInternal database, int clusterId, OClass cls) { + acquireSchemaWriteLock(database); try { if (clusterId < 0) return; - final OStorage storage = getDatabase().getStorage(); - checkEmbedded(storage); + checkEmbedded(); clustersToClasses.remove(clusterId); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } @@ -298,7 +292,7 @@ public OClass getClassByClusterId(int clusterId) { * * @see com.orientechnologies.orient.core.metadata.schema.OSchema#dropClass(java.lang.String) */ - public abstract void dropClass(final String className); + public abstract void dropClass(ODatabaseDocumentInternal database, final String className); /** * Reloads the schema inside a storage's shared lock. @@ -364,24 +358,24 @@ public void releaseSchemaReadLock() { rwSpinLock.releaseReadLock(); } - private boolean isDistributed() { - return getDatabase().getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); + private boolean isDistributed(ODatabaseDocumentInternal database) { + return database.getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); } - public void acquireSchemaWriteLock() { - if (isDistributed()) { - ((OAutoshardedStorage) getDatabase().getStorage()).acquireDistributedExclusiveLock(0); + public void acquireSchemaWriteLock(ODatabaseDocumentInternal database) { + if (isDistributed(database)) { + ((OAutoshardedStorage) database.getStorage()).acquireDistributedExclusiveLock(0); acquiredDistributed = true; } rwSpinLock.acquireWriteLock(); modificationCounter.increment(); } - public void releaseSchemaWriteLock() { - releaseSchemaWriteLock(true); + public void releaseSchemaWriteLock(ODatabaseDocumentInternal database) { + releaseSchemaWriteLock(database, true); } - public void releaseSchemaWriteLock(final boolean iSave) { + public void releaseSchemaWriteLock(ODatabaseDocumentInternal database, final boolean iSave) { int count; boolean releaseDistributed = acquiredDistributed; try { @@ -390,8 +384,8 @@ public void releaseSchemaWriteLock(final boolean iSave) { // by sql commands and we need to reload local replica if (iSave) - if (getDatabase().getStorage().getUnderlying() instanceof OAbstractPaginatedStorage) - saveInternal(); + if (database.getStorage().getUnderlying() instanceof OAbstractPaginatedStorage) + saveInternal(database); else reload(); else @@ -403,25 +397,25 @@ public void releaseSchemaWriteLock(final boolean iSave) { modificationCounter.decrement(); count = modificationCounter.intValue(); rwSpinLock.releaseWriteLock(); - if (isDistributed() && releaseDistributed) { - ((OAutoshardedStorage) getDatabase().getStorage()).releaseDistributedExclusiveLock(); + if (isDistributed(database) && releaseDistributed) { + ((OAutoshardedStorage) database.getStorage()).releaseDistributedExclusiveLock(); } } assert count >= 0; - if (count == 0 && getDatabase().getStorage().getUnderlying() instanceof OStorageProxy) { - getDatabase().getStorage().reload(); + if (count == 0 && database.getStorage().getUnderlying() instanceof OStorageProxy) { + database.getStorage().reload(); } } - void changeClassName(final String oldName, final String newName, final OClass cls) { + void changeClassName(ODatabaseDocumentInternal database, final String oldName, final String newName, final OClass cls) { if (oldName != null && oldName.equalsIgnoreCase(newName)) throw new IllegalArgumentException("Class '" + oldName + "' cannot be renamed with the same name"); - acquireSchemaWriteLock(); + acquireSchemaWriteLock(database); try { - checkEmbedded(getDatabase().getStorage()); + checkEmbedded(); if (newName != null && classes.containsKey(newName.toLowerCase(Locale.ENGLISH))) throw new IllegalArgumentException("Class '" + newName + "' is already present in schema"); @@ -432,7 +426,7 @@ void changeClassName(final String oldName, final String newName, final OClass cl classes.put(newName.toLowerCase(Locale.ENGLISH), cls); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } @@ -538,8 +532,9 @@ public void fromStream() { blobClusters = document.field("blobClusters"); if (!hasGlobalProperties) { - if (getDatabase().getStorage().getUnderlying() instanceof OAbstractPaginatedStorage) - saveInternal(); + ODatabaseDocumentInternal database = ODatabaseRecordThreadLocal.INSTANCE.get(); + if (database.getStorage().getUnderlying() instanceof OAbstractPaginatedStorage) + saveInternal(database); } } finally { @@ -586,8 +581,8 @@ public ODocument toStream() { } } - public Collection getClasses() { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); + public Collection getClasses(ODatabaseDocumentInternal database) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); acquireSchemaReadLock(); try { return new HashSet(classes.values()); @@ -596,12 +591,12 @@ public Collection getClasses() { } } - public Set getClassesRelyOnCluster(final String clusterName) { - getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); + public Set getClassesRelyOnCluster(ODatabaseDocumentInternal database, final String clusterName) { + database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_READ); acquireSchemaReadLock(); try { - final int clusterId = getDatabase().getClusterIdByName(clusterName); + final int clusterId = database.getClusterIdByName(clusterName); final Set result = new HashSet(); for (OClass c : classes.values()) { if (OArrays.contains(c.getPolymorphicClusterIds(), clusterId)) @@ -728,14 +723,13 @@ protected OGlobalProperty findOrCreateGlobalProperty(final String name, final OT return global; } - protected boolean executeThroughDistributedStorage() { - return getDatabase().getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); + protected boolean executeThroughDistributedStorage(ODatabaseDocumentInternal database) { + return database.getStorage() instanceof OAutoshardedStorage && !OScenarioThreadLocal.INSTANCE.isRunModeDistributed(); } - private void saveInternal() { - final ODatabaseDocument db = getDatabase(); + private void saveInternal(ODatabaseDocumentInternal database) { - if (db.getTransaction().isActive()) { + if (database.getTransaction().isActive()) { reload(null, true); throw new OSchemaException("Cannot change the schema while a transaction is active. Schema changes are not transactional"); } @@ -769,10 +763,6 @@ protected void addClusterClassMap(final OClass cls) { } - protected ODatabaseDocumentInternal getDatabase() { - return ODatabaseRecordThreadLocal.INSTANCE.get(); - } - private void ensurePropertiesSize(int size) { while (properties.size() <= size) properties.add(null); @@ -785,47 +775,47 @@ protected OModifiableInteger initialValue() { } } - public int addBlobCluster(int clusterId) { - acquireSchemaWriteLock(); + public int addBlobCluster(ODatabaseDocumentInternal database, int clusterId) { + acquireSchemaWriteLock(database); try { checkClusterCanBeAdded(clusterId, null); blobClusters.add(clusterId); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } return clusterId; } - public void removeBlobCluster(String clusterName) { - acquireSchemaWriteLock(); + public void removeBlobCluster(ODatabaseDocumentInternal database, String clusterName) { + acquireSchemaWriteLock(database); try { - int clusterId = getClusterId(clusterName); + int clusterId = getClusterId(database, clusterName); blobClusters.remove(clusterId); } finally { - releaseSchemaWriteLock(); + releaseSchemaWriteLock(database); } } - protected int getClusterId(final String stringValue) { + protected int getClusterId(ODatabaseDocumentInternal database, final String stringValue) { int clId; try { clId = Integer.parseInt(stringValue); } catch (NumberFormatException e) { - clId = getDatabase().getClusterIdByName(stringValue); + clId = database.getClusterIdByName(stringValue); } return clId; } - protected int createClusterIfNeeded(String nameOrId) { + protected int createClusterIfNeeded(ODatabaseDocumentInternal database, String nameOrId) { final String[] parts = nameOrId.split(" "); - int clId = getClusterId(parts[0]); + int clId = getClusterId(database, parts[0]); if (clId == NOT_EXISTENT_CLUSTER_ID) { try { clId = Integer.parseInt(parts[0]); throw new IllegalArgumentException("Cluster id '" + clId + "' cannot be added"); } catch (NumberFormatException e) { - clId = getDatabase().addCluster(parts[0]); + clId = database.addCluster(parts[0]); } }