Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: sql/recovery.h

Issue 1832173002: [sql] Database recovery system for Shortcuts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments from #9 and #10. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sql/recovery.h
diff --git a/sql/recovery.h b/sql/recovery.h
index 8efd71877318b04f1df5486f135257038717918d..20b85d7f05a8e233b9d91420cddd25777e916990 100644
--- a/sql/recovery.h
+++ b/sql/recovery.h
@@ -18,13 +18,17 @@ class FilePath;
namespace sql {
-// Recovery module for sql/. The basic idea is to create a fresh
-// database and populate it with the recovered contents of the
-// original database. If recovery is successful, the recovered
-// database is backed up over the original database. If recovery is
-// not successful, the original database is razed. In either case,
-// the original handle is poisoned so that operations on the stack do
-// not accidentally disrupt the restored data.
+// Recovery module for sql/. The basic idea is to create a fresh database and
+// populate it with the recovered contents of the original database. If
+// recovery is successful, the recovered database is backed up over the original
+// database. If recovery is not successful, the original database is razed. In
+// either case, the original handle is poisoned so that operations on the stack
+// do not accidentally disrupt the restored data.
+//
+// RecoverDatabaseOrRaze() automates this, including recoverying the schema of
+// from the suspect database. If a database requires special handling, such as
+// recovering between different schema, or tables requiring post-processing,
+// then the module can be used manually like:
//
// {
// std::unique_ptr<sql::Recovery> r =
@@ -151,6 +155,31 @@ class SQL_EXPORT Recovery {
// Only valid to call after successful SetupMeta().
bool GetMetaVersionNumber(int* version_number);
+ // Attempt to recover the database by creating a new database with schema from
+ // |db|, then copying over as much data as possible. If the database is
+ // entirely unreadable, the new database will be empty. After this call, the
+ // |db| handle will be poisoned so that future calls will return errors until
+ // the handle is re-opened.
+ //
+ // The "OrRaze" portion means that if recovery fails due to errors, the
+ // database can be razed or deleted. The goal is for this function to make
+ // every possible effort to leave behind a correctly operating database file.
+ //
+ // If a corrupt database contains tables without unique indices, the resulting
+ // table may contain duplication. If this is not acceptable, the client
+ // should use the manual process as described in the example at the top of the
+ // file, cleaning up data at the appropriate points.
+ static void RecoverDatabaseOrRaze(Connection* db,
Mark P 2016/04/19 23:34:28 Thanks for the long response. Fundamentally, my c
Scott Hess - ex-Googler 2016/05/13 21:24:36 Done.
+ const base::FilePath& db_path);
+
+ // Returns true for SQLite errors which RecoverDatabaseOrRaze() can recover,
+ // or which cannot plausibly be recovered (and should be razed). This does
Mark P 2016/04/19 23:34:28 nit: or which -> versus You don't mean "or", at le
Scott Hess - ex-Googler 2016/05/13 21:24:36 Just removed the comparison clause entirely.
+ // not guarantee that RecoverDatabaseOrRaze() will successfully recover any
+ // data. Returning false means the error is not related to the contents of
+ // the database (such as SQLITE_BUSY or SQLITE_MISUSE), or is not verified to
+ // be handled correctly (such as SQLITE_IOERR or SQLITE_FULL).
+ static bool ShouldRecoverOrRaze(int extended_error);
+
private:
explicit Recovery(Connection* connection);

Powered by Google App Engine
This is Rietveld 408576698