OLD | NEW |
---|---|
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 <stdint.h> | 8 #include <stdint.h> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/callback.h" | 14 #include "base/callback.h" |
15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
19 #include "base/threading/thread_restrictions.h" | 19 #include "base/threading/thread_restrictions.h" |
20 #include "base/time/time.h" | 20 #include "base/time/time.h" |
21 #include "sql/sql_export.h" | 21 #include "sql/sql_export.h" |
22 | 22 |
23 struct sqlite3; | 23 struct sqlite3; |
24 struct sqlite3_stmt; | 24 struct sqlite3_stmt; |
25 | 25 |
26 namespace base { | 26 namespace base { |
27 class FilePath; | 27 class FilePath; |
28 class HistogramBase; | |
28 } | 29 } |
29 | 30 |
30 namespace sql { | 31 namespace sql { |
31 | 32 |
32 class Recovery; | 33 class Recovery; |
33 class Statement; | 34 class Statement; |
34 | 35 |
36 // To allow some test classes to be friended. | |
37 namespace test { | |
38 class ScopedScalarFunction; | |
39 class ScopedCommitHook; | |
40 } | |
rmcilroy
2015/05/21 22:54:48
AFAIK friended classes don't need to be declared (
Scott Hess - ex-Googler
2015/05/21 23:42:37
"no class named ..." error. It may be because of
rmcilroy
2015/05/22 08:48:23
Interesting, good to know.
| |
41 | |
35 // Uniquely identifies a statement. There are two modes of operation: | 42 // Uniquely identifies a statement. There are two modes of operation: |
36 // | 43 // |
37 // - In the most common mode, you will use the source file and line number to | 44 // - In the most common mode, you will use the source file and line number to |
38 // identify your statement. This is a convienient way to get uniqueness for | 45 // identify your statement. This is a convienient way to get uniqueness for |
39 // a statement that is only used in one place. Use the SQL_FROM_HERE macro | 46 // a statement that is only used in one place. Use the SQL_FROM_HERE macro |
40 // to generate a StatementID. | 47 // to generate a StatementID. |
41 // | 48 // |
42 // - In the "custom" mode you may use the statement from different places or | 49 // - In the "custom" mode you may use the statement from different places or |
43 // need to manage it yourself for whatever reason. In this case, you should | 50 // need to manage it yourself for whatever reason. In this case, you should |
44 // make up your own unique name and pass it to the StatementID. This name | 51 // make up your own unique name and pass it to the StatementID. This name |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 void set_error_callback(const ErrorCallback& callback) { | 140 void set_error_callback(const ErrorCallback& callback) { |
134 error_callback_ = callback; | 141 error_callback_ = callback; |
135 } | 142 } |
136 bool has_error_callback() const { | 143 bool has_error_callback() const { |
137 return !error_callback_.is_null(); | 144 return !error_callback_.is_null(); |
138 } | 145 } |
139 void reset_error_callback() { | 146 void reset_error_callback() { |
140 error_callback_.Reset(); | 147 error_callback_.Reset(); |
141 } | 148 } |
142 | 149 |
143 // Set this tag to enable additional connection-type histogramming | 150 // Set this to enable additional per-connection histogramming. Must be called |
144 // for SQLite error codes and database version numbers. | 151 // before Open(). |
145 void set_histogram_tag(const std::string& tag) { | 152 void set_histogram_tag(const std::string& tag); |
146 histogram_tag_ = tag; | |
147 } | |
148 | 153 |
149 // Record a sparse UMA histogram sample under | 154 // Record a sparse UMA histogram sample under |
150 // |name|+"."+|histogram_tag_|. If |histogram_tag_| is empty, no | 155 // |name|+"."+|histogram_tag_|. If |histogram_tag_| is empty, no |
151 // histogram is recorded. | 156 // histogram is recorded. |
152 void AddTaggedHistogram(const std::string& name, size_t sample) const; | 157 void AddTaggedHistogram(const std::string& name, size_t sample) const; |
153 | 158 |
159 // Track various API calls and results. | |
160 enum Events { | |
161 // Number of statements run, either with sql::Statement or Execute*(). | |
162 EVENT_STATEMENT_RUN = 0, | |
163 | |
164 // Number of rows returned by statements run. | |
165 EVENT_STATEMENT_ROWS, | |
166 | |
167 // Number of statements successfully run (all steps returned SQLITE_DONE or | |
168 // SQLITE_ROW). | |
169 EVENT_STATEMENT_SUCCESS, | |
170 | |
171 // Number of statements run by Execute() or ExecuteAndReturnErrorCode(). | |
172 EVENT_EXECUTE, | |
173 | |
174 // Number of rows changed by autocommit statements. | |
175 EVENT_CHANGES_AUTOCOMMIT, | |
176 | |
177 // Number of rows changed by statements in transactions. | |
178 EVENT_CHANGES, | |
179 | |
180 // Count actual SQLite transaction statements (not including nesting). | |
181 EVENT_BEGIN, | |
182 EVENT_COMMIT, | |
183 EVENT_ROLLBACK, | |
184 | |
185 // Leave this at the end. | |
186 // TODO(shess): |EVENT_MAX| causes compile fail on Windows. | |
187 EVENT_MX | |
188 }; | |
189 void RecordEvent(Events event, size_t count); | |
190 void RecordOneEvent(Events event) { | |
191 RecordEvent(event, 1); | |
192 } | |
193 | |
154 // Run "PRAGMA integrity_check" and post each line of | 194 // Run "PRAGMA integrity_check" and post each line of |
155 // results into |messages|. Returns the success of running the | 195 // results into |messages|. Returns the success of running the |
156 // statement - per the SQLite documentation, if no errors are found the | 196 // statement - per the SQLite documentation, if no errors are found the |
157 // call should succeed, and a single value "ok" should be in messages. | 197 // call should succeed, and a single value "ok" should be in messages. |
158 bool FullIntegrityCheck(std::vector<std::string>* messages); | 198 bool FullIntegrityCheck(std::vector<std::string>* messages); |
159 | 199 |
160 // Runs "PRAGMA quick_check" and, unlike the FullIntegrityCheck method, | 200 // Runs "PRAGMA quick_check" and, unlike the FullIntegrityCheck method, |
161 // interprets the results returning true if the the statement executes | 201 // interprets the results returning true if the the statement executes |
162 // without error and results in a single "ok" value. | 202 // without error and results in a single "ok" value. |
163 bool QuickIntegrityCheck() WARN_UNUSED_RESULT; | 203 bool QuickIntegrityCheck() WARN_UNUSED_RESULT; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
408 // For recovery module. | 448 // For recovery module. |
409 friend class Recovery; | 449 friend class Recovery; |
410 | 450 |
411 // Allow test-support code to set/reset error ignorer. | 451 // Allow test-support code to set/reset error ignorer. |
412 friend class ScopedErrorIgnorer; | 452 friend class ScopedErrorIgnorer; |
413 | 453 |
414 // Statement accesses StatementRef which we don't want to expose to everybody | 454 // Statement accesses StatementRef which we don't want to expose to everybody |
415 // (they should go through Statement). | 455 // (they should go through Statement). |
416 friend class Statement; | 456 friend class Statement; |
417 | 457 |
458 friend class test::ScopedScalarFunction; | |
459 friend class test::ScopedCommitHook; | |
460 | |
418 // Internal initialize function used by both Init and InitInMemory. The file | 461 // Internal initialize function used by both Init and InitInMemory. The file |
419 // name is always 8 bits since we want to use the 8-bit version of | 462 // name is always 8 bits since we want to use the 8-bit version of |
420 // sqlite3_open. The string can also be sqlite's special ":memory:" string. | 463 // sqlite3_open. The string can also be sqlite's special ":memory:" string. |
421 // | 464 // |
422 // |retry_flag| controls retrying the open if the error callback | 465 // |retry_flag| controls retrying the open if the error callback |
423 // addressed errors using RazeAndClose(). | 466 // addressed errors using RazeAndClose(). |
424 enum Retry { | 467 enum Retry { |
425 NO_RETRY = 0, | 468 NO_RETRY = 0, |
426 RETRY_ON_POISON | 469 RETRY_ON_POISON |
427 }; | 470 }; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
541 // allowing this function to be const. Open statements can block | 584 // allowing this function to be const. Open statements can block |
542 // closing the database, so only use in cases where the last ref is | 585 // closing the database, so only use in cases where the last ref is |
543 // released before close could be called (which should always be the | 586 // released before close could be called (which should always be the |
544 // case for const functions). | 587 // case for const functions). |
545 scoped_refptr<StatementRef> GetUntrackedStatement(const char* sql) const; | 588 scoped_refptr<StatementRef> GetUntrackedStatement(const char* sql) const; |
546 | 589 |
547 bool IntegrityCheckHelper( | 590 bool IntegrityCheckHelper( |
548 const char* pragma_sql, | 591 const char* pragma_sql, |
549 std::vector<std::string>* messages) WARN_UNUSED_RESULT; | 592 std::vector<std::string>* messages) WARN_UNUSED_RESULT; |
550 | 593 |
594 // Record time spent executing explicit COMMIT statements. | |
595 void CommitTime(const base::TimeDelta& delta); | |
rmcilroy
2015/05/21 22:54:48
I think it would be clearer with "Record" prefixed
Scott Hess - ex-Googler
2015/05/21 23:42:37
Done.
| |
596 | |
597 // Record time in DML (Data Manipulation Language) statements such as INSERT | |
598 // or UPDATE outside of an explicit transaction. Due to implementation | |
599 // limitations time spent on DDL (Data Definition Language) statements such as | |
600 // ALTER and CREATE is not included. | |
601 void AutoCommitTime(const base::TimeDelta& delta); | |
602 | |
603 // Record all time spent on updating the database. This includes CommitTime() | |
604 // and AutoCommitTime(), plus any time spent spilling to the journal if | |
605 // transactions do not fit in cache. | |
606 void UpdateTime(const base::TimeDelta& delta); | |
607 | |
608 // Record all time spent running statements, including time spent doing | |
609 // updates and time spent on read-only queries. | |
610 void QueryTime(const base::TimeDelta& delta); | |
611 | |
612 // Record |delta| as query time if |read_only| (from sqlite3_stmt_readonly) is | |
613 // true, autocommit time if the database is not in a transaction, or update | |
614 // time if the database is in a transaction. Also records change count to | |
615 // EVENT_CHANGES_AUTOCOMMIT or EVENT_CHANGES_COMMIT. | |
616 void ChangeHelper(const base::TimeDelta& delta, bool read_only); | |
rmcilroy
2015/05/21 22:54:48
nit - maybe RecordTimeAndChangesHelper?
Scott Hess - ex-Googler
2015/05/21 23:42:37
Went with RecordTimeAndChanges(), helper seems red
rmcilroy
2015/05/22 08:48:23
SGTM!
| |
617 | |
551 // The actual sqlite database. Will be NULL before Init has been called or if | 618 // The actual sqlite database. Will be NULL before Init has been called or if |
552 // Init resulted in an error. | 619 // Init resulted in an error. |
553 sqlite3* db_; | 620 sqlite3* db_; |
554 | 621 |
555 // Parameters we'll configure in sqlite before doing anything else. Zero means | 622 // Parameters we'll configure in sqlite before doing anything else. Zero means |
556 // use the default value. | 623 // use the default value. |
557 int page_size_; | 624 int page_size_; |
558 int cache_size_; | 625 int cache_size_; |
559 bool exclusive_locking_; | 626 bool exclusive_locking_; |
560 bool restrict_to_user_; | 627 bool restrict_to_user_; |
(...skipping 26 matching lines...) Expand all Loading... | |
587 // to enable diagnostics to distinguish calls to never-opened | 654 // to enable diagnostics to distinguish calls to never-opened |
588 // databases (incorrect use of the API) from calls to once-valid | 655 // databases (incorrect use of the API) from calls to once-valid |
589 // databases. | 656 // databases. |
590 bool poisoned_; | 657 bool poisoned_; |
591 | 658 |
592 ErrorCallback error_callback_; | 659 ErrorCallback error_callback_; |
593 | 660 |
594 // Tag for auxiliary histograms. | 661 // Tag for auxiliary histograms. |
595 std::string histogram_tag_; | 662 std::string histogram_tag_; |
596 | 663 |
664 // Linear histogram for RecordEvent(). | |
665 base::HistogramBase* stats_histogram_; | |
666 | |
667 // Histogram for tracking time taken in commit. | |
668 base::HistogramBase* commit_time_histogram_; | |
669 | |
670 // Histogram for tracking time taken in autocommit updates. | |
671 base::HistogramBase* autocommit_time_histogram_; | |
672 | |
673 // Histogram for tracking time taken in updates (including commit and | |
674 // autocommit). | |
675 base::HistogramBase* update_time_histogram_; | |
676 | |
677 // Histogram for tracking time taken in all queries. | |
678 base::HistogramBase* query_time_histogram_; | |
679 | |
597 DISALLOW_COPY_AND_ASSIGN(Connection); | 680 DISALLOW_COPY_AND_ASSIGN(Connection); |
598 }; | 681 }; |
599 | 682 |
600 } // namespace sql | 683 } // namespace sql |
601 | 684 |
602 #endif // SQL_CONNECTION_H_ | 685 #endif // SQL_CONNECTION_H_ |
OLD | NEW |