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