From a868d701d771a24207c6d40256f3bbae1207aad8 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 8 Apr 2020 15:55:25 -0700 Subject: [PATCH] Enhance exception message on SQLiteCantOpenDatabaseException Bug: 150248286 Test: atest CtsDatabaseTestCases Change-Id: I39f7a3516dfbe0198b1ef5f68af1265df98c5a0a --- .../SQLiteCantOpenDatabaseException.java | 5 ++++ .../database/sqlite/SQLiteConnection.java | 24 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/java/android/database/sqlite/SQLiteCantOpenDatabaseException.java b/core/java/android/database/sqlite/SQLiteCantOpenDatabaseException.java index 6f01796c93c23..5d4b48dac46b9 100644 --- a/core/java/android/database/sqlite/SQLiteCantOpenDatabaseException.java +++ b/core/java/android/database/sqlite/SQLiteCantOpenDatabaseException.java @@ -22,4 +22,9 @@ public class SQLiteCantOpenDatabaseException extends SQLiteException { public SQLiteCantOpenDatabaseException(String error) { super(error); } + + /** @hide */ + public SQLiteCantOpenDatabaseException(String error, Throwable cause) { + super(error, cause); + } } diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java index bcb3934a5b08e..f7c96a3a02c1c 100644 --- a/core/java/android/database/sqlite/SQLiteConnection.java +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -36,6 +36,9 @@ import dalvik.system.CloseGuard; import java.io.File; import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -215,12 +218,31 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } private void open() { + final String file = mConfiguration.path; final int cookie = mRecentOperations.beginOperation("open", null, null); try { - mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags, + mConnectionPtr = nativeOpen(file, mConfiguration.openFlags, mConfiguration.label, NoPreloadHolder.DEBUG_SQL_STATEMENTS, NoPreloadHolder.DEBUG_SQL_TIME, mConfiguration.lookasideSlotSize, mConfiguration.lookasideSlotCount); + } catch (SQLiteCantOpenDatabaseException e) { + String message = String.format("Cannot open database '%s'", file); + + final Path path = FileSystems.getDefault().getPath(file); + final Path dir = path.getParent(); + + if (!Files.isDirectory(dir)) { + message += ": Directory " + dir + " doesn't exist"; + } else if (!Files.exists(path)) { + message += ": File " + path + " doesn't exist"; + } else if (!Files.isReadable(path)) { + message += ": File " + path + " is not readable"; + } else if (Files.isDirectory(path)) { + message += ": Path " + path + " is a directory"; + } else { + message += ": Unknown reason"; + } + throw new SQLiteCantOpenDatabaseException(message, e); } finally { mRecentOperations.endOperation(cookie); }