diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java index f06bbd66b5289..f5289c8213086 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.nio.file.AccessDeniedException; import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; @@ -91,7 +92,11 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed { Path archive = parse( args, "from", Paths::get ); String database = parse( args, "database", identity() ); - load( archive, database, toDatabaseDirectory( database ) ); + boolean force = Args.parse( args ).getBoolean( "force" ); + + Path databaseDirectory = toDatabaseDirectory( database ); + deleteIfNecessary( databaseDirectory, force ); + load( archive, database, databaseDirectory ); } private T parse( String[] args, String argument, Function converter ) throws IncorrectUsage @@ -117,6 +122,21 @@ private Path toDatabaseDirectory( String databaseName ) .get( database_path ).toPath(); } + private void deleteIfNecessary( Path databaseDirectory, boolean force ) throws CommandFailed + { + try + { + if ( force ) + { + Files.deleteIfExists( databaseDirectory ); + } + } + catch ( IOException e ) + { + wrapIOException( e ); + } + } + private void load( Path archive, String database, Path databaseDirectory ) throws CommandFailed { try diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java index 969f8f0923415..14f3110345816 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java @@ -46,6 +46,7 @@ import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -86,6 +87,42 @@ public void shouldCalculateTheDatabaseDirectoryFromConfig() verify( loader ).load( any(), eq( Paths.get( "/some/data/dir/databases/foo.db" ) ) ); } + @Test + public void shouldDeleteTheOldDatabaseIfForceArgumentIsProvided() + throws CommandFailed, IncorrectUsage, IOException, IncorrectFormat + { + Path databaseDirectory = homeDir.resolve( "data/databases/foo.db" ); + Files.createDirectories( databaseDirectory.getParent() ); + Files.createFile( databaseDirectory ); + + doAnswer( ignored -> + { + assertThat( Files.exists( databaseDirectory ), equalTo( false )); + return null; + } ).when( loader ).load( any(), any() ); + + new LoadCommand( homeDir, configDir, loader ) + .execute( new String[]{"--database=foo.db", "--from=" + archive, "--force"} ); + } + + @Test + public void shouldNotDeleteTheOldDatabaseIfForceArgumentIsNotProvided() + throws CommandFailed, IncorrectUsage, IOException, IncorrectFormat + { + Path databaseDirectory = homeDir.resolve( "data/databases/foo.db" ); + Files.createDirectories( databaseDirectory.getParent() ); + Files.createFile( databaseDirectory ); + + doAnswer( ignored -> + { + assertThat( Files.exists( databaseDirectory ), equalTo( true )); + return null; + } ).when( loader ).load( any(), any() ); + + new LoadCommand( homeDir, configDir, loader ) + .execute( new String[]{"--database=foo.db", "--from=" + archive} ); + } + @Test public void shouldObjectIfTheDatabaseArgumentIsMissing() throws CommandFailed {