/*
 * 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.
 */

syntax = "proto2";

package perfetto.protos;

import "protos/perfetto/metrics/metrics.proto";

// This file defines the schema for {,un}marshalling arguments and return values
// when interfacing to the trace processor binary interface.

// The Trace Processor can be used in three modes:
// 1. Fully native from C++ or directly using trace_processor_shell.
//    In this case, this file isn't really relevant because no binary
//    marshalling is involved. Look at include/trace_processor/trace_processor.h
//    for the public C++ API definition.
// 2. Using WASM within the HTML ui. In this case these messages are used to
//    {,un}marshall calls made through the JS<>WASM interop in
//    src/trace_processor/rpc/wasm_bridge.cc .
// 3. Using the HTTP+RPC interface, by running trace_processor_shell -D.
//    In this case these messages are used to {,un}marshall HTTP requests and
//    response made through src/trace_processor/rpc/httpd.cc .

// Input for the /raw_query endpoint.
message RawQueryArgs {
  optional string sql_query = 1;

  // Wall time when the query was queued. Used only for query stats.
  optional uint64 time_queued_ns = 2;
}

// Output for the /raw_query endpoint.
message RawQueryResult {
  message ColumnDesc {
    optional string name = 1;
    enum Type {
      UNKNOWN = 0;
      LONG = 1;
      DOUBLE = 2;
      STRING = 3;
    }
    optional Type type = 2;
  }
  message ColumnValues {
    // Only one of this field will be filled for each column (according to the
    // corresponding descriptor) and that one will have precisely |num_records|
    // elements.
    repeated int64 long_values = 1;
    repeated double double_values = 2;
    repeated string string_values = 3;

    // This will be set to true or false depending on whether the data at the
    // given index is NULL.
    repeated bool is_nulls = 4;
  }
  repeated ColumnDesc column_descriptors = 1;
  optional uint64 num_records = 2;
  repeated ColumnValues columns = 3;
  optional string error = 4;
  optional uint64 execution_time_ns = 5;
}

// Input for the /status endpoint.
message StatusArgs {}

// Output for the /status endpoint.
message StatusResult {
  // If present and not empty, a trace is already loaded already. This happens
  // when using the HTTP+RPC mode nad passing a trace file to the shell, via
  // trace_processor_shell -D trace_file.pftrace .
  optional string loaded_trace_name = 1;
}

// Input for the /compute_metric endpoint.
message ComputeMetricArgs {
  repeated string metric_names = 1;
}

// Output for the /compute_metric endpoint.
message ComputeMetricResult {
  optional perfetto.protos.TraceMetrics metrics = 1;
  optional string error = 2;
}