|  | /* | 
|  | * Copyright (C) 2018 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef SRC_TRACE_PROCESSOR_SQLITE_SQL_STATS_TABLE_H_ | 
|  | #define SRC_TRACE_PROCESSOR_SQLITE_SQL_STATS_TABLE_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  |  | 
|  | #include "src/trace_processor/sqlite/bindings/sqlite_module.h" | 
|  |  | 
|  | namespace perfetto::trace_processor { | 
|  |  | 
|  | class QueryConstraints; | 
|  | class TraceStorage; | 
|  |  | 
|  | // A virtual table that allows to introspect performances of the SQL engine | 
|  | // for the kMaxLogEntries queries. | 
|  | struct SqlStatsModule : sqlite::Module<SqlStatsModule> { | 
|  | using Context = TraceStorage; | 
|  | struct Vtab : sqlite::Module<SqlStatsModule>::Vtab { | 
|  | TraceStorage* storage = nullptr; | 
|  | }; | 
|  | struct Cursor : sqlite::Module<SqlStatsModule>::Cursor { | 
|  | const TraceStorage* storage = nullptr; | 
|  | size_t row = 0; | 
|  | size_t num_rows = 0; | 
|  | }; | 
|  | enum Column { | 
|  | kQuery = 0, | 
|  | kTimeStarted = 1, | 
|  | kTimeFirstNext = 2, | 
|  | kTimeEnded = 3, | 
|  | }; | 
|  |  | 
|  | static constexpr auto kType = kEponymousOnly; | 
|  | static constexpr bool kSupportsWrites = false; | 
|  | static constexpr bool kDoesOverloadFunctions = false; | 
|  |  | 
|  | static int Connect(sqlite3*, | 
|  | void*, | 
|  | int, | 
|  | const char* const*, | 
|  | sqlite3_vtab**, | 
|  | char**); | 
|  | static int Disconnect(sqlite3_vtab*); | 
|  |  | 
|  | static int BestIndex(sqlite3_vtab*, sqlite3_index_info*); | 
|  |  | 
|  | static int Open(sqlite3_vtab*, sqlite3_vtab_cursor**); | 
|  | static int Close(sqlite3_vtab_cursor*); | 
|  |  | 
|  | static int Filter(sqlite3_vtab_cursor*, | 
|  | int, | 
|  | const char*, | 
|  | int, | 
|  | sqlite3_value**); | 
|  | static int Next(sqlite3_vtab_cursor*); | 
|  | static int Eof(sqlite3_vtab_cursor*); | 
|  | static int Column(sqlite3_vtab_cursor*, sqlite3_context*, int); | 
|  | static int Rowid(sqlite3_vtab_cursor*, sqlite_int64*); | 
|  |  | 
|  | // This needs to happen at the end as it depends on the functions | 
|  | // defined above. | 
|  | static constexpr sqlite3_module kModule = CreateModule(); | 
|  | }; | 
|  |  | 
|  | }  // namespace perfetto::trace_processor | 
|  |  | 
|  | #endif  // SRC_TRACE_PROCESSOR_SQLITE_SQL_STATS_TABLE_H_ |