// Copyright IBM Corp. 2020, 2026
// SPDX-License-Identifier: BUSL-1.1

syntax = "proto3";

package controller.storage.oplog.v1;

import "google/protobuf/field_mask.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/wrappers.proto";

option go_package = "github.com/hashicorp/boundary/internal/oplog;oplog";

// OpType provides the type of database operation the Any message represents
// (create, update, delete)
enum OpType {
  // OP_TYPE_UNSPECIFIED defines an unspecified operation.
  OP_TYPE_UNSPECIFIED = 0;

  // OP_TYPE_CREATE defines a create operation.
  OP_TYPE_CREATE = 1;

  // OP_TYPE_UPDATE defines an update operation.
  OP_TYPE_UPDATE = 2;

  // OP_TYPE_DELETE defines a delete operation.
  OP_TYPE_DELETE = 3;

  // OP_TYPE_CREATE_ITEMS defines a create operation for multiple items.
  OP_TYPE_CREATE_ITEMS = 4;

  // OP_TYPE_DELETE_ITEMS defines a delete operation for multiple items.
  OP_TYPE_DELETE_ITEMS = 5;
}

// AnyOperation provides a message for anything and the type of operation it
// represents.
message AnyOperation {
  // type_name defines type of operation.
  string type_name = 1;

  // value are the bytes of a marshaled proto buff.
  bytes value = 2;

  // operation_type defines the type of database operation.
  OpType operation_type = 3;

  // field_mask is the mask of fields to update.
  google.protobuf.FieldMask field_mask = 4;

  // null_mask is the mask of fields to set to null.
  google.protobuf.FieldMask null_mask = 5;

  // Options for the operations (see dbw package for definition/documentation of
  // options)
  OperationOptions options = 6;
}

// OperationOptions represent operations options which can/will affect the oplog write
// operation.  These options are a subset of the dbw.Options. We will not try to
// keep the docs in-sync from the dbw package, so if you need more information
// on what the option does please see the dbw package docs.
message OperationOptions {
  // with_version (see dbw package for docs)
  google.protobuf.UInt32Value with_version = 1;

  // with_skip_vet_for_write (see dbw package for docs)
  bool with_skip_vet_for_write = 2;

  // with_where_clause (see dbw package for docs)
  string with_where_clause = 3;

  // with_where_clause_args (see dbw package for docs)
  repeated google.protobuf.Value with_where_clause_args = 4;

  // with_on_conflict (see dbw package for docs)
  WithOnConflict with_on_conflict = 5;
}

// WithOnConflict defines the parameters needed for an sql "on conflict clause"
message WithOnConflict {
  // target defines the on conflict target
  oneof target {
    // constraint is the on conflict constraint
    string constraint = 10;

    // columns are the on conflict columns
    Columns columns = 11;
  }

  // action defines the on conflict action
  oneof action {
    // do_nothing defines an on conflict action of do nothing
    bool do_nothing = 50;

    // update_all defines an on conflict action of updating all the columns
    bool update_all = 51;

    // column_values defines on conflict action with the columns to update
    ColumnValues column_values = 52;
  }
}

// Columns defines a set of column properties
message Columns {
  // name of the columns
  repeated string names = 1;
}

// ColumnValue defines a column value
message ColumnValue {
  // name of the column
  string name = 1;

  // value of the column
  oneof value {
    google.protobuf.Value raw = 2;
    ExprValue expr_value = 3;
    Column column = 4;
  }
}

// ColumnValues defines a set of column value properies
message ColumnValues {
  // values are the values of the columns
  repeated ColumnValue values = 1;
}

// ExprValue defines an expr value that can be used as a column value
message ExprValue {
  // sql is the sql clause of the expr
  string sql = 1;

  // args are the sql args of the expr
  repeated google.protobuf.Value args = 2;
}

// Column represents a table Column
message Column {
  // name of the column
  string name = 1;
  // table name of the column
  string table = 2;
}
