/* * 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 #include #include #include #include "perfetto/base/logging.h" #include "perfetto/base/status.h" #include "perfetto/ext/base/string_view.h" #include "perfetto/trace_processor/basic_types.h" #include "src/trace_processor/containers/null_term_string_view.h" namespace perfetto::trace_processor::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, kLong, kDouble, kString, // Deprecated types. // TODO(b/380259828): Remove. kInt, kUint, kProto, kFloat, 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 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& out); // Serialises the given argument list into a string. std::string SerializeArguments(const std::vector& args); } // namespace perfetto::trace_processor::sql_argument #endif // SRC_TRACE_PROCESSOR_UTIL_SQL_ARGUMENT_H_