1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "sql/error_delegate_util.h"
6 
7 #include "third_party/sqlite/sqlite3.h"
8 
9 namespace sql {
10 
IsErrorCatastrophic(int error)11 bool IsErrorCatastrophic(int error) {
12   switch (error) {
13     case SQLITE_DONE:
14     case SQLITE_OK:
15       // Theoretically, the wrapped delegate might have resolved the error, and
16       // we would end up here.
17       return false;
18 
19     case SQLITE_CORRUPT:
20     case SQLITE_NOTADB:
21       // Highly unlikely we would ever recover from these.
22       return true;
23 
24     case SQLITE_CANTOPEN:
25       // TODO(erikwright): Figure out what this means.
26       return false;
27 
28     case SQLITE_IOERR:
29       // This could be broken blocks, in which case deleting the DB would be a
30       // good idea. But it might also be transient.
31       // TODO(erikwright): Figure out if we can distinguish between the two,
32       // or determine through metrics analysis to what extent these failures are
33       // transient.
34       return false;
35 
36     case SQLITE_BUSY:
37       // Presumably transient.
38       return false;
39 
40     case SQLITE_TOOBIG:
41     case SQLITE_FULL:
42     case SQLITE_NOMEM:
43       // Not a problem with the database.
44       return false;
45 
46     case SQLITE_READONLY:
47       // Presumably either transient or we don't have the privileges to
48       // move/delete the file anyway.
49       return false;
50 
51     case SQLITE_CONSTRAINT:
52     case SQLITE_ERROR:
53       // These probgably indicate a programming error or a migration failure
54       // that we prefer not to mask.
55       return false;
56 
57     case SQLITE_LOCKED:
58     case SQLITE_INTERNAL:
59     case SQLITE_PERM:
60     case SQLITE_ABORT:
61     case SQLITE_INTERRUPT:
62     case SQLITE_NOTFOUND:
63     case SQLITE_PROTOCOL:
64     case SQLITE_EMPTY:
65     case SQLITE_SCHEMA:
66     case SQLITE_MISMATCH:
67     case SQLITE_MISUSE:
68     case SQLITE_NOLFS:
69     case SQLITE_AUTH:
70     case SQLITE_FORMAT:
71     case SQLITE_RANGE:
72     case SQLITE_ROW:
73       // None of these appear in error reports, so for now let's not try to
74       // guess at how to handle them.
75       return false;
76   }
77   return false;
78 }
79 
GetCorruptFileDiagnosticsInfo(const base::FilePath & corrupted_file_path)80 std::string GetCorruptFileDiagnosticsInfo(
81     const base::FilePath& corrupted_file_path) {
82   std::string corrupted_file_info("Corrupted file: ");
83   corrupted_file_info +=
84       corrupted_file_path.DirName().BaseName().AsUTF8Unsafe() + "/" +
85       corrupted_file_path.BaseName().AsUTF8Unsafe() + "\n";
86   return corrupted_file_info;
87 }
88 
89 }  // namespace sql
90