diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-24 01:59:58 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-24 01:59:58 +0000 |
commit | 2eec0a26907429341fb077b6968cc24dcc40378b (patch) | |
tree | 53d46fd61207c46dcee9cf701fab44206d64c771 /sql/connection.cc | |
parent | 35bc8bfe2930a0157c17cdd5bd6abb5c0558f57a (diff) | |
download | chromium_src-2eec0a26907429341fb077b6968cc24dcc40378b.zip chromium_src-2eec0a26907429341fb077b6968cc24dcc40378b.tar.gz chromium_src-2eec0a26907429341fb077b6968cc24dcc40378b.tar.bz2 |
[sql] Refactor to remove use of const_cast<>.
The comments in these cases used incorrect reasoning for why the
const_cast<> was safe. Whether the SQL statements modify the database
is irrelevant. Add an internal helper to allow them to correctly
accomplish things in a const situation.
BUG=none
TEST=none
Review URL: https://chromiumcodereview.appspot.com/10736042
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148031 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sql/connection.cc')
-rw-r--r-- | sql/connection.cc | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/sql/connection.cc b/sql/connection.cc index a9c4974..2d7baf2 100644 --- a/sql/connection.cc +++ b/sql/connection.cc @@ -61,6 +61,11 @@ Connection::StatementRef::StatementRef() stmt_(NULL) { } +Connection::StatementRef::StatementRef(sqlite3_stmt* stmt) + : connection_(NULL), + stmt_(stmt) { +} + Connection::StatementRef::StatementRef(Connection* connection, sqlite3_stmt* stmt) : connection_(connection), @@ -343,17 +348,32 @@ scoped_refptr<Connection::StatementRef> Connection::GetCachedStatement( scoped_refptr<Connection::StatementRef> Connection::GetUniqueStatement( const char* sql) { if (!db_) - return new StatementRef(this, NULL); // Return inactive statement. + return new StatementRef(); // Return inactive statement. sqlite3_stmt* stmt = NULL; if (sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL) != SQLITE_OK) { // This is evidence of a syntax error in the incoming SQL. DLOG(FATAL) << "SQL compile error " << GetErrorMessage(); - return new StatementRef(this, NULL); + return new StatementRef(); } return new StatementRef(this, stmt); } +scoped_refptr<Connection::StatementRef> Connection::GetUntrackedStatement( + const char* sql) const { + if (!db_) + return new StatementRef(); // Return inactive statement. + + sqlite3_stmt* stmt = NULL; + int rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + // This is evidence of a syntax error in the incoming SQL. + DLOG(FATAL) << "SQL compile error " << GetErrorMessage(); + return new StatementRef(); + } + return new StatementRef(stmt); +} + bool Connection::IsSQLValid(const char* sql) { sqlite3_stmt* stmt = NULL; if (sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL) != SQLITE_OK) @@ -373,11 +393,8 @@ bool Connection::DoesIndexExist(const char* index_name) const { bool Connection::DoesTableOrIndexExist( const char* name, const char* type) const { - // GetUniqueStatement can't be const since statements may modify the - // database, but we know ours doesn't modify it, so the cast is safe. - Statement statement(const_cast<Connection*>(this)->GetUniqueStatement( - "SELECT name FROM sqlite_master " - "WHERE type=? AND name=?")); + const char* kSql = "SELECT name FROM sqlite_master WHERE type=? AND name=?"; + Statement statement(GetUntrackedStatement(kSql)); statement.BindString(0, type); statement.BindString(1, name); @@ -390,10 +407,7 @@ bool Connection::DoesColumnExist(const char* table_name, sql.append(table_name); sql.append(")"); - // Our SQL is non-mutating, so this cast is OK. - Statement statement(const_cast<Connection*>(this)->GetUniqueStatement( - sql.c_str())); - + Statement statement(GetUntrackedStatement(sql.c_str())); while (statement.Step()) { if (!statement.ColumnString(1).compare(column_name)) return true; |