| /* |
| * 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); |
| |
| // Serialises the given argument list into a string. |
| std::string SerializeArguments(const std::vector<ArgumentDefinition>& args); |
| |
| } // namespace sql_argument |
| } // namespace trace_processor |
| } // namespace perfetto |
| |
| #endif // SRC_TRACE_PROCESSOR_UTIL_SQL_ARGUMENT_H_ |