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 ScopedCommitHook; | |
39 class ScopedScalarFunction; | |
40 class ScopedMockTimeSource; | |
41 } | |
42 | |
35 // Uniquely identifies a statement. There are two modes of operation: | 43 // Uniquely identifies a statement. There are two modes of operation: |
36 // | 44 // |
37 // - In the most common mode, you will use the source file and line number to | 45 // - 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 | 46 // 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 | 47 // a statement that is only used in one place. Use the SQL_FROM_HERE macro |
40 // to generate a StatementID. | 48 // to generate a StatementID. |
41 // | 49 // |
42 // - In the "custom" mode you may use the statement from different places or | 50 // - 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 | 51 // 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 | 52 // make up your own unique name and pass it to the StatementID. This name |
(...skipping 28 matching lines...) Expand all Loading... | |
73 | 81 |
74 private: | 82 private: |
75 int number_; | 83 int number_; |
76 const char* str_; | 84 const char* str_; |
77 }; | 85 }; |
78 | 86 |
79 #define SQL_FROM_HERE sql::StatementID(__FILE__, __LINE__) | 87 #define SQL_FROM_HERE sql::StatementID(__FILE__, __LINE__) |
80 | 88 |
81 class Connection; | 89 class Connection; |
82 | 90 |
91 // Abstract the source of timing information for metrics (RecordCommitTime, etc) | |
92 // to allow testing control. | |
93 class SQL_EXPORT TimeSource { | |
94 public: | |
95 TimeSource() {} | |
96 virtual ~TimeSource() {} | |
97 | |
98 // Return the current time (by default base::TimeTicks::Now()). | |
99 virtual base::TimeTicks Now(); | |
100 | |
101 private: | |
102 DISALLOW_COPY_AND_ASSIGN(TimeSource); | |
103 }; | |
104 | |
83 class SQL_EXPORT Connection { | 105 class SQL_EXPORT Connection { |
84 private: | 106 private: |
85 class StatementRef; // Forward declaration, see real one below. | 107 class StatementRef; // Forward declaration, see real one below. |
86 | 108 |
87 public: | 109 public: |
88 // The database is opened by calling Open[InMemory](). Any uncommitted | 110 // The database is opened by calling Open[InMemory](). Any uncommitted |
89 // transactions will be rolled back when this object is deleted. | 111 // transactions will be rolled back when this object is deleted. |
90 Connection(); | 112 Connection(); |
91 ~Connection(); | 113 ~Connection(); |
92 | 114 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 void set_error_callback(const ErrorCallback& callback) { | 155 void set_error_callback(const ErrorCallback& callback) { |
134 error_callback_ = callback; | 156 error_callback_ = callback; |
135 } | 157 } |
136 bool has_error_callback() const { | 158 bool has_error_callback() const { |
137 return !error_callback_.is_null(); | 159 return !error_callback_.is_null(); |
138 } | 160 } |
139 void reset_error_callback() { | 161 void reset_error_callback() { |
140 error_callback_.Reset(); | 162 error_callback_.Reset(); |
141 } | 163 } |
142 | 164 |
143 // Set this tag to enable additional connection-type histogramming | 165 // Set this to enable additional per-connection histogramming. Must be called |
144 // for SQLite error codes and database version numbers. | 166 // before Open(). |
145 void set_histogram_tag(const std::string& tag) { | 167 void set_histogram_tag(const std::string& tag); |
146 histogram_tag_ = tag; | |
147 } | |
148 | 168 |
149 // Record a sparse UMA histogram sample under | 169 // Record a sparse UMA histogram sample under |
150 // |name|+"."+|histogram_tag_|. If |histogram_tag_| is empty, no | 170 // |name|+"."+|histogram_tag_|. If |histogram_tag_| is empty, no |
151 // histogram is recorded. | 171 // histogram is recorded. |
152 void AddTaggedHistogram(const std::string& name, size_t sample) const; | 172 void AddTaggedHistogram(const std::string& name, size_t sample) const; |
153 | 173 |
174 // Track various API calls and results. | |
Alexei Svitkine (slow)
2015/06/02 21:29:51
Nit: Mention that these are used in UMA and so sho
Scott Hess - ex-Googler
2015/06/02 22:13:44
Done.
| |
175 enum Events { | |
176 // Number of statements run, either with sql::Statement or Execute*(). | |
177 EVENT_STATEMENT_RUN = 0, | |
178 | |
179 // Number of rows returned by statements run. | |
180 EVENT_STATEMENT_ROWS, | |
181 | |
182 // Number of statements successfully run (all steps returned SQLITE_DONE or | |
183 // SQLITE_ROW). | |
184 EVENT_STATEMENT_SUCCESS, | |
185 | |
186 // Number of statements run by Execute() or ExecuteAndReturnErrorCode(). | |
187 EVENT_EXECUTE, | |
188 | |
189 // Number of rows changed by autocommit statements. | |
190 EVENT_CHANGES_AUTOCOMMIT, | |
191 | |
192 // Number of rows changed by statements in transactions. | |
193 EVENT_CHANGES, | |
194 | |
195 // Count actual SQLite transaction statements (not including nesting). | |
196 EVENT_BEGIN, | |
197 EVENT_COMMIT, | |
198 EVENT_ROLLBACK, | |
199 | |
200 // Leave this at the end. | |
201 // TODO(shess): |EVENT_MAX| causes compile fail on Windows. | |
202 EVENT_MX | |
Alexei Svitkine (slow)
2015/06/02 21:29:51
Nit: How about EVENT_MAX_VALUE or EVENT_HISTOGRAM_
Scott Hess - ex-Googler
2015/06/02 22:13:44
Done. Main reason was not to have to reflow a cou
| |
203 }; | |
204 void RecordEvent(Events event, size_t count); | |
205 void RecordOneEvent(Events event) { | |
206 RecordEvent(event, 1); | |
207 } | |
208 | |
154 // Run "PRAGMA integrity_check" and post each line of | 209 // Run "PRAGMA integrity_check" and post each line of |
155 // results into |messages|. Returns the success of running the | 210 // results into |messages|. Returns the success of running the |
156 // statement - per the SQLite documentation, if no errors are found the | 211 // statement - per the SQLite documentation, if no errors are found the |
157 // call should succeed, and a single value "ok" should be in messages. | 212 // call should succeed, and a single value "ok" should be in messages. |
158 bool FullIntegrityCheck(std::vector<std::string>* messages); | 213 bool FullIntegrityCheck(std::vector<std::string>* messages); |
159 | 214 |
160 // Runs "PRAGMA quick_check" and, unlike the FullIntegrityCheck method, | 215 // Runs "PRAGMA quick_check" and, unlike the FullIntegrityCheck method, |
161 // interprets the results returning true if the the statement executes | 216 // interprets the results returning true if the the statement executes |
162 // without error and results in a single "ok" value. | 217 // without error and results in a single "ok" value. |
163 bool QuickIntegrityCheck() WARN_UNUSED_RESULT; | 218 bool QuickIntegrityCheck() WARN_UNUSED_RESULT; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
408 // For recovery module. | 463 // For recovery module. |
409 friend class Recovery; | 464 friend class Recovery; |
410 | 465 |
411 // Allow test-support code to set/reset error ignorer. | 466 // Allow test-support code to set/reset error ignorer. |
412 friend class ScopedErrorIgnorer; | 467 friend class ScopedErrorIgnorer; |
413 | 468 |
414 // Statement accesses StatementRef which we don't want to expose to everybody | 469 // Statement accesses StatementRef which we don't want to expose to everybody |
415 // (they should go through Statement). | 470 // (they should go through Statement). |
416 friend class Statement; | 471 friend class Statement; |
417 | 472 |
473 friend class test::ScopedCommitHook; | |
474 friend class test::ScopedScalarFunction; | |
475 friend class test::ScopedMockTimeSource; | |
476 | |
418 // Internal initialize function used by both Init and InitInMemory. The file | 477 // 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 | 478 // 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. | 479 // sqlite3_open. The string can also be sqlite's special ":memory:" string. |
421 // | 480 // |
422 // |retry_flag| controls retrying the open if the error callback | 481 // |retry_flag| controls retrying the open if the error callback |
423 // addressed errors using RazeAndClose(). | 482 // addressed errors using RazeAndClose(). |
424 enum Retry { | 483 enum Retry { |
425 NO_RETRY = 0, | 484 NO_RETRY = 0, |
426 RETRY_ON_POISON | 485 RETRY_ON_POISON |
427 }; | 486 }; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
541 // allowing this function to be const. Open statements can block | 600 // allowing this function to be const. Open statements can block |
542 // closing the database, so only use in cases where the last ref is | 601 // 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 | 602 // released before close could be called (which should always be the |
544 // case for const functions). | 603 // case for const functions). |
545 scoped_refptr<StatementRef> GetUntrackedStatement(const char* sql) const; | 604 scoped_refptr<StatementRef> GetUntrackedStatement(const char* sql) const; |
546 | 605 |
547 bool IntegrityCheckHelper( | 606 bool IntegrityCheckHelper( |
548 const char* pragma_sql, | 607 const char* pragma_sql, |
549 std::vector<std::string>* messages) WARN_UNUSED_RESULT; | 608 std::vector<std::string>* messages) WARN_UNUSED_RESULT; |
550 | 609 |
610 // Record time spent executing explicit COMMIT statements. | |
611 void RecordCommitTime(const base::TimeDelta& delta); | |
612 | |
613 // Record time in DML (Data Manipulation Language) statements such as INSERT | |
614 // or UPDATE outside of an explicit transaction. Due to implementation | |
615 // limitations time spent on DDL (Data Definition Language) statements such as | |
616 // ALTER and CREATE is not included. | |
617 void RecordAutoCommitTime(const base::TimeDelta& delta); | |
618 | |
619 // Record all time spent on updating the database. This includes CommitTime() | |
620 // and AutoCommitTime(), plus any time spent spilling to the journal if | |
621 // transactions do not fit in cache. | |
622 void RecordUpdateTime(const base::TimeDelta& delta); | |
623 | |
624 // Record all time spent running statements, including time spent doing | |
625 // updates and time spent on read-only queries. | |
626 void RecordQueryTime(const base::TimeDelta& delta); | |
627 | |
628 // Record |delta| as query time if |read_only| (from sqlite3_stmt_readonly) is | |
629 // true, autocommit time if the database is not in a transaction, or update | |
630 // time if the database is in a transaction. Also records change count to | |
631 // EVENT_CHANGES_AUTOCOMMIT or EVENT_CHANGES_COMMIT. | |
632 void RecordTimeAndChanges(const base::TimeDelta& delta, bool read_only); | |
633 | |
634 // Helper to return the current time from the time source. | |
635 base::TimeTicks Now() { | |
636 return clock_->Now(); | |
637 } | |
638 | |
551 // The actual sqlite database. Will be NULL before Init has been called or if | 639 // The actual sqlite database. Will be NULL before Init has been called or if |
552 // Init resulted in an error. | 640 // Init resulted in an error. |
553 sqlite3* db_; | 641 sqlite3* db_; |
554 | 642 |
555 // Parameters we'll configure in sqlite before doing anything else. Zero means | 643 // Parameters we'll configure in sqlite before doing anything else. Zero means |
556 // use the default value. | 644 // use the default value. |
557 int page_size_; | 645 int page_size_; |
558 int cache_size_; | 646 int cache_size_; |
559 bool exclusive_locking_; | 647 bool exclusive_locking_; |
560 bool restrict_to_user_; | 648 bool restrict_to_user_; |
(...skipping 26 matching lines...) Expand all Loading... | |
587 // to enable diagnostics to distinguish calls to never-opened | 675 // to enable diagnostics to distinguish calls to never-opened |
588 // databases (incorrect use of the API) from calls to once-valid | 676 // databases (incorrect use of the API) from calls to once-valid |
589 // databases. | 677 // databases. |
590 bool poisoned_; | 678 bool poisoned_; |
591 | 679 |
592 ErrorCallback error_callback_; | 680 ErrorCallback error_callback_; |
593 | 681 |
594 // Tag for auxiliary histograms. | 682 // Tag for auxiliary histograms. |
595 std::string histogram_tag_; | 683 std::string histogram_tag_; |
596 | 684 |
685 // Linear histogram for RecordEvent(). | |
686 base::HistogramBase* stats_histogram_; | |
687 | |
688 // Histogram for tracking time taken in commit. | |
689 base::HistogramBase* commit_time_histogram_; | |
690 | |
691 // Histogram for tracking time taken in autocommit updates. | |
692 base::HistogramBase* autocommit_time_histogram_; | |
693 | |
694 // Histogram for tracking time taken in updates (including commit and | |
695 // autocommit). | |
696 base::HistogramBase* update_time_histogram_; | |
697 | |
698 // Histogram for tracking time taken in all queries. | |
699 base::HistogramBase* query_time_histogram_; | |
700 | |
701 // Source for timing information, provided to allow tests to inject time | |
702 // changes. | |
703 scoped_ptr<TimeSource> clock_; | |
704 | |
597 DISALLOW_COPY_AND_ASSIGN(Connection); | 705 DISALLOW_COPY_AND_ASSIGN(Connection); |
598 }; | 706 }; |
599 | 707 |
600 } // namespace sql | 708 } // namespace sql |
601 | 709 |
602 #endif // SQL_CONNECTION_H_ | 710 #endif // SQL_CONNECTION_H_ |
OLD | NEW |