diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index ee8f4c0695ae..760c19f3e722 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -438,6 +438,7 @@ search.everywhere.settings=false svn.use.incoming.optimization=false svn.lowest.supported.format.for.command.line=1.7.0 svn.use.svnkit.for.https.server.certificate.check=true +svn.use.sqlite.jdbc=false completion.enable.relevant.method.chain.suggestions=false ide.mac.message.sheets.java.emulation=false diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java index fcb8e22cec70..a7b6cfd86a47 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java @@ -27,6 +27,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.AbstractVcsHelper; import com.intellij.openapi.vcs.FilePath; @@ -83,6 +84,10 @@ import org.tmatesoft.svn.core.wc2.SvnTarget; import java.io.File; import java.net.URI; import java.nio.channels.NonWritableChannelException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -352,7 +357,8 @@ public class SvnUtil { File dbFile = resolveDatabase(path); if (dbFile != null) { - result = FileUtilRt.doIOOperation(new WorkingCopyFormatOperation(dbFile)); + result = FileUtilRt.doIOOperation( + Registry.is("svn.use.sqlite.jdbc") ? new SqLiteJdbcWorkingCopyFormatOperation(dbFile) : new WorkingCopyFormatOperation(dbFile)); if (result == null) { notifyDatabaseError(); @@ -851,7 +857,6 @@ public class SvnUtil { @Nullable @Override public WorkingCopyFormat execute(boolean lastAttempt) { - // TODO: rewrite it using sqlite jdbc driver SqLiteDb db = null; int userVersion = 0; @@ -886,6 +891,56 @@ public class SvnUtil { } } + private static class SqLiteJdbcWorkingCopyFormatOperation + implements FileUtilRt.RepeatableIOOperation { + @NotNull private final File myDbFile; + + public SqLiteJdbcWorkingCopyFormatOperation(@NotNull File dbFile) { + myDbFile = dbFile; + } + + @Nullable + @Override + public WorkingCopyFormat execute(boolean lastAttempt) { + Connection connection = null; + int userVersion = 0; + + try { + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:" + FileUtil.toSystemIndependentName(myDbFile.getPath())); + ResultSet resultSet = connection.createStatement().executeQuery("pragma user_version"); + + if (resultSet.next()) { + userVersion = resultSet.getInt(1); + } + else { + LOG.info("No result while getting user version for " + myDbFile.getPath()); + } + } + catch (ClassNotFoundException | SQLException e) { + LOG.info(e); + } + finally { + close(connection); + } + + WorkingCopyFormat format = WorkingCopyFormat.getInstance(userVersion); + + return !WorkingCopyFormat.UNKNOWN.equals(format) ? format : null; + } + + private static void close(@Nullable Connection connection) { + if (connection != null) { + try { + connection.close(); + } + catch (SQLException e) { + notifyDatabaseError(); + } + } + } + } + private static class SqLiteDb extends SqlJetDb { private SqLiteDb(@NotNull File file, boolean writable) { diff --git a/plugins/svn4idea/svn4idea.iml b/plugins/svn4idea/svn4idea.iml index ce9f4884e63e..9f20e6a3c4d5 100644 --- a/plugins/svn4idea/svn4idea.iml +++ b/plugins/svn4idea/svn4idea.iml @@ -93,5 +93,6 @@ + \ No newline at end of file