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