|  | /* | 
|  | * Copyright (C) 2022 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_UTIL_SQL_ARGUMENT_H_ | 
|  | #define SRC_TRACE_PROCESSOR_UTIL_SQL_ARGUMENT_H_ | 
|  | #include <optional> | 
|  |  | 
|  | #include "perfetto/base/status.h" | 
|  | #include "perfetto/trace_processor/basic_types.h" | 
|  | #include "src/trace_processor/containers/null_term_string_view.h" | 
|  |  | 
|  | namespace perfetto { | 
|  | namespace trace_processor { | 
|  | namespace sql_argument { | 
|  |  | 
|  | // Possible types which can be specified in SQL. | 
|  | // This differs from SqlValue::Type by allowing specifying richer | 
|  | // types (e.g. kBool, kInt, kUint and kLong all map to | 
|  | // SqlValue::Type::kLong). This allows more accurate type checking | 
|  | // and, when lots of values are stored, reduced memory usage. | 
|  | enum class Type { | 
|  | kBool, | 
|  | kInt, | 
|  | kUint, | 
|  | kLong, | 
|  | kFloat, | 
|  | kDouble, | 
|  | kString, | 
|  | kProto, | 
|  | kBytes, | 
|  | }; | 
|  |  | 
|  | // Represents the definition of an argument from SQL. See | 
|  | // |ParseArgumentDefinitions| for more details. | 
|  | class ArgumentDefinition { | 
|  | public: | 
|  | ArgumentDefinition(std::string dollar_name, Type type) | 
|  | : dollar_name_(std::move(dollar_name)), type_(type) { | 
|  | PERFETTO_DCHECK(!dollar_name_.empty() && dollar_name_[0] == '$'); | 
|  | } | 
|  |  | 
|  | NullTermStringView dollar_name() const { | 
|  | return NullTermStringView(dollar_name_); | 
|  | } | 
|  |  | 
|  | NullTermStringView name() const { | 
|  | return NullTermStringView(dollar_name_.c_str() + 1, | 
|  | dollar_name_.size() - 1); | 
|  | } | 
|  |  | 
|  | Type type() const { return type_; } | 
|  |  | 
|  | bool operator==(const ArgumentDefinition& other) const { | 
|  | return dollar_name_ == other.dollar_name_ && type_ == other.type_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | std::string dollar_name_; | 
|  | Type type_; | 
|  | }; | 
|  |  | 
|  | // Returns whether the given |name| is considered valid. | 
|  | // | 
|  | // Names are valid if they only contain alpha-numeric characters or underscores. | 
|  | bool IsValidName(base::StringView name); | 
|  |  | 
|  | // Parses a string containing a type from SQL and converts it to a Type enum | 
|  | // value. | 
|  | // Returns std::nullopt if |type| did not correspond to any of the enum values. | 
|  | std::optional<Type> ParseType(base::StringView type); | 
|  |  | 
|  | // Converts an argument type to a string for printing (e.g. in error messages | 
|  | // etc). | 
|  | const char* TypeToHumanFriendlyString(sql_argument::Type type); | 
|  |  | 
|  | // Converts an argument type to the equivalent SqlValue::Type. | 
|  | SqlValue::Type TypeToSqlValueType(sql_argument::Type type); | 
|  |  | 
|  | // Parses a string containing argument definitions from SQL and converts it into | 
|  | // a typed list of ArgumentDefintion structs | 
|  | // | 
|  | // An argument defintion is a variable name followed by a type. Variable names | 
|  | // only contain alpha-numeric characters or underscores. Types must be one of | 
|  | // the types corresponding to the Type enum. | 
|  | // | 
|  | // The expected form of |args| is comma-separated list of argument definitions. | 
|  | // For example: foo BYTES, bar PROTO, baz INT, foobar STRING | 
|  | base::Status ParseArgumentDefinitions(const std::string& args, | 
|  | std::vector<ArgumentDefinition>& out); | 
|  |  | 
|  | }  // namespace sql_argument | 
|  | }  // namespace trace_processor | 
|  | }  // namespace perfetto | 
|  |  | 
|  | #endif  // SRC_TRACE_PROCESSOR_UTIL_SQL_ARGUMENT_H_ |