153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// found in the LICENSE file.
453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "sql/error_delegate_util.h"
65267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "third_party/sqlite/sqlite3.h"
8a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
9a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochnamespace sql {
10a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
1153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool IsErrorCatastrophic(int error) {
1253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  switch (error) {
1353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case SQLITE_DONE:
14a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case SQLITE_OK:
15a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch      // Theoretically, the wrapped delegate might have resolved the error, and
1653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      // we would end up here.
1753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      return false;
1853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case SQLITE_CORRUPT:
2053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case SQLITE_NOTADB:
2153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      // Highly unlikely we would ever recover from these.
2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      return true;
2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case SQLITE_CANTOPEN:
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      // TODO(erikwright): Figure out what this means.
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      return false;
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
28bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_IOERR:
29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // This could be broken blocks, in which case deleting the DB would be a
30bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // good idea. But it might also be transient.
31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // TODO(erikwright): Figure out if we can distinguish between the two,
32bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // or determine through metrics analysis to what extent these failures are
33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // transient.
34bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      return false;
35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_BUSY:
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // Presumably transient.
38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      return false;
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_TOOBIG:
41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_FULL:
42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_NOMEM:
43a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch      // Not a problem with the database.
44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      return false;
45bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
46a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    case SQLITE_READONLY:
47bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // Presumably either transient or we don't have the privileges to
48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // move/delete the file anyway.
49bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      return false;
50bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_CONSTRAINT:
52bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case SQLITE_ERROR:
53bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // These probgably indicate a programming error or a migration failure
54bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      // that we prefer not to mask.
55bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      return false;
5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_LOCKED:
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_INTERNAL:
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_PERM:
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_ABORT:
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_INTERRUPT:
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_NOTFOUND:
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_PROTOCOL:
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_EMPTY:
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_SCHEMA:
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_MISMATCH:
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_MISUSE:
68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_NOLFS:
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_AUTH:
70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_FORMAT:
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_RANGE:
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case SQLITE_ROW:
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      // None of these appear in error reports, so for now let's not try to
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      // guess at how to handle them.
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      return false;
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  }
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  return false;
7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}  // namespace sql
81a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch