Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(400)

Side by Side Diff: sql/connection.h

Issue 12096073: Implement sql::Connection::RazeAndClose(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Disable DEATH test on android and ios. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/net/sqlite_persistent_cookie_store.cc ('k') | sql/connection.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef SQL_CONNECTION_H_ 5 #ifndef SQL_CONNECTION_H_
6 #define SQL_CONNECTION_H_ 6 #define SQL_CONNECTION_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 157
158 // Initializes the SQL connection for the given file, returning true if the 158 // Initializes the SQL connection for the given file, returning true if the
159 // file could be opened. You can call this or OpenInMemory. 159 // file could be opened. You can call this or OpenInMemory.
160 bool Open(const base::FilePath& path) WARN_UNUSED_RESULT; 160 bool Open(const base::FilePath& path) WARN_UNUSED_RESULT;
161 161
162 // Initializes the SQL connection for a temporary in-memory database. There 162 // Initializes the SQL connection for a temporary in-memory database. There
163 // will be no associated file on disk, and the initial database will be 163 // will be no associated file on disk, and the initial database will be
164 // empty. You can call this or Open. 164 // empty. You can call this or Open.
165 bool OpenInMemory() WARN_UNUSED_RESULT; 165 bool OpenInMemory() WARN_UNUSED_RESULT;
166 166
167 // Returns trie if the database has been successfully opened. 167 // Returns true if the database has been successfully opened.
168 bool is_open() const { return !!db_; } 168 bool is_open() const { return !!db_; }
169 169
170 // Closes the database. This is automatically performed on destruction for 170 // Closes the database. This is automatically performed on destruction for
171 // you, but this allows you to close the database early. You must not call 171 // you, but this allows you to close the database early. You must not call
172 // any other functions after closing it. It is permissable to call Close on 172 // any other functions after closing it. It is permissable to call Close on
173 // an uninitialized or already-closed database. 173 // an uninitialized or already-closed database.
174 void Close(); 174 void Close();
175 175
176 // Pre-loads the first <cache-size> pages into the cache from the file. 176 // Pre-loads the first <cache-size> pages into the cache from the file.
177 // If you expect to soon use a substantial portion of the database, this 177 // If you expect to soon use a substantial portion of the database, this
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 // 214 //
215 // NOTE(shess): For Android, SQLITE_DEFAULT_AUTOVACUUM is set to 1, 215 // NOTE(shess): For Android, SQLITE_DEFAULT_AUTOVACUUM is set to 1,
216 // so Raze() sets auto_vacuum to 1. 216 // so Raze() sets auto_vacuum to 1.
217 // 217 //
218 // TODO(shess): Raze() needs a connection so cannot clear SQLITE_NOTADB. 218 // TODO(shess): Raze() needs a connection so cannot clear SQLITE_NOTADB.
219 // TODO(shess): Bake auto_vacuum into Connection's API so it can 219 // TODO(shess): Bake auto_vacuum into Connection's API so it can
220 // just pick up the default. 220 // just pick up the default.
221 bool Raze(); 221 bool Raze();
222 bool RazeWithTimout(base::TimeDelta timeout); 222 bool RazeWithTimout(base::TimeDelta timeout);
223 223
224 // Breaks all outstanding transactions (as initiated by
225 // BeginTransaction()), calls Raze() to destroy the database, then
226 // closes the database. After this is called, any operations
227 // against the connections (or statements prepared by the
228 // connection) should fail safely.
229 //
230 // The value from Raze() is returned, with Close() called in all
231 // cases.
232 bool RazeAndClose();
233
224 // Transactions -------------------------------------------------------------- 234 // Transactions --------------------------------------------------------------
225 235
226 // Transaction management. We maintain a virtual transaction stack to emulate 236 // Transaction management. We maintain a virtual transaction stack to emulate
227 // nested transactions since sqlite can't do nested transactions. The 237 // nested transactions since sqlite can't do nested transactions. The
228 // limitation is you can't roll back a sub transaction: if any transaction 238 // limitation is you can't roll back a sub transaction: if any transaction
229 // fails, all transactions open will also be rolled back. Any nested 239 // fails, all transactions open will also be rolled back. Any nested
230 // transactions after one has rolled back will return fail for Begin(). If 240 // transactions after one has rolled back will return fail for Begin(). If
231 // Begin() fails, you must not call Commit or Rollback(). 241 // Begin() fails, you must not call Commit or Rollback().
232 // 242 //
233 // Normally you should use sql::Transaction to manage a transaction, which 243 // Normally you should use sql::Transaction to manage a transaction, which
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 private: 344 private:
335 // Statement accesses StatementRef which we don't want to expose to everybody 345 // Statement accesses StatementRef which we don't want to expose to everybody
336 // (they should go through Statement). 346 // (they should go through Statement).
337 friend class Statement; 347 friend class Statement;
338 348
339 // Internal initialize function used by both Init and InitInMemory. The file 349 // Internal initialize function used by both Init and InitInMemory. The file
340 // name is always 8 bits since we want to use the 8-bit version of 350 // name is always 8 bits since we want to use the 8-bit version of
341 // sqlite3_open. The string can also be sqlite's special ":memory:" string. 351 // sqlite3_open. The string can also be sqlite's special ":memory:" string.
342 bool OpenInternal(const std::string& file_name); 352 bool OpenInternal(const std::string& file_name);
343 353
354 // Internal close function used by Close() and RazeAndClose().
355 // |forced| indicates that orderly-shutdown checks should not apply.
356 void CloseInternal(bool forced);
357
344 // Check whether the current thread is allowed to make IO calls, but only 358 // Check whether the current thread is allowed to make IO calls, but only
345 // if database wasn't open in memory. Function is inlined to be a no-op in 359 // if database wasn't open in memory. Function is inlined to be a no-op in
346 // official build. 360 // official build.
347 void AssertIOAllowed() { 361 void AssertIOAllowed() {
348 if (!in_memory_) 362 if (!in_memory_)
349 base::ThreadRestrictions::AssertIOAllowed(); 363 base::ThreadRestrictions::AssertIOAllowed();
350 } 364 }
351 365
352 // Internal helper for DoesTableExist and DoesIndexExist. 366 // Internal helper for DoesTableExist and DoesIndexExist.
353 bool DoesTableOrIndexExist(const char* name, const char* type) const; 367 bool DoesTableOrIndexExist(const char* name, const char* type) const;
354 368
355 // A StatementRef is a refcounted wrapper around a sqlite statement pointer. 369 // A StatementRef is a refcounted wrapper around a sqlite statement pointer.
356 // Refcounting allows us to give these statements out to sql::Statement 370 // Refcounting allows us to give these statements out to sql::Statement
357 // objects while also optionally maintaining a cache of compiled statements 371 // objects while also optionally maintaining a cache of compiled statements
358 // by just keeping a refptr to these objects. 372 // by just keeping a refptr to these objects.
359 // 373 //
360 // A statement ref can be valid, in which case it can be used, or invalid to 374 // A statement ref can be valid, in which case it can be used, or invalid to
361 // indicate that the statement hasn't been created yet, has an error, or has 375 // indicate that the statement hasn't been created yet, has an error, or has
362 // been destroyed. 376 // been destroyed.
363 // 377 //
364 // The Connection may revoke a StatementRef in some error cases, so callers 378 // The Connection may revoke a StatementRef in some error cases, so callers
365 // should always check validity before using. 379 // should always check validity before using.
366 class SQL_EXPORT StatementRef : public base::RefCounted<StatementRef> { 380 class SQL_EXPORT StatementRef : public base::RefCounted<StatementRef> {
367 public: 381 public:
368 // Default constructor initializes to an invalid statement. 382 // |connection| is the sql::Connection instance associated with
369 StatementRef(); 383 // the statement, and is used for tracking outstanding statements
370 explicit StatementRef(sqlite3_stmt* stmt); 384 // and for error handling. Set to NULL for invalid or untracked
371 StatementRef(Connection* connection, sqlite3_stmt* stmt); 385 // refs. |stmt| is the actual statement, and should only be NULL
386 // to create an invalid ref. |was_valid| indicates whether the
387 // statement should be considered valid for diagnistic purposes.
388 // |was_valid| can be true for NULL |stmt| if the connection has
389 // been forcibly closed by an error handler.
390 StatementRef(Connection* connection, sqlite3_stmt* stmt, bool was_valid);
372 391
373 // When true, the statement can be used. 392 // When true, the statement can be used.
374 bool is_valid() const { return !!stmt_; } 393 bool is_valid() const { return !!stmt_; }
375 394
395 // When true, the statement is either currently valid, or was
396 // previously valid but the connection was forcibly closed. Used
397 // for diagnostic checks.
398 bool was_valid() const { return was_valid_; }
399
376 // If we've not been linked to a connection, this will be NULL. 400 // If we've not been linked to a connection, this will be NULL.
377 // TODO(shess): connection_ can be NULL in case of GetUntrackedStatement(), 401 // TODO(shess): connection_ can be NULL in case of GetUntrackedStatement(),
378 // which prevents Statement::OnError() from forwarding errors. 402 // which prevents Statement::OnError() from forwarding errors.
379 Connection* connection() const { return connection_; } 403 Connection* connection() const { return connection_; }
380 404
381 // Returns the sqlite statement if any. If the statement is not active, 405 // Returns the sqlite statement if any. If the statement is not active,
382 // this will return NULL. 406 // this will return NULL.
383 sqlite3_stmt* stmt() const { return stmt_; } 407 sqlite3_stmt* stmt() const { return stmt_; }
384 408
385 // Destroys the compiled statement and marks it NULL. The statement will 409 // Destroys the compiled statement and marks it NULL. The statement will
386 // no longer be active. 410 // no longer be active. |forced| is used to indicate if orderly-shutdown
387 void Close(); 411 // checks should apply (see Connection::RazeAndClose()).
412 void Close(bool forced);
388 413
389 // Check whether the current thread is allowed to make IO calls, but only 414 // Check whether the current thread is allowed to make IO calls, but only
390 // if database wasn't open in memory. 415 // if database wasn't open in memory.
391 void AssertIOAllowed() { if (connection_) connection_->AssertIOAllowed(); } 416 void AssertIOAllowed() { if (connection_) connection_->AssertIOAllowed(); }
392 417
393 private: 418 private:
394 friend class base::RefCounted<StatementRef>; 419 friend class base::RefCounted<StatementRef>;
395 420
396 ~StatementRef(); 421 ~StatementRef();
397 422
398 Connection* connection_; 423 Connection* connection_;
399 sqlite3_stmt* stmt_; 424 sqlite3_stmt* stmt_;
425 bool was_valid_;
400 426
401 DISALLOW_COPY_AND_ASSIGN(StatementRef); 427 DISALLOW_COPY_AND_ASSIGN(StatementRef);
402 }; 428 };
403 friend class StatementRef; 429 friend class StatementRef;
404 430
405 // Executes a rollback statement, ignoring all transaction state. Used 431 // Executes a rollback statement, ignoring all transaction state. Used
406 // internally in the transaction management code. 432 // internally in the transaction management code.
407 void DoRollback(); 433 void DoRollback();
408 434
409 // Called by a StatementRef when it's being created or destroyed. See 435 // Called by a StatementRef when it's being created or destroyed. See
410 // open_statements_ below. 436 // open_statements_ below.
411 void StatementRefCreated(StatementRef* ref); 437 void StatementRefCreated(StatementRef* ref);
412 void StatementRefDeleted(StatementRef* ref); 438 void StatementRefDeleted(StatementRef* ref);
413 439
414 // Frees all cached statements from statement_cache_.
415 void ClearCache();
416
417 // Called by Statement objects when an sqlite function returns an error. 440 // Called by Statement objects when an sqlite function returns an error.
418 // The return value is the error code reflected back to client code. 441 // The return value is the error code reflected back to client code.
419 int OnSqliteError(int err, Statement* stmt); 442 int OnSqliteError(int err, Statement* stmt);
420 443
421 // Like |Execute()|, but retries if the database is locked. 444 // Like |Execute()|, but retries if the database is locked.
422 bool ExecuteWithTimeout(const char* sql, base::TimeDelta ms_timeout) 445 bool ExecuteWithTimeout(const char* sql, base::TimeDelta ms_timeout)
423 WARN_UNUSED_RESULT; 446 WARN_UNUSED_RESULT;
424 447
425 // Internal helper for const functions. Like GetUniqueStatement(), 448 // Internal helper for const functions. Like GetUniqueStatement(),
426 // except the statement is not entered into open_statements_, 449 // except the statement is not entered into open_statements_,
(...skipping 30 matching lines...) Expand all
457 480
458 // True if any of the currently nested transactions have been rolled back. 481 // True if any of the currently nested transactions have been rolled back.
459 // When we get to the outermost transaction, this will determine if we do 482 // When we get to the outermost transaction, this will determine if we do
460 // a rollback instead of a commit. 483 // a rollback instead of a commit.
461 bool needs_rollback_; 484 bool needs_rollback_;
462 485
463 // True if database is open with OpenInMemory(), False if database is open 486 // True if database is open with OpenInMemory(), False if database is open
464 // with Open(). 487 // with Open().
465 bool in_memory_; 488 bool in_memory_;
466 489
490 // |true| if the connection was closed using RazeAndClose(). Used
491 // to enable diagnostics to distinguish calls to never-opened
492 // databases (incorrect use of the API) from calls to once-valid
493 // databases.
494 bool poisoned_;
495
467 // This object handles errors resulting from all forms of executing sqlite 496 // This object handles errors resulting from all forms of executing sqlite
468 // commands or statements. It can be null which means default handling. 497 // commands or statements. It can be null which means default handling.
469 scoped_ptr<ErrorDelegate> error_delegate_; 498 scoped_ptr<ErrorDelegate> error_delegate_;
470 499
471 // Auxiliary error-code histogram. 500 // Auxiliary error-code histogram.
472 std::string error_histogram_name_; 501 std::string error_histogram_name_;
473 502
474 DISALLOW_COPY_AND_ASSIGN(Connection); 503 DISALLOW_COPY_AND_ASSIGN(Connection);
475 }; 504 };
476 505
477 } // namespace sql 506 } // namespace sql
478 507
479 #endif // SQL_CONNECTION_H_ 508 #endif // SQL_CONNECTION_H_
OLDNEW
« no previous file with comments | « chrome/browser/net/sqlite_persistent_cookie_store.cc ('k') | sql/connection.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698