| // 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 |