basic

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 19, 2018 License: BSD-3-Clause Imports: 16 Imported by: 0

Documentation

Overview

Package basic is a generated protocol buffer package.

It is generated from these files:

tests/spanner/basic/basic_example.proto

It has these top-level messages:

Something
HasTimestamp

This file is generated by protoc-gen-persist Source File: tests/spanner/basic/basic_example.proto DO NOT EDIT !

Index

Constants

This section is empty.

Variables

View Source
var MappedEnum_name = map[int32]string{
	0: "OPT_0",
	1: "OPT_1",
}
View Source
var MappedEnum_value = map[string]int32{
	"OPT_0": 0,
	"OPT_1": 1,
}
View Source
var MyEnum_name = map[int32]string{
	0: "OPTION_0",
	1: "OPTION_1",
}
View Source
var MyEnum_value = map[string]int32{
	"OPTION_0": 0,
	"OPTION_1": 1,
}

Functions

func ExampleTableFromExtraSrvDatabaseRow

func ExampleTableFromExtraSrvDatabaseRow(row *spanner.Row) (*test.ExampleTable, error)

func ExampleTableFromMySpannerDatabaseRow

func ExampleTableFromMySpannerDatabaseRow(row *spanner.Row) (*test.ExampleTable, error)

func HasTimestampToMySpannerPersistType

func HasTimestampToMySpannerPersistType(req *HasTimestamp) (*persist_lib.HasTimestampForMySpanner, error)

func IterExtraSrvExampleTableProto

func IterExtraSrvExampleTableProto(iter *spanner.RowIterator, next func(i *test.ExampleTable) error) error

func IterMySpannerExampleTableProto

func IterMySpannerExampleTableProto(iter *spanner.RowIterator, next func(i *test.ExampleTable) error) error

func IterMySpannerHasTimestampProto

func IterMySpannerHasTimestampProto(iter *spanner.RowIterator, next func(i *HasTimestamp) error) error

func IterMySpannerNumRowsProto

func IterMySpannerNumRowsProto(iter *spanner.RowIterator, next func(i *test.NumRows) error) error

func IterMySpannerPartialTableProto

func IterMySpannerPartialTableProto(iter *spanner.RowIterator, next func(i *test.PartialTable) error) error

func IterMySpannerSomethingProto

func IterMySpannerSomethingProto(iter *spanner.RowIterator, next func(i *Something) error) error

func NameToMySpannerPersistType

func NameToMySpannerPersistType(req *test.Name) (*persist_lib.Test_NameForMySpanner, error)

func NumRowsFromMySpannerDatabaseRow

func NumRowsFromMySpannerDatabaseRow(row *spanner.Row) (*test.NumRows, error)

func NumRowsToExtraSrvPersistType

func NumRowsToExtraSrvPersistType(req *test.NumRows) (*persist_lib.Test_NumRowsForExtraSrv, error)

func PartialTableFromMySpannerDatabaseRow

func PartialTableFromMySpannerDatabaseRow(row *spanner.Row) (*test.PartialTable, error)

func RegisterExtraSrvServer

func RegisterExtraSrvServer(s *grpc.Server, srv ExtraSrvServer)

func RegisterMySpannerServer

func RegisterMySpannerServer(s *grpc.Server, srv MySpannerServer)

func SomethingToMySpannerPersistType

func SomethingToMySpannerPersistType(req *Something) (*persist_lib.SomethingForMySpanner, error)

Types

type ExtraSrvClient

type ExtraSrvClient interface {
	ExtraUnary(ctx context.Context, in *tests_test.NumRows, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	ExtraMethod(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
}

func NewExtraSrvClient

func NewExtraSrvClient(cc *grpc.ClientConn) ExtraSrvClient

type ExtraSrvImpl

type ExtraSrvImpl struct {
	PERSIST   *persist_lib.ExtraSrvMethodReceiver
	FORWARDED RestOfExtraSrvHandlers
}

func (*ExtraSrvImpl) ExtraMethod

func (s *ExtraSrvImpl) ExtraMethod(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*ExtraSrvImpl) ExtraUnary

func (s *ExtraSrvImpl) ExtraUnary(ctx context.Context, req *test.NumRows) (*test.ExampleTable, error)

type ExtraSrvImplBuilder

type ExtraSrvImplBuilder struct {
	// contains filtered or unexported fields
}

func NewExtraSrvBuilder

func NewExtraSrvBuilder() *ExtraSrvImplBuilder

func (*ExtraSrvImplBuilder) Build

func (b *ExtraSrvImplBuilder) Build() (*ExtraSrvImpl, error)

func (*ExtraSrvImplBuilder) MustBuild

func (b *ExtraSrvImplBuilder) MustBuild() *ExtraSrvImpl

func (*ExtraSrvImplBuilder) WithDefaultQueryHandlers

func (b *ExtraSrvImplBuilder) WithDefaultQueryHandlers() *ExtraSrvImplBuilder

func (*ExtraSrvImplBuilder) WithNilAsDefaultQueryHandlers

func (b *ExtraSrvImplBuilder) WithNilAsDefaultQueryHandlers(p *persist_lib.ExtraSrvQueryHandlers) *ExtraSrvImplBuilder

set the custom handlers you want to use in the handlers this method will make sure to use a default handler if the handler is nil.

func (*ExtraSrvImplBuilder) WithPersistQueryHandlers

func (*ExtraSrvImplBuilder) WithRestOfGrpcHandlers

func (b *ExtraSrvImplBuilder) WithRestOfGrpcHandlers(r RestOfExtraSrvHandlers) *ExtraSrvImplBuilder

func (*ExtraSrvImplBuilder) WithSpannerClient

func (b *ExtraSrvImplBuilder) WithSpannerClient(c *spanner.Client) *ExtraSrvImplBuilder

func (*ExtraSrvImplBuilder) WithSpannerURI

func (b *ExtraSrvImplBuilder) WithSpannerURI(ctx context.Context, uri string) *ExtraSrvImplBuilder

type ExtraSrvServer

type ExtraSrvServer interface {
	ExtraUnary(context.Context, *tests_test.NumRows) (*tests_test.ExampleTable, error)
	ExtraMethod(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
}

type HasTimestamp

type HasTimestamp struct {
	Time   *google_protobuf1.Timestamp   `protobuf:"bytes,1,opt,name=time" json:"time,omitempty"`
	Some   *Something                    `protobuf:"bytes,2,opt,name=some" json:"some,omitempty"`
	Str    string                        `protobuf:"bytes,3,opt,name=str" json:"str,omitempty"`
	Table  *tests_test.ExampleTable      `protobuf:"bytes,4,opt,name=table" json:"table,omitempty"`
	Strs   []string                      `protobuf:"bytes,5,rep,name=strs" json:"strs,omitempty"`
	Tables []*tests_test.ExampleTable    `protobuf:"bytes,6,rep,name=tables" json:"tables,omitempty"`
	Somes  []*Something                  `protobuf:"bytes,7,rep,name=somes" json:"somes,omitempty"`
	Times  []*google_protobuf1.Timestamp `protobuf:"bytes,8,rep,name=times" json:"times,omitempty"`
}

func HasTimestampFromMySpannerDatabaseRow

func HasTimestampFromMySpannerDatabaseRow(row *spanner.Row) (*HasTimestamp, error)

func (*HasTimestamp) Descriptor

func (*HasTimestamp) Descriptor() ([]byte, []int)

func (*HasTimestamp) GetSome

func (m *HasTimestamp) GetSome() *Something

func (*HasTimestamp) GetSomes

func (m *HasTimestamp) GetSomes() []*Something

func (*HasTimestamp) GetStr

func (m *HasTimestamp) GetStr() string

func (*HasTimestamp) GetStrs

func (m *HasTimestamp) GetStrs() []string

func (*HasTimestamp) GetTable

func (m *HasTimestamp) GetTable() *tests_test.ExampleTable

func (*HasTimestamp) GetTables

func (m *HasTimestamp) GetTables() []*tests_test.ExampleTable

func (*HasTimestamp) GetTime

func (m *HasTimestamp) GetTime() *google_protobuf1.Timestamp

func (*HasTimestamp) GetTimes

func (m *HasTimestamp) GetTimes() []*google_protobuf1.Timestamp

func (*HasTimestamp) ProtoMessage

func (*HasTimestamp) ProtoMessage()

func (*HasTimestamp) Reset

func (m *HasTimestamp) Reset()

func (*HasTimestamp) String

func (m *HasTimestamp) String() string

type MappedEnum

type MappedEnum int32
const (
	MappedEnum_OPT_0 MappedEnum = 0
	MappedEnum_OPT_1 MappedEnum = 1
)

func (MappedEnum) EnumDescriptor

func (MappedEnum) EnumDescriptor() ([]byte, []int)

func (MappedEnum) String

func (x MappedEnum) String() string

type MyEnum

type MyEnum int32
const (
	MyEnum_OPTION_0 MyEnum = 0
	MyEnum_OPTION_1 MyEnum = 1
)

func (MyEnum) EnumDescriptor

func (MyEnum) EnumDescriptor() ([]byte, []int)

func (MyEnum) String

func (x MyEnum) String() string

type MyMappedEnum

type MyMappedEnum struct {
	Status int32
}

func (*MyMappedEnum) SpannerScan

func (t *MyMappedEnum) SpannerScan(src *spanner.GenericColumnValue) error

func (*MyMappedEnum) SpannerValue

func (t *MyMappedEnum) SpannerValue() (interface{}, error)

func (MyMappedEnum) ToProto

func (t MyMappedEnum) ToProto() MyEnum

func (MyMappedEnum) ToSpanner

func (t MyMappedEnum) ToSpanner(src MyEnum) *MyMappedEnum

type MySpannerClient

type MySpannerClient interface {
	UniaryInsert(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	UniarySelect(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	TestNest(ctx context.Context, in *Something, opts ...grpc.CallOption) (*Something, error)
	TestEverything(ctx context.Context, in *HasTimestamp, opts ...grpc.CallOption) (*HasTimestamp, error)
	UniarySelectWithDirectives(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	UniaryUpdate(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.PartialTable, error)
	UniaryDeleteRange(ctx context.Context, in *tests_test.ExampleTableRange, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	UniaryDeleteSingle(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	NoArgs(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	ServerStream(ctx context.Context, in *tests_test.Name, opts ...grpc.CallOption) (MySpanner_ServerStreamClient, error)
	ClientStreamInsert(ctx context.Context, opts ...grpc.CallOption) (MySpanner_ClientStreamInsertClient, error)
	ClientStreamDelete(ctx context.Context, opts ...grpc.CallOption) (MySpanner_ClientStreamDeleteClient, error)
	ClientStreamUpdate(ctx context.Context, opts ...grpc.CallOption) (MySpanner_ClientStreamUpdateClient, error)
	// hook tests
	UniaryInsertWithHooks(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	UniarySelectWithHooks(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	UniaryUpdateWithHooks(ctx context.Context, in *tests_test.ExampleTable, opts ...grpc.CallOption) (*tests_test.PartialTable, error)
	// really ugly, but tests multi-line
	UniaryDeleteWithHooks(ctx context.Context, in *tests_test.ExampleTableRange, opts ...grpc.CallOption) (*tests_test.ExampleTable, error)
	ServerStreamWithHooks(ctx context.Context, in *tests_test.Name, opts ...grpc.CallOption) (MySpanner_ServerStreamWithHooksClient, error)
	ClientStreamUpdateWithHooks(ctx context.Context, opts ...grpc.CallOption) (MySpanner_ClientStreamUpdateWithHooksClient, error)
}

func NewMySpannerClient

func NewMySpannerClient(cc *grpc.ClientConn) MySpannerClient

type MySpannerImpl

type MySpannerImpl struct {
	PERSIST   *persist_lib.MySpannerMethodReceiver
	FORWARDED RestOfMySpannerHandlers
}

func (*MySpannerImpl) ClientStreamDelete

func (s *MySpannerImpl) ClientStreamDelete(stream MySpanner_ClientStreamDeleteServer) error

func (*MySpannerImpl) ClientStreamInsert

func (s *MySpannerImpl) ClientStreamInsert(stream MySpanner_ClientStreamInsertServer) error

func (*MySpannerImpl) ClientStreamUpdate

func (s *MySpannerImpl) ClientStreamUpdate(stream MySpanner_ClientStreamUpdateServer) error

func (*MySpannerImpl) ClientStreamUpdateWithHooks

func (s *MySpannerImpl) ClientStreamUpdateWithHooks(stream MySpanner_ClientStreamUpdateWithHooksServer) error

func (*MySpannerImpl) NoArgs

func (*MySpannerImpl) ServerStream

func (s *MySpannerImpl) ServerStream(req *test.Name, stream MySpanner_ServerStreamServer) error

func (*MySpannerImpl) ServerStreamWithHooks

func (s *MySpannerImpl) ServerStreamWithHooks(req *test.Name, stream MySpanner_ServerStreamWithHooksServer) error

func (*MySpannerImpl) TestEverything

func (s *MySpannerImpl) TestEverything(ctx context.Context, req *HasTimestamp) (*HasTimestamp, error)

func (*MySpannerImpl) TestNest

func (s *MySpannerImpl) TestNest(ctx context.Context, req *Something) (*Something, error)

func (*MySpannerImpl) UniaryDeleteRange

func (s *MySpannerImpl) UniaryDeleteRange(ctx context.Context, req *test.ExampleTableRange) (*test.ExampleTable, error)

func (*MySpannerImpl) UniaryDeleteSingle

func (s *MySpannerImpl) UniaryDeleteSingle(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniaryDeleteWithHooks

func (s *MySpannerImpl) UniaryDeleteWithHooks(ctx context.Context, req *test.ExampleTableRange) (*test.ExampleTable, error)

func (*MySpannerImpl) UniaryInsert

func (s *MySpannerImpl) UniaryInsert(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniaryInsertWithHooks

func (s *MySpannerImpl) UniaryInsertWithHooks(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniarySelect

func (s *MySpannerImpl) UniarySelect(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniarySelectWithDirectives

func (s *MySpannerImpl) UniarySelectWithDirectives(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniarySelectWithHooks

func (s *MySpannerImpl) UniarySelectWithHooks(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)

func (*MySpannerImpl) UniaryUpdate

func (s *MySpannerImpl) UniaryUpdate(ctx context.Context, req *test.ExampleTable) (*test.PartialTable, error)

func (*MySpannerImpl) UniaryUpdateWithHooks

func (s *MySpannerImpl) UniaryUpdateWithHooks(ctx context.Context, req *test.ExampleTable) (*test.PartialTable, error)

type MySpannerImplBuilder

type MySpannerImplBuilder struct {
	// contains filtered or unexported fields
}

func NewMySpannerBuilder

func NewMySpannerBuilder() *MySpannerImplBuilder

func (*MySpannerImplBuilder) Build

func (b *MySpannerImplBuilder) Build() (*MySpannerImpl, error)

func (*MySpannerImplBuilder) MustBuild

func (b *MySpannerImplBuilder) MustBuild() *MySpannerImpl

func (*MySpannerImplBuilder) WithDefaultQueryHandlers

func (b *MySpannerImplBuilder) WithDefaultQueryHandlers() *MySpannerImplBuilder

func (*MySpannerImplBuilder) WithNilAsDefaultQueryHandlers

func (b *MySpannerImplBuilder) WithNilAsDefaultQueryHandlers(p *persist_lib.MySpannerQueryHandlers) *MySpannerImplBuilder

set the custom handlers you want to use in the handlers this method will make sure to use a default handler if the handler is nil.

func (*MySpannerImplBuilder) WithPersistQueryHandlers

func (*MySpannerImplBuilder) WithRestOfGrpcHandlers

func (*MySpannerImplBuilder) WithSpannerClient

func (b *MySpannerImplBuilder) WithSpannerClient(c *spanner.Client) *MySpannerImplBuilder

func (*MySpannerImplBuilder) WithSpannerURI

func (b *MySpannerImplBuilder) WithSpannerURI(ctx context.Context, uri string) *MySpannerImplBuilder

type MySpannerServer

type MySpannerServer interface {
	UniaryInsert(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	UniarySelect(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	TestNest(context.Context, *Something) (*Something, error)
	TestEverything(context.Context, *HasTimestamp) (*HasTimestamp, error)
	UniarySelectWithDirectives(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	UniaryUpdate(context.Context, *tests_test.ExampleTable) (*tests_test.PartialTable, error)
	UniaryDeleteRange(context.Context, *tests_test.ExampleTableRange) (*tests_test.ExampleTable, error)
	UniaryDeleteSingle(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	NoArgs(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	ServerStream(*tests_test.Name, MySpanner_ServerStreamServer) error
	ClientStreamInsert(MySpanner_ClientStreamInsertServer) error
	ClientStreamDelete(MySpanner_ClientStreamDeleteServer) error
	ClientStreamUpdate(MySpanner_ClientStreamUpdateServer) error
	// hook tests
	UniaryInsertWithHooks(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	UniarySelectWithHooks(context.Context, *tests_test.ExampleTable) (*tests_test.ExampleTable, error)
	UniaryUpdateWithHooks(context.Context, *tests_test.ExampleTable) (*tests_test.PartialTable, error)
	// really ugly, but tests multi-line
	UniaryDeleteWithHooks(context.Context, *tests_test.ExampleTableRange) (*tests_test.ExampleTable, error)
	ServerStreamWithHooks(*tests_test.Name, MySpanner_ServerStreamWithHooksServer) error
	ClientStreamUpdateWithHooks(MySpanner_ClientStreamUpdateWithHooksServer) error
}

type MySpanner_ClientStreamDeleteClient

type MySpanner_ClientStreamDeleteClient interface {
	Send(*tests_test.ExampleTable) error
	CloseAndRecv() (*tests_test.NumRows, error)
	grpc.ClientStream
}

type MySpanner_ClientStreamDeleteServer

type MySpanner_ClientStreamDeleteServer interface {
	SendAndClose(*tests_test.NumRows) error
	Recv() (*tests_test.ExampleTable, error)
	grpc.ServerStream
}

type MySpanner_ClientStreamInsertClient

type MySpanner_ClientStreamInsertClient interface {
	Send(*tests_test.ExampleTable) error
	CloseAndRecv() (*tests_test.NumRows, error)
	grpc.ClientStream
}

type MySpanner_ClientStreamInsertServer

type MySpanner_ClientStreamInsertServer interface {
	SendAndClose(*tests_test.NumRows) error
	Recv() (*tests_test.ExampleTable, error)
	grpc.ServerStream
}

type MySpanner_ClientStreamUpdateClient

type MySpanner_ClientStreamUpdateClient interface {
	Send(*tests_test.ExampleTable) error
	CloseAndRecv() (*tests_test.NumRows, error)
	grpc.ClientStream
}

type MySpanner_ClientStreamUpdateServer

type MySpanner_ClientStreamUpdateServer interface {
	SendAndClose(*tests_test.NumRows) error
	Recv() (*tests_test.ExampleTable, error)
	grpc.ServerStream
}

type MySpanner_ClientStreamUpdateWithHooksClient

type MySpanner_ClientStreamUpdateWithHooksClient interface {
	Send(*tests_test.ExampleTable) error
	CloseAndRecv() (*tests_test.NumRows, error)
	grpc.ClientStream
}

type MySpanner_ClientStreamUpdateWithHooksServer

type MySpanner_ClientStreamUpdateWithHooksServer interface {
	SendAndClose(*tests_test.NumRows) error
	Recv() (*tests_test.ExampleTable, error)
	grpc.ServerStream
}

type MySpanner_ServerStreamClient

type MySpanner_ServerStreamClient interface {
	Recv() (*tests_test.ExampleTable, error)
	grpc.ClientStream
}

type MySpanner_ServerStreamServer

type MySpanner_ServerStreamServer interface {
	Send(*tests_test.ExampleTable) error
	grpc.ServerStream
}

type MySpanner_ServerStreamWithHooksClient

type MySpanner_ServerStreamWithHooksClient interface {
	Recv() (*tests_test.ExampleTable, error)
	grpc.ClientStream
}

type MySpanner_ServerStreamWithHooksServer

type MySpanner_ServerStreamWithHooksServer interface {
	Send(*tests_test.ExampleTable) error
	grpc.ServerStream
}

type RestOfExtraSrvHandlers

type RestOfExtraSrvHandlers interface {
	ExtraMethod(ctx context.Context, req *test.ExampleTable) (*test.ExampleTable, error)
}

type RestOfMySpannerHandlers

type RestOfMySpannerHandlers interface {
}

type Something

type Something struct {
	Thing      *Something_SomethingElse `protobuf:"bytes,2,opt,name=thing" json:"thing,omitempty"`
	Myenum     MyEnum                   `protobuf:"varint,3,opt,name=myenum,enum=tests.MyEnum" json:"myenum,omitempty"`
	Mappedenum MappedEnum               `protobuf:"varint,4,opt,name=mappedenum,enum=tests.MappedEnum" json:"mappedenum,omitempty"`
}

func SomethingFromMySpannerDatabaseRow

func SomethingFromMySpannerDatabaseRow(row *spanner.Row) (*Something, error)

func (*Something) Descriptor

func (*Something) Descriptor() ([]byte, []int)

func (*Something) GetMappedenum

func (m *Something) GetMappedenum() MappedEnum

func (*Something) GetMyenum

func (m *Something) GetMyenum() MyEnum

func (*Something) GetThing

func (m *Something) GetThing() *Something_SomethingElse

func (*Something) ProtoMessage

func (*Something) ProtoMessage()

func (*Something) Reset

func (m *Something) Reset()

func (*Something) String

func (m *Something) String() string

type Something_SomethingElse

type Something_SomethingElse struct {
	Thing string `protobuf:"bytes,1,opt,name=thing" json:"thing,omitempty"`
}

func (*Something_SomethingElse) Descriptor

func (*Something_SomethingElse) Descriptor() ([]byte, []int)

func (*Something_SomethingElse) GetThing

func (m *Something_SomethingElse) GetThing() string

func (*Something_SomethingElse) ProtoMessage

func (*Something_SomethingElse) ProtoMessage()

func (*Something_SomethingElse) Reset

func (m *Something_SomethingElse) Reset()

func (*Something_SomethingElse) String

func (m *Something_SomethingElse) String() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL