github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/go-hbase/call.go (about) 1 package hbase 2 3 import ( 4 "strings" 5 6 pb "github.com/insionng/yougam/libraries/golang/protobuf/proto" 7 "github.com/insionng/yougam/libraries/pingcap/go-hbase/proto" 8 ) 9 10 type call struct { 11 id uint32 12 methodName string 13 request pb.Message 14 responseBuffer pb.Message 15 responseCh chan pb.Message 16 } 17 18 type exception struct { 19 msg string 20 } 21 22 func isNotInRegionError(err error) bool { 23 return strings.Contains(err.Error(), "org.apache.hadoop.hbase.NotServingRegionException") 24 } 25 func isUnknownScannerError(err error) bool { 26 return strings.Contains(err.Error(), "org.apache.hadoop.hbase.UnknownScannerException") 27 } 28 29 func (m *exception) Reset() { *m = exception{} } 30 func (m *exception) String() string { return m.msg } 31 func (m *exception) ProtoMessage() {} 32 33 func newCall(request pb.Message) *call { 34 var responseBuffer pb.Message 35 var methodName string 36 37 switch request.(type) { 38 case *proto.GetRequest: 39 responseBuffer = &proto.GetResponse{} 40 methodName = "Get" 41 case *proto.MutateRequest: 42 responseBuffer = &proto.MutateResponse{} 43 methodName = "Mutate" 44 case *proto.ScanRequest: 45 responseBuffer = &proto.ScanResponse{} 46 methodName = "Scan" 47 case *proto.GetTableDescriptorsRequest: 48 responseBuffer = &proto.GetTableDescriptorsResponse{} 49 methodName = "GetTableDescriptors" 50 case *proto.CoprocessorServiceRequest: 51 responseBuffer = &proto.CoprocessorServiceResponse{} 52 methodName = "ExecService" 53 case *proto.CreateTableRequest: 54 responseBuffer = &proto.CreateTableResponse{} 55 methodName = "CreateTable" 56 case *proto.DisableTableRequest: 57 responseBuffer = &proto.DisableTableResponse{} 58 methodName = "DisableTable" 59 case *proto.EnableTableRequest: 60 responseBuffer = &proto.EnableTableResponse{} 61 methodName = "EnableTable" 62 case *proto.DeleteTableRequest: 63 responseBuffer = &proto.DeleteTableResponse{} 64 methodName = "DeleteTable" 65 case *proto.MultiRequest: 66 responseBuffer = &proto.MultiResponse{} 67 methodName = "Multi" 68 case *proto.SplitRegionRequest: 69 responseBuffer = &proto.SplitRegionResponse{} 70 methodName = "SplitRegion" 71 } 72 73 return &call{ 74 methodName: methodName, 75 request: request, 76 responseBuffer: responseBuffer, 77 responseCh: make(chan pb.Message, 1), 78 } 79 } 80 81 func (c *call) complete(err error, response []byte) { 82 defer close(c.responseCh) 83 84 if err != nil { 85 c.responseCh <- &exception{ 86 msg: err.Error(), 87 } 88 return 89 } 90 91 err = pb.Unmarshal(response, c.responseBuffer) 92 if err != nil { 93 c.responseCh <- &exception{ 94 msg: err.Error(), 95 } 96 return 97 } 98 99 c.responseCh <- c.responseBuffer 100 }