TraceProcessor: extract Iterator{,Impl} into their own classes
Non-functional refactoring. This is just to allow
Iterator (and IteratorImpl) to be forward declared and
prevent circular dependencies.
Also keeps the codebase a bit cleaner keeping one class
per header with a matching name.
Change-Id: I30a2d9a9fd8e6042d6a98ee029dd37f824e61f98
diff --git a/src/trace_processor/iterator_impl.h b/src/trace_processor/iterator_impl.h
new file mode 100644
index 0000000..3613f29
--- /dev/null
+++ b/src/trace_processor/iterator_impl.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2020 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_ITERATOR_IMPL_H_
+#define SRC_TRACE_PROCESSOR_ITERATOR_IMPL_H_
+
+#include <sqlite3.h>
+
+#include <memory>
+#include <vector>
+
+#include "perfetto/base/build_config.h"
+#include "perfetto/base/export.h"
+#include "perfetto/trace_processor/basic_types.h"
+#include "perfetto/trace_processor/iterator.h"
+#include "perfetto/trace_processor/status.h"
+#include "src/trace_processor/sqlite/scoped_db.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+class TraceProcessorImpl;
+
+class IteratorImpl {
+ public:
+ IteratorImpl(TraceProcessorImpl* impl,
+ sqlite3* db,
+ ScopedStmt,
+ uint32_t column_count,
+ util::Status,
+ uint32_t sql_stats_row);
+ ~IteratorImpl();
+
+ IteratorImpl(IteratorImpl&) noexcept = delete;
+ IteratorImpl& operator=(IteratorImpl&) = delete;
+
+ IteratorImpl(IteratorImpl&&) noexcept = default;
+ IteratorImpl& operator=(IteratorImpl&&) = default;
+
+ // Methods called by the base Iterator class.
+ bool Next() {
+ // Delegate to the cc file to prevent trace_storage.h include in this file.
+ if (!called_next_) {
+ RecordFirstNextInSqlStats();
+ called_next_ = true;
+ }
+
+ if (!status_.ok())
+ return false;
+
+ int ret = sqlite3_step(*stmt_);
+ if (PERFETTO_UNLIKELY(ret != SQLITE_ROW && ret != SQLITE_DONE)) {
+ status_ = util::ErrStatus("%s", sqlite3_errmsg(db_));
+ return false;
+ }
+ return ret == SQLITE_ROW;
+ }
+
+ SqlValue Get(uint32_t col) {
+ auto column = static_cast<int>(col);
+ auto col_type = sqlite3_column_type(*stmt_, column);
+ SqlValue value;
+ switch (col_type) {
+ case SQLITE_INTEGER:
+ value.type = SqlValue::kLong;
+ value.long_value = sqlite3_column_int64(*stmt_, column);
+ break;
+ case SQLITE_TEXT:
+ value.type = SqlValue::kString;
+ value.string_value =
+ reinterpret_cast<const char*>(sqlite3_column_text(*stmt_, column));
+ break;
+ case SQLITE_FLOAT:
+ value.type = SqlValue::kDouble;
+ value.double_value = sqlite3_column_double(*stmt_, column);
+ break;
+ case SQLITE_BLOB:
+ value.type = SqlValue::kBytes;
+ value.bytes_value = sqlite3_column_blob(*stmt_, column);
+ value.bytes_count =
+ static_cast<size_t>(sqlite3_column_bytes(*stmt_, column));
+ break;
+ case SQLITE_NULL:
+ value.type = SqlValue::kNull;
+ break;
+ }
+ return value;
+ }
+
+ std::string GetColumnName(uint32_t col) {
+ return sqlite3_column_name(stmt_.get(), static_cast<int>(col));
+ }
+
+ uint32_t ColumnCount() { return column_count_; }
+
+ util::Status Status() { return status_; }
+
+ // Methods called by TraceProcessorImpl.
+ void Reset();
+
+ private:
+ void RecordFirstNextInSqlStats();
+
+ TraceProcessorImpl* trace_processor_;
+ sqlite3* db_ = nullptr;
+ ScopedStmt stmt_;
+ uint32_t column_count_ = 0;
+ util::Status status_;
+
+ uint32_t sql_stats_row_ = 0;
+ bool called_next_ = false;
+};
+
+} // namespace trace_processor
+} // namespace perfetto
+
+#endif // SRC_TRACE_PROCESSOR_ITERATOR_IMPL_H_