// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/database_error.proto

package errors

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Enum describing possible database errors.
type DatabaseErrorEnum_DatabaseError int32

const (
	// Enum unspecified.
	DatabaseErrorEnum_UNSPECIFIED DatabaseErrorEnum_DatabaseError = 0
	// The received error code is not known in this version.
	DatabaseErrorEnum_UNKNOWN DatabaseErrorEnum_DatabaseError = 1
	// Multiple requests were attempting to modify the same resource at once.
	// Please retry the request.
	DatabaseErrorEnum_CONCURRENT_MODIFICATION DatabaseErrorEnum_DatabaseError = 2
	// The request conflicted with existing data. This error will usually be
	// replaced with a more specific error if the request is retried.
	DatabaseErrorEnum_DATA_CONSTRAINT_VIOLATION DatabaseErrorEnum_DatabaseError = 3
	// The data written is too large. Please split the request into smaller
	// requests.
	DatabaseErrorEnum_REQUEST_TOO_LARGE DatabaseErrorEnum_DatabaseError = 4
)

var DatabaseErrorEnum_DatabaseError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CONCURRENT_MODIFICATION",
	3: "DATA_CONSTRAINT_VIOLATION",
	4: "REQUEST_TOO_LARGE",
}

var DatabaseErrorEnum_DatabaseError_value = map[string]int32{
	"UNSPECIFIED":               0,
	"UNKNOWN":                   1,
	"CONCURRENT_MODIFICATION":   2,
	"DATA_CONSTRAINT_VIOLATION": 3,
	"REQUEST_TOO_LARGE":         4,
}

func (x DatabaseErrorEnum_DatabaseError) String() string {
	return proto.EnumName(DatabaseErrorEnum_DatabaseError_name, int32(x))
}

func (DatabaseErrorEnum_DatabaseError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_afdc845129054f81, []int{0, 0}
}

// Container for enum describing possible database errors.
type DatabaseErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DatabaseErrorEnum) Reset()         { *m = DatabaseErrorEnum{} }
func (m *DatabaseErrorEnum) String() string { return proto.CompactTextString(m) }
func (*DatabaseErrorEnum) ProtoMessage()    {}
func (*DatabaseErrorEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_afdc845129054f81, []int{0}
}

func (m *DatabaseErrorEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DatabaseErrorEnum.Unmarshal(m, b)
}
func (m *DatabaseErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DatabaseErrorEnum.Marshal(b, m, deterministic)
}
func (m *DatabaseErrorEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DatabaseErrorEnum.Merge(m, src)
}
func (m *DatabaseErrorEnum) XXX_Size() int {
	return xxx_messageInfo_DatabaseErrorEnum.Size(m)
}
func (m *DatabaseErrorEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_DatabaseErrorEnum.DiscardUnknown(m)
}

var xxx_messageInfo_DatabaseErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.DatabaseErrorEnum_DatabaseError", DatabaseErrorEnum_DatabaseError_name, DatabaseErrorEnum_DatabaseError_value)
	proto.RegisterType((*DatabaseErrorEnum)(nil), "google.ads.googleads.v3.errors.DatabaseErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/database_error.proto", fileDescriptor_afdc845129054f81)
}

var fileDescriptor_afdc845129054f81 = []byte{
	// 349 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x6a, 0xe3, 0x30,
	0x14, 0xc6, 0xc7, 0xce, 0x30, 0x03, 0x0a, 0xc3, 0x38, 0x86, 0x52, 0xfa, 0x2f, 0x0b, 0x1f, 0x40,
	0x5e, 0x78, 0xa7, 0xae, 0x14, 0x5b, 0x09, 0xa6, 0xa9, 0x94, 0x3a, 0xb2, 0x0b, 0xc5, 0x60, 0x94,
	0xda, 0x98, 0x40, 0x62, 0x05, 0xcb, 0xcd, 0xba, 0xa7, 0xe8, 0x01, 0xba, 0xec, 0x51, 0x7a, 0x94,
	0x42, 0xef, 0x50, 0x6c, 0x25, 0x81, 0x2c, 0xda, 0x95, 0x3e, 0x3d, 0xfd, 0xbe, 0xa7, 0xf7, 0x3d,
	0xe0, 0x95, 0x52, 0x96, 0xab, 0xc2, 0x15, 0xb9, 0x72, 0xb5, 0x6c, 0xd5, 0xd6, 0x73, 0x8b, 0xba,
	0x96, 0xb5, 0x72, 0x73, 0xd1, 0x88, 0x85, 0x50, 0x45, 0xd6, 0xdd, 0xe1, 0xa6, 0x96, 0x8d, 0xb4,
	0x87, 0x9a, 0x84, 0x22, 0x57, 0xf0, 0x60, 0x82, 0x5b, 0x0f, 0x6a, 0xd3, 0xf9, 0xe5, 0xbe, 0xe9,
	0x66, 0xe9, 0x8a, 0xaa, 0x92, 0x8d, 0x68, 0x96, 0xb2, 0x52, 0xda, 0xed, 0xbc, 0x18, 0x60, 0x10,
	0xec, 0xda, 0x92, 0xd6, 0x40, 0xaa, 0xa7, 0xb5, 0xf3, 0x6c, 0x80, 0x7f, 0x47, 0x55, 0xfb, 0x3f,
	0xe8, 0xc7, 0x74, 0x3e, 0x23, 0x7e, 0x38, 0x0e, 0x49, 0x60, 0xfd, 0xb2, 0xfb, 0xe0, 0x6f, 0x4c,
	0x6f, 0x28, 0xbb, 0xa7, 0x96, 0x61, 0x5f, 0x80, 0x53, 0x9f, 0x51, 0x3f, 0x8e, 0x22, 0x42, 0x79,
	0x76, 0xcb, 0x82, 0x70, 0x1c, 0xfa, 0x98, 0x87, 0x8c, 0x5a, 0xa6, 0x7d, 0x05, 0xce, 0x02, 0xcc,
	0x71, 0xe6, 0x33, 0x3a, 0xe7, 0x11, 0x0e, 0x29, 0xcf, 0x92, 0x90, 0x4d, 0xf5, 0x73, 0xcf, 0x3e,
	0x01, 0x83, 0x88, 0xdc, 0xc5, 0x64, 0xce, 0x33, 0xce, 0x58, 0x36, 0xc5, 0xd1, 0x84, 0x58, 0xbf,
	0x47, 0x9f, 0x06, 0x70, 0x1e, 0xe5, 0x1a, 0xfe, 0x9c, 0x6e, 0x64, 0x1f, 0x8d, 0x39, 0x6b, 0x33,
	0xcd, 0x8c, 0x87, 0x60, 0xe7, 0x2a, 0xe5, 0x4a, 0x54, 0x25, 0x94, 0x75, 0xe9, 0x96, 0x45, 0xd5,
	0x25, 0xde, 0x2f, 0x76, 0xb3, 0x54, 0xdf, 0xed, 0xf9, 0x5a, 0x1f, 0xaf, 0x66, 0x6f, 0x82, 0xf1,
	0x9b, 0x39, 0x9c, 0xe8, 0x66, 0x38, 0x57, 0x50, 0xcb, 0x56, 0x25, 0x1e, 0xec, 0xbe, 0x54, 0xef,
	0x7b, 0x20, 0xc5, 0xb9, 0x4a, 0x0f, 0x40, 0x9a, 0x78, 0xa9, 0x06, 0x3e, 0x4c, 0x47, 0x57, 0x11,
	0xc2, 0xb9, 0x42, 0xe8, 0x80, 0x20, 0x94, 0x78, 0x08, 0x69, 0x68, 0xf1, 0xa7, 0x9b, 0xce, 0xfb,
	0x0a, 0x00, 0x00, 0xff, 0xff, 0xbe, 0x9c, 0x92, 0xeb, 0x04, 0x02, 0x00, 0x00,
}
