Skip to content
This repository has been archived by the owner on Aug 31, 2020. It is now read-only.

Commit

Permalink
Propagates context cancellation.
Browse files Browse the repository at this point in the history
  • Loading branch information
jackskj committed May 20, 2020
1 parent ac70b1b commit 9520034
Show file tree
Hide file tree
Showing 15 changed files with 660 additions and 188 deletions.
42 changes: 26 additions & 16 deletions examples/query.pb.map.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions mapper/mapper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,24 @@ func TestFailedStreamingCallbacks(t *testing.T) {
protoResult("testMappingClient.BlogsCF", sResp, err, sErr, true)
}

func TestCanceledContext(t *testing.T) {
// todo defer
timeout, _ := time.ParseDuration("5s")

// unary
ctx, cancelFunc := context.WithCancel(context.TODO())
time.AfterFunc(timeout, cancelFunc)
resp, sErr := testMappingClient.CanceledUnaryContext(ctx, &td.EmptyRequest{})
protoResult("testMappingClient.CanceledUnaryContext", resp, nil, sErr, true) // canceled during query execution

// streaming
ctx, cancelFunc = context.WithCancel(context.TODO())
time.AfterFunc(timeout, cancelFunc)
stream, err := testMappingClient.CanceledStreamContext(ctx, &td.EmptyRequest{})
sResp, sErr := postReader(stream)
protoResult("testMappingClient.CanceledStreamContext", sResp, err, sErr, true)
}

func blogStreamReader(stream ex.BlogQueryService_SelectBlogsClient) ([]proto.Message, error) {
var responses []proto.Message
for {
Expand Down
1 change: 1 addition & 0 deletions plugin/imports.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func (p *SqlPlugin) setStreamingImports() {
p.Pkg["codes"] = true
p.Pkg["status"] = true
p.Pkg["log"] = true
p.Pkg["context"] = true
}

func (p *SqlPlugin) setUnaryImports() {
Expand Down
12 changes: 7 additions & 5 deletions templates/streaing_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,12 @@ func (m *{{ .ServiceName }}MapServer) {{ .MethodName }}(r *{{ .RequestName }}, s
preparedSql, args, err := mapper.PrepareQuery(m.Dialect, sqlBuffer.Bytes())
if err != nil {
log.Printf("error preparing sql query.\n {{ .RequestName }} request: %s \n query: %s \n error: %s", r, rawSql, err)
return status.Error(codes.InvalidArgument, "request generated malformed query")
return status.Error(codes.InvalidArgument, "Request generated malformed query.")
}
rows, err := m.DB.Query(preparedSql, args...)
if err != nil {
rows, err := m.DB.QueryContext(stream.Context(), preparedSql, args...)
if stream.Context().Err() == context.Canceled {
return status.Error(codes.Canceled, "Client cancelled.")
} else if err != nil {
log.Printf("error executing query.\n {{ .RequestName }} request: %s \n query: %s \n error: %s", r, rawSql, err)
return status.Error(codes.Internal, err.Error())
} else {
Expand All @@ -69,8 +71,8 @@ func (m *{{ .ServiceName }}MapServer) {{ .MethodName }}(r *{{ .RequestName }}, s
m.{{ .MapperName }}Mapper, err = mapper.New("{{ .MethodName }}", rows, &{{ .ResponseName }}{})
m.mapperGenMux.Unlock()
if err != nil {
log.Printf("error generating {{ .MapperName }}Mapper: %s", err)
return status.Error(codes.Internal, "error generating {{ .ResponseName }} mapping")
log.Printf("Error generating {{ .MapperName }}Mapper: %s", err)
return status.Error(codes.Internal, "Error generating {{ .ResponseName }} mapping.")
}
m.{{ .MapperName }}Mapper.Log()
}
Expand Down
12 changes: 8 additions & 4 deletions templates/unary_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ func (m *{{ .ServiceName }}MapServer) {{ .MethodName }}(ctx context.Context, r *
return nil, status.Error(codes.InvalidArgument, "request generated malformed query")
}
{{- if eq .QueryType "Exec" }}
_, err = m.DB.Exec(preparedSql, args...)
if err != nil {
_, err = m.DB.ExecContext(ctx, preparedSql, args...)
if ctx.Err() == context.Canceled {
return nil, status.Error(codes.Canceled, "Client cancelled.")
} else if err != nil {
log.Printf("error executing query.\n {{ .RequestName }} request: %s \n query: %s \n error: %s", r, preparedSql, err)
return nil, status.Error(codes.InvalidArgument, "request generated malformed query")
}
Expand All @@ -66,8 +68,10 @@ func (m *{{ .ServiceName }}MapServer) {{ .MethodName }}(ctx context.Context, r *
resp :={{ .ResponseName }}{}
return &resp, nil
{{ else if eq .QueryType "Query" }}
rows, err := m.DB.Query(preparedSql, args...)
if err != nil {
rows, err := m.DB.QueryContext(ctx, preparedSql, args...)
if ctx.Err() == context.Canceled {
return nil, status.Error(codes.Canceled, "Client cancelled.")
} else if err != nil {
log.Printf("error executing query.\n {{ .RequestName }} request: %s \n,query: %s \n error: %s", r, preparedSql, err)
return nil, status.Error(codes.InvalidArgument, "request generated malformed query")
} else {
Expand Down
13 changes: 8 additions & 5 deletions testdata/gentest/only_streaming.pb.map.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions testdata/gentest/only_unary_exec.pb.map.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions testdata/gentest/only_unary_query.pb.map.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 36 additions & 18 deletions testdata/gentest/unary_type_test.pb.map.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 9520034

Please sign in to comment.