From 2e6658d8e4afe615b998430754d4dd798013b43b Mon Sep 17 00:00:00 2001 From: Tglman Date: Mon, 24 Feb 2025 15:59:55 +0000 Subject: [PATCH] refactor: used create class if not exists in cases where is possible, minor create class cleanups --- .../remote/metadata/schema/OSchemaRemote.java | 2 +- .../orient/core/db/OSystemDatabase.java | 4 +++- .../core/db/document/ODatabaseDocument.java | 14 +++++++++----- .../sql/parser/OCreateClassStatement.java | 19 +++++++++---------- .../auditing/OAuditingLoggingThread.java | 15 ++++++--------- .../security/auditing/ODefaultAuditing.java | 5 ++--- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/client/src/main/java/com/orientechnologies/orient/client/remote/metadata/schema/OSchemaRemote.java b/client/src/main/java/com/orientechnologies/orient/client/remote/metadata/schema/OSchemaRemote.java index d648f69e4a1..809c9c88885 100644 --- a/client/src/main/java/com/orientechnologies/orient/client/remote/metadata/schema/OSchemaRemote.java +++ b/client/src/main/java/com/orientechnologies/orient/client/remote/metadata/schema/OSchemaRemote.java @@ -243,7 +243,7 @@ public boolean createClassIfNotExists( StringBuilder cmd = new StringBuilder("create class "); cmd.append('`'); cmd.append(className); - cmd.append('`'); + cmd.append("` if not exists "); List superClassesList = new ArrayList(); if (superClasses != null && superClasses.length > 0) { diff --git a/core/src/main/java/com/orientechnologies/orient/core/db/OSystemDatabase.java b/core/src/main/java/com/orientechnologies/orient/core/db/OSystemDatabase.java index ade4d1abd48..f9a86047b3f 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/db/OSystemDatabase.java +++ b/core/src/main/java/com/orientechnologies/orient/core/db/OSystemDatabase.java @@ -164,9 +164,11 @@ public void init() { private synchronized void checkServerId() { ODatabaseDocumentInternal db = openSystemDatabase(); try { + OClass clazz = db.getClass(SERVER_INFO_CLASS); if (clazz == null) { - clazz = db.createClass(SERVER_INFO_CLASS); + db.createClassIfNotExist(SERVER_INFO_CLASS); + clazz = db.getClass(SERVER_INFO_CLASS); } OElement info; if (clazz.count() == 0) { diff --git a/core/src/main/java/com/orientechnologies/orient/core/db/document/ODatabaseDocument.java b/core/src/main/java/com/orientechnologies/orient/core/db/document/ODatabaseDocument.java index 87b03b86983..63b3cd61df1 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/db/document/ODatabaseDocument.java +++ b/core/src/main/java/com/orientechnologies/orient/core/db/document/ODatabaseDocument.java @@ -369,11 +369,15 @@ default OClass createClassIfNotExist(String className, String... superclasses) throws OSchemaException { OSchema schema = getMetadata().getSchema(); schema.reload(); - - OClass result = schema.getClass(className); - if (result == null) { - result = createClass(className, superclasses); + OClass[] cls = new OClass[superclasses.length]; + for (int i = 0; i < superclasses.length; i++) { + OClass superCl = schema.getClass(superclasses[i]); + if (superCl == null) { + throw new OSchemaException("Super class with name '" + superclasses[i] + "' do not exists"); + } + cls[i] = superCl; } - return result; + schema.createClassIfNotExists(className, cls); + return schema.getClass(className); } } diff --git a/core/src/main/java/com/orientechnologies/orient/core/sql/parser/OCreateClassStatement.java b/core/src/main/java/com/orientechnologies/orient/core/sql/parser/OCreateClassStatement.java index c1d9083d825..14e36b40e72 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/sql/parser/OCreateClassStatement.java +++ b/core/src/main/java/com/orientechnologies/orient/core/sql/parser/OCreateClassStatement.java @@ -42,7 +42,8 @@ public OCreateClassStatement(OrientSql p, int id) { public OExecutionStream executeDDL(OCommandContext ctx) { OSchema schema = ctx.getDatabase().getMetadata().getSchema(); - if (schema.existsClass(name.getStringValue())) { + String className = name.getStringValue(); + if (schema.existsClass(className)) { if (ifNotExists) { return OExecutionStream.empty(); } else { @@ -50,28 +51,26 @@ public OExecutionStream executeDDL(OCommandContext ctx) { } } checkSuperclasses(schema, ctx); + OClass[] superclasses = getSuperClasses(schema); OResultInternal result = new OResultInternal(); result.setProperty("operation", "create class"); - result.setProperty("className", name.getStringValue()); + result.setProperty("className", className); - OClass clazz = null; - OClass[] superclasses = getSuperClasses(schema); if (abstractClass) { - clazz = schema.createAbstractClass(name.getStringValue(), superclasses); + schema.createAbstractClass(className, superclasses); result.setProperty("abstract", abstractClass); } else if (totalClusterNo != null) { - clazz = - schema.createClass( - name.getStringValue(), totalClusterNo.getValue().intValue(), superclasses); + schema.createClass( + className, totalClusterNo.getValue().intValue(), superclasses); } else if (clusters != null) { int[] clusterIds = new int[clusters.size()]; for (int i = 0; i < clusters.size(); i++) { clusterIds[i] = clusters.get(i).getValue().intValue(); } - clazz = schema.createClass(name.getStringValue(), clusterIds, superclasses); + schema.createClass(className, clusterIds, superclasses); } else { - clazz = schema.createClass(name.getStringValue(), superclasses); + schema.createClass(className, superclasses); } return OExecutionStream.singleton(result); diff --git a/security/src/main/java/com/orientechnologies/security/auditing/OAuditingLoggingThread.java b/security/src/main/java/com/orientechnologies/security/auditing/OAuditingLoggingThread.java index 594054f470b..cd3330deb7d 100644 --- a/security/src/main/java/com/orientechnologies/security/auditing/OAuditingLoggingThread.java +++ b/security/src/main/java/com/orientechnologies/security/auditing/OAuditingLoggingThread.java @@ -36,14 +36,13 @@ public class OAuditingLoggingThread extends Thread { private volatile boolean running = true; private volatile boolean waitForAllLogs = true; private OrientDBInternal context; - private static final Object onceAtime = new Object(); private String className; private OSecuritySystem security; public OAuditingLoggingThread( final String iDatabaseName, - final BlockingQueue auditingQueue, + final BlockingQueue auditingQueue, final OrientDBInternal context, OSecuritySystem security) { super( @@ -61,13 +60,11 @@ public OAuditingLoggingThread( } private Void createAuditingClass(ODatabaseSession iArgument) { - synchronized (onceAtime) { - OSchema schema = iArgument.getMetadata().getSchema(); - if (!schema.existsClass(className)) { - OClass clazz = schema.getClass(ODefaultAuditing.AUDITING_LOG_CLASSNAME); - OClass cls = schema.createClass(className, clazz); - cls.createIndex(className + ".date", OClass.INDEX_TYPE.NOTUNIQUE, new String[] {"date"}); - } + OSchema schema = iArgument.getMetadata().getSchema(); + OClass clazz = schema.getClass(ODefaultAuditing.AUDITING_LOG_CLASSNAME); + if (schema.createClassIfNotExists(className, clazz)) { + OClass cls = schema.getClass(className); + cls.createIndex(className + ".date", OClass.INDEX_TYPE.NOTUNIQUE, new String[] {"date"}); } return null; } diff --git a/security/src/main/java/com/orientechnologies/security/auditing/ODefaultAuditing.java b/security/src/main/java/com/orientechnologies/security/auditing/ODefaultAuditing.java index c1d912cce0f..4fcb0faaa60 100755 --- a/security/src/main/java/com/orientechnologies/security/auditing/ODefaultAuditing.java +++ b/security/src/main/java/com/orientechnologies/security/auditing/ODefaultAuditing.java @@ -408,10 +408,9 @@ private void createClassIfNotExists() { sysdb = context.getSystemDatabase().openSystemDatabase(); OSchema schema = sysdb.getMetadata().getSchema(); - OClass cls = schema.getClass(AUDITING_LOG_CLASSNAME); - if (cls == null) { - cls = sysdb.getMetadata().getSchema().createClass(AUDITING_LOG_CLASSNAME); + if (sysdb.getMetadata().getSchema().createClassIfNotExists(AUDITING_LOG_CLASSNAME)) { + OClass cls = schema.getClass(AUDITING_LOG_CLASSNAME); cls.createProperty("date", OType.DATETIME); cls.createProperty("user", OType.STRING); cls.createProperty("operation", OType.BYTE);