From ac813e5779067105b6cb0be75bda01b08d023d80 Mon Sep 17 00:00:00 2001 From: Christian Himpe Date: Thu, 29 Dec 2022 09:52:35 +0100 Subject: [PATCH 1/3] Add list command to console --- .../java/com/arcadedb/console/Console.java | 47 ++++++++++++++++--- .../com/arcadedb/console/ConsoleTest.java | 5 ++ .../com/arcadedb/remote/RemoteDatabase.java | 7 +++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/console/src/main/java/com/arcadedb/console/Console.java b/console/src/main/java/com/arcadedb/console/Console.java index 72115dec92..573fc30b47 100644 --- a/console/src/main/java/com/arcadedb/console/Console.java +++ b/console/src/main/java/com/arcadedb/console/Console.java @@ -187,6 +187,8 @@ else if (lineLowerCase.startsWith("close")) executeClose(); else if (lineLowerCase.startsWith("commit")) executeCommit(); + else if (lineLowerCase.startsWith("list")) + executeList(line); else if (lineLowerCase.startsWith("connect")) executeConnect(line); else if (lineLowerCase.startsWith("create database")) @@ -312,6 +314,28 @@ private void executeClose() { } } + private void executeList(final String line) { + final String url = line.substring("list".length()).trim(); + + final String[] urlParts = url.split(" "); + + outputLine("Databases:"); + if (urlParts[0].startsWith(REMOTE_PREFIX)) { + connectToRemoteServer(url, false); + for (Object f : remoteDatabase.databases()) { + outputLine(f.toString()); + } + remoteDatabase = null; + + } else { + File file = new File(databaseDirectory); + for (String f : file.list()) { + outputLine(f); + } + } + flushOutput(); + } + private void executeConnect(final String line) { final String url = line.substring("connect".length()).trim(); @@ -321,7 +345,7 @@ private void executeConnect(final String line) { outputLine("Database already connected, to connect to a different database close the current one first"); else if (!urlParts[0].isEmpty()) { if (urlParts[0].startsWith(REMOTE_PREFIX)) { - connectToRemoteServer(url); + connectToRemoteServer(url, true); outputLine("Connected"); flushOutput(); @@ -346,7 +370,7 @@ private void executeCreateDatabase(final String line) { outputLine("Database already connected, to connect to a different database close the current one first"); else if (!url.isEmpty()) { if (url.startsWith(REMOTE_PREFIX)) { - connectToRemoteServer(url); + connectToRemoteServer(url, true); remoteDatabase.create(); outputLine("Database created"); @@ -411,7 +435,7 @@ private void executeDropDatabase(final String line) { outputLine("A database is open, close the database first"); else if (!url.isEmpty()) { if (url.startsWith(REMOTE_PREFIX)) { - connectToRemoteServer(url); + connectToRemoteServer(url, true); remoteDatabase.drop(); outputLine("Database dropped"); @@ -650,6 +674,7 @@ private void executeHelp() { outputLine("help|? -> ask for this help"); outputLine("info types -> prints available types"); outputLine("info transaction -> prints current transaction"); + outputLine("list |remote: -> lists databases"); outputLine("load -> runs local script"); outputLine("rollback -> rolls back current transaction"); outputLine("set language = sql|sqlscript|cypher|gremlin|mongo -> sets console query language"); @@ -662,15 +687,15 @@ private void checkDatabaseIsOpen() { throw new ArcadeDBException("No active database. Open a database first"); } - private void connectToRemoteServer(final String url) { + private void connectToRemoteServer(final String url, final Boolean needsDatabase) { final String conn = url.startsWith(REMOTE_PREFIX + "//") ? url.substring((REMOTE_PREFIX + "//").length()) : url.substring(REMOTE_PREFIX.length()); - final String[] serverUserPassword = conn.split(" "); + final String[] serverUserPassword = conn.trim().split(" "); if (serverUserPassword.length != 3) throw new ConsoleException("URL username and password are missing"); final String[] serverParts = serverUserPassword[0].split("/"); - if (serverParts.length != 2) + if ((needsDatabase && serverParts.length != 2) || (!needsDatabase && serverParts.length != 1)) throw new ConsoleException("Remote URL '" + url + "' not valid"); String remoteServer; @@ -685,7 +710,15 @@ private void connectToRemoteServer(final String url) { remotePort = Integer.parseInt(serverParts[0].substring(portPos + 1)); } - remoteDatabase = new RemoteDatabase(remoteServer, remotePort, serverParts[1], serverUserPassword[1], serverUserPassword[2]); + String serverDatabaseName; + + if (needsDatabase) { + serverDatabaseName = serverParts[1]; + } else { + serverDatabaseName = ""; + } + + remoteDatabase = new RemoteDatabase(remoteServer, remotePort, serverDatabaseName, serverUserPassword[1], serverUserPassword[2]); } private void flushOutput() { diff --git a/console/src/test/java/com/arcadedb/console/ConsoleTest.java b/console/src/test/java/com/arcadedb/console/ConsoleTest.java index b0b98dc58c..942ff8fd63 100644 --- a/console/src/test/java/com/arcadedb/console/ConsoleTest.java +++ b/console/src/test/java/com/arcadedb/console/ConsoleTest.java @@ -54,6 +54,11 @@ public void drop() { FileUtils.deleteRecursively(new File("target/databases")); } + @Test + public void testList() throws IOException { + Assertions.assertTrue(console.parse("list;", false)); + } + @Test public void testConnect() throws IOException { Assertions.assertTrue(console.parse("connect " + DB_NAME + ";info types", false)); diff --git a/network/src/main/java/com/arcadedb/remote/RemoteDatabase.java b/network/src/main/java/com/arcadedb/remote/RemoteDatabase.java index 1e07594079..60704fc7c3 100644 --- a/network/src/main/java/com/arcadedb/remote/RemoteDatabase.java +++ b/network/src/main/java/com/arcadedb/remote/RemoteDatabase.java @@ -108,6 +108,13 @@ public void create() { databaseCommand("create", "SQL", null, null, true, null); } + public List databases() { + return (List) serverCommand("GET","databases", "SQL", null, null, true, true, (connection, response) -> { + + return response.getJSONArray("result").toList(); + }); + } + public boolean exists() { return (boolean) databaseCommand("exists", "SQL", null, null, true, (connection, response) -> { From 4ada275233ad65cd03bf70063dda3c7974959a47 Mon Sep 17 00:00:00 2001 From: Christian Himpe Date: Thu, 29 Dec 2022 23:16:34 +0100 Subject: [PATCH 2/3] Update list console command --- .../src/main/java/com/arcadedb/console/Console.java | 11 ++++++----- .../test/java/com/arcadedb/console/ConsoleTest.java | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/console/src/main/java/com/arcadedb/console/Console.java b/console/src/main/java/com/arcadedb/console/Console.java index 573fc30b47..81f0e9f2e3 100644 --- a/console/src/main/java/com/arcadedb/console/Console.java +++ b/console/src/main/java/com/arcadedb/console/Console.java @@ -84,7 +84,7 @@ public Console(final boolean interactive) throws IOException { terminal = TerminalBuilder.builder().system(system).streams(System.in, System.out).jansi(true).build(); Completer completer = new StringsCompleter("align database", "begin", "rollback", "commit", "check database", "close", "connect", "create database", - "create user", "drop database", "drop user", "export", "import", "help", "info types", "load", "exit", "quit", "set", "match", "select", "insert into", + "create user", "drop database", "drop user", "export", "import", "help", "info types", "list databases", "load", "exit", "quit", "set", "match", "select", "insert into", "update", "delete", "pwd"); lineReader = LineReaderBuilder.builder().terminal(terminal).parser(parser).variable("history-file", ".history").history(new DefaultHistory()) @@ -187,7 +187,7 @@ else if (lineLowerCase.startsWith("close")) executeClose(); else if (lineLowerCase.startsWith("commit")) executeCommit(); - else if (lineLowerCase.startsWith("list")) + else if (lineLowerCase.startsWith("list databases")) executeList(line); else if (lineLowerCase.startsWith("connect")) executeConnect(line); @@ -315,17 +315,18 @@ private void executeClose() { } private void executeList(final String line) { - final String url = line.substring("list".length()).trim(); + final String url = line.substring("list databases".length()).trim(); final String[] urlParts = url.split(" "); outputLine("Databases:"); if (urlParts[0].startsWith(REMOTE_PREFIX)) { + final RemoteDatabase holdRemoteDatabase = remoteDatabase; connectToRemoteServer(url, false); for (Object f : remoteDatabase.databases()) { outputLine(f.toString()); } - remoteDatabase = null; + remoteDatabase = holdRemoteDatabase; } else { File file = new File(databaseDirectory); @@ -674,7 +675,7 @@ private void executeHelp() { outputLine("help|? -> ask for this help"); outputLine("info types -> prints available types"); outputLine("info transaction -> prints current transaction"); - outputLine("list |remote: -> lists databases"); + outputLine("list databases |remote: -> lists databases"); outputLine("load -> runs local script"); outputLine("rollback -> rolls back current transaction"); outputLine("set language = sql|sqlscript|cypher|gremlin|mongo -> sets console query language"); diff --git a/console/src/test/java/com/arcadedb/console/ConsoleTest.java b/console/src/test/java/com/arcadedb/console/ConsoleTest.java index 942ff8fd63..35dc8c5226 100644 --- a/console/src/test/java/com/arcadedb/console/ConsoleTest.java +++ b/console/src/test/java/com/arcadedb/console/ConsoleTest.java @@ -56,7 +56,7 @@ public void drop() { @Test public void testList() throws IOException { - Assertions.assertTrue(console.parse("list;", false)); + Assertions.assertTrue(console.parse("list databases;", false)); } @Test From c3cf7342e5264c9d96caab745f43257a2e412dfe Mon Sep 17 00:00:00 2001 From: Christian Himpe Date: Fri, 30 Dec 2022 20:54:23 +0100 Subject: [PATCH 3/3] Add lock detection and kill release of databases to console --- .../main/java/com/arcadedb/console/Console.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/console/src/main/java/com/arcadedb/console/Console.java b/console/src/main/java/com/arcadedb/console/Console.java index 81f0e9f2e3..72b99eded4 100644 --- a/console/src/main/java/com/arcadedb/console/Console.java +++ b/console/src/main/java/com/arcadedb/console/Console.java @@ -95,6 +95,10 @@ public Console(final boolean interactive) throws IOException { if (!interactive) return; + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + close(); + })); + lineReader.getHistory().load(); try { @@ -358,8 +362,14 @@ else if (!urlParts[0].isEmpty()) { final String databaseUrl = databaseDirectory + urlParts[0]; - databaseFactory = new DatabaseFactory(databaseUrl); - localDatabase = (DatabaseInternal) databaseFactory.setAutoTransaction(true).open(mode); + final File lockFile = new File(databaseUrl + "/database.lck"); + + if (!lockFile.exists()) { + databaseFactory = new DatabaseFactory(databaseUrl); + localDatabase = (DatabaseInternal) databaseFactory.setAutoTransaction(true).open(mode); + } else { + outputLine("Database appears locked by server."); + } } } else throw new ConsoleException("URL missing"); @@ -675,7 +685,7 @@ private void executeHelp() { outputLine("help|? -> ask for this help"); outputLine("info types -> prints available types"); outputLine("info transaction -> prints current transaction"); - outputLine("list databases |remote: -> lists databases"); + outputLine("list databases |remote: -> prints list of databases"); outputLine("load -> runs local script"); outputLine("rollback -> rolls back current transaction"); outputLine("set language = sql|sqlscript|cypher|gremlin|mongo -> sets console query language");