diff options
Diffstat (limited to 'sql/connection.cc')
-rw-r--r-- | sql/connection.cc | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/sql/connection.cc b/sql/connection.cc index f7fef12..26e71fd 100644 --- a/sql/connection.cc +++ b/sql/connection.cc @@ -132,7 +132,7 @@ void Connection::Close() { void Connection::Preload() { if (!db_) { - NOTREACHED(); + DLOG(FATAL) << "Cannot preload null db"; return; } @@ -142,7 +142,7 @@ void Connection::Preload() { if (!DoesTableExist("meta")) return; Statement dummy(GetUniqueStatement("SELECT * FROM meta")); - if (!dummy || !dummy.Step()) + if (!dummy.Step()) return; #if !defined(USE_SYSTEM_SQLITE) @@ -166,7 +166,7 @@ bool Connection::BeginTransaction() { needs_rollback_ = false; Statement begin(GetCachedStatement(SQL_FROM_HERE, "BEGIN TRANSACTION")); - if (!begin || !begin.Run()) + if (!begin.Run()) return false; } transaction_nesting_++; @@ -175,7 +175,7 @@ bool Connection::BeginTransaction() { void Connection::RollbackTransaction() { if (!transaction_nesting_) { - NOTREACHED() << "Rolling back a nonexistent transaction"; + DLOG(FATAL) << "Rolling back a nonexistent transaction"; return; } @@ -192,7 +192,7 @@ void Connection::RollbackTransaction() { bool Connection::CommitTransaction() { if (!transaction_nesting_) { - NOTREACHED() << "Rolling back a nonexistent transaction"; + DLOG(FATAL) << "Rolling back a nonexistent transaction"; return false; } transaction_nesting_--; @@ -208,15 +208,22 @@ bool Connection::CommitTransaction() { } Statement commit(GetCachedStatement(SQL_FROM_HERE, "COMMIT")); - if (!commit) - return false; return commit.Run(); } -bool Connection::Execute(const char* sql) { +int Connection::ExecuteAndReturnErrorCode(const char* sql) { if (!db_) return false; - return sqlite3_exec(db_, sql, NULL, NULL, NULL) == SQLITE_OK; + return sqlite3_exec(db_, sql, NULL, NULL, NULL); +} + +bool Connection::Execute(const char* sql) { + int error = ExecuteAndReturnErrorCode(sql); + // TODO(shess,gbillock): DLOG(FATAL) once Execute() clients are + // converted. + if (error == SQLITE_ERROR) + DLOG(ERROR) << "SQL Error in " << sql << ", " << GetErrorMessage(); + return error == SQLITE_OK; } bool Connection::ExecuteWithTimeout(const char* sql, base::TimeDelta timeout) { @@ -225,7 +232,7 @@ bool Connection::ExecuteWithTimeout(const char* sql, base::TimeDelta timeout) { ScopedBusyTimeout busy_timeout(db_); busy_timeout.SetTimeout(timeout); - return sqlite3_exec(db_, sql, NULL, NULL, NULL) == SQLITE_OK; + return Execute(sql); } bool Connection::HasCachedStatement(const StatementID& id) const { @@ -259,22 +266,28 @@ scoped_refptr<Connection::StatementRef> Connection::GetUniqueStatement( sqlite3_stmt* stmt = NULL; if (sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL) != SQLITE_OK) { - // Treat this as non-fatal, it can occur in a number of valid cases, and - // callers should be doing their own error handling. - DLOG(WARNING) << "SQL compile error " << GetErrorMessage(); + // 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(this, stmt); } +bool Connection::IsSQLValid(const char* sql) { + sqlite3_stmt* stmt = NULL; + if (sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL) != SQLITE_OK) + return false; + + sqlite3_finalize(stmt); + return true; +} + bool Connection::DoesTableExist(const char* table_name) 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='table' AND name=?")); - if (!statement) - return false; statement.BindString(0, table_name); return statement.Step(); // Table exists if any row was returned. } @@ -288,8 +301,6 @@ bool Connection::DoesColumnExist(const char* table_name, // Our SQL is non-mutating, so this cast is OK. Statement statement(const_cast<Connection*>(this)->GetUniqueStatement( sql.c_str())); - if (!statement) - return false; while (statement.Step()) { if (!statement.ColumnString(1).compare(column_name)) @@ -300,7 +311,7 @@ bool Connection::DoesColumnExist(const char* table_name, int64 Connection::GetLastInsertRowId() const { if (!db_) { - NOTREACHED(); + DLOG(FATAL) << "Illegal use of connection without a db"; return 0; } return sqlite3_last_insert_rowid(db_); @@ -308,7 +319,7 @@ int64 Connection::GetLastInsertRowId() const { int Connection::GetLastChangeCount() const { if (!db_) { - NOTREACHED(); + DLOG(FATAL) << "Illegal use of connection without a db"; return 0; } return sqlite3_changes(db_); @@ -339,7 +350,7 @@ const char* Connection::GetErrorMessage() const { bool Connection::OpenInternal(const std::string& file_name) { if (db_) { - NOTREACHED() << "sql::Connection is already open."; + DLOG(FATAL) << "sql::Connection is already open."; return false; } @@ -370,7 +381,7 @@ bool Connection::OpenInternal(const std::string& file_name) { // which requests exclusive locking but doesn't get it is almost // certain to be ill-tested. if (!Execute("PRAGMA locking_mode=EXCLUSIVE")) - NOTREACHED() << "Could not set locking mode: " << GetErrorMessage(); + DLOG(FATAL) << "Could not set locking mode: " << GetErrorMessage(); } const base::TimeDelta kBusyTimeout = @@ -384,17 +395,17 @@ bool Connection::OpenInternal(const std::string& file_name) { DCHECK_LE(page_size_, kSqliteMaxPageSize); const std::string sql = StringPrintf("PRAGMA page_size=%d", page_size_); if (!ExecuteWithTimeout(sql.c_str(), kBusyTimeout)) - NOTREACHED() << "Could not set page size: " << GetErrorMessage(); + DLOG(FATAL) << "Could not set page size: " << GetErrorMessage(); } if (cache_size_ != 0) { const std::string sql = StringPrintf("PRAGMA cache_size=%d", cache_size_); if (!ExecuteWithTimeout(sql.c_str(), kBusyTimeout)) - NOTREACHED() << "Could not set cache size: " << GetErrorMessage(); + DLOG(FATAL) << "Could not set cache size: " << GetErrorMessage(); } if (!ExecuteWithTimeout("PRAGMA secure_delete=ON", kBusyTimeout)) { - NOTREACHED() << "Could not enable secure_delete: " << GetErrorMessage(); + DLOG(FATAL) << "Could not enable secure_delete: " << GetErrorMessage(); Close(); return false; } @@ -404,8 +415,7 @@ bool Connection::OpenInternal(const std::string& file_name) { void Connection::DoRollback() { Statement rollback(GetCachedStatement(SQL_FROM_HERE, "ROLLBACK")); - if (rollback) - rollback.Run(); + rollback.Run(); } void Connection::StatementRefCreated(StatementRef* ref) { @@ -416,7 +426,7 @@ void Connection::StatementRefCreated(StatementRef* ref) { void Connection::StatementRefDeleted(StatementRef* ref) { StatementRefSet::iterator i = open_statements_.find(ref); if (i == open_statements_.end()) - NOTREACHED(); + DLOG(FATAL) << "Could not find statement"; else open_statements_.erase(i); } @@ -436,7 +446,7 @@ int Connection::OnSqliteError(int err, sql::Statement *stmt) { if (error_delegate_.get()) return error_delegate_->OnError(err, this, stmt); // The default handling is to assert on debug and to ignore on release. - NOTREACHED() << GetErrorMessage(); + DLOG(FATAL) << GetErrorMessage(); return err; } |