client_wrapper.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package connection
  2. type ClientFactoryFunc func(super *ConSelector) Client
  3. type Client interface {
  4. CfgValidate(map[string]interface{}) error
  5. GetClient() (interface{}, error)
  6. CloseClient() error
  7. }
  8. type clientWrapper struct {
  9. cli Client
  10. conn interface{}
  11. refCnt uint32
  12. }
  13. func NewClientWrapper(client Client, selector *ConSelector) (*clientWrapper, error) {
  14. props, err := selector.ReadCfgFromYaml()
  15. if err != nil {
  16. return nil, err
  17. }
  18. err = client.CfgValidate(props)
  19. if err != nil {
  20. return nil, err
  21. }
  22. var con interface{}
  23. con, err = client.GetClient()
  24. if err != nil {
  25. return nil, err
  26. }
  27. cliWpr := &clientWrapper{
  28. cli: client,
  29. conn: con,
  30. refCnt: 1,
  31. }
  32. return cliWpr, nil
  33. }
  34. func (c *clientWrapper) addRef() {
  35. c.refCnt = c.refCnt + 1
  36. }
  37. func (c *clientWrapper) subRef() {
  38. c.refCnt = c.refCnt - 1
  39. }
  40. func (c *clientWrapper) IsRefEmpty() bool {
  41. return c.refCnt == 0
  42. }
  43. func (c *clientWrapper) clean() {
  44. _ = c.cli.CloseClient()
  45. }
  46. func (c *clientWrapper) getInstance() interface{} {
  47. return c.conn
  48. }