| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "sql/error_delegate_util.h" | |
| #include "third_party/sqlite/sqlite3.h" | |
| namespace sql { | |
| bool IsErrorCatastrophic(int error) { | |
| switch (error) { | |
| case SQLITE_DONE: | |
| case SQLITE_OK: | |
| // Theoretically, the wrapped delegate might have resolved the error, and | |
| // we would end up here. | |
| return false; | |
| case SQLITE_CORRUPT: | |
| case SQLITE_NOTADB: | |
| // Highly unlikely we would ever recover from these. | |
| return true; | |
| case SQLITE_CANTOPEN: | |
| // TODO(erikwright): Figure out what this means. | |
| return false; | |
| case SQLITE_IOERR: | |
| // This could be broken blocks, in which case deleting the DB would be a | |
| // good idea. But it might also be transient. | |
| // TODO(erikwright): Figure out if we can distinguish between the two, | |
| // or determine through metrics analysis to what extent these failures are | |
| // transient. | |
| return false; | |
| case SQLITE_BUSY: | |
| // Presumably transient. | |
| return false; | |
| case SQLITE_TOOBIG: | |
| case SQLITE_FULL: | |
| case SQLITE_NOMEM: | |
| // Not a problem with the database. | |
| return false; | |
| case SQLITE_READONLY: | |
| // Presumably either transient or we don't have the privileges to | |
| // move/delete the file anyway. | |
| return false; | |
| case SQLITE_CONSTRAINT: | |
| case SQLITE_ERROR: | |
| // These probgably indicate a programming error or a migration failure | |
| // that we prefer not to mask. | |
| return false; | |
| case SQLITE_LOCKED: | |
| case SQLITE_INTERNAL: | |
| case SQLITE_PERM: | |
| case SQLITE_ABORT: | |
| case SQLITE_INTERRUPT: | |
| case SQLITE_NOTFOUND: | |
| case SQLITE_PROTOCOL: | |
| case SQLITE_EMPTY: | |
| case SQLITE_SCHEMA: | |
| case SQLITE_MISMATCH: | |
| case SQLITE_MISUSE: | |
| case SQLITE_NOLFS: | |
| case SQLITE_AUTH: | |
| case SQLITE_FORMAT: | |
| case SQLITE_RANGE: | |
| case SQLITE_ROW: | |
| // None of these appear in error reports, so for now let's not try to | |
| // guess at how to handle them. | |
| return false; | |
| } | |
| return false; | |
| } | |
| } // namespace sql |