diff --git a/redis.go b/redis.go index 894294d8..32b83d5a 100644 --- a/redis.go +++ b/redis.go @@ -17,14 +17,6 @@ func SetLogger(logger *log.Logger) { internal.Logger = logger } -type baseClient struct { - connPool pool.Pooler - opt *Options - - process func(Cmder) error - onClose func() error // hook called when client is closed -} - func (c *baseClient) String() string { return fmt.Sprintf("Redis<%s db:%d>", c.getAddr(), c.opt.DB) } @@ -309,6 +301,13 @@ func NewClient(opt *Options) *Client { return newClient(opt, newConnPool(opt)) } +func (c *Client) copy() *Client { + c2 := new(Client) + *c2 = *c + c2.cmdable.process = c2.Process + return c2 +} + // PoolStats returns connection pool stats. func (c *Client) PoolStats() *PoolStats { s := c.connPool.Stats() diff --git a/redis_context.go b/redis_context.go new file mode 100644 index 00000000..bfa62bc5 --- /dev/null +++ b/redis_context.go @@ -0,0 +1,35 @@ +// +build go1.7 + +package redis + +import ( + "context" + + "gopkg.in/redis.v5/internal/pool" +) + +type baseClient struct { + connPool pool.Pooler + opt *Options + + process func(Cmder) error + onClose func() error // hook called when client is closed + + ctx context.Context +} + +func (c *Client) Context() context.Context { + if c.ctx != nil { + return c.ctx + } + return context.Background() +} + +func (c *Client) WithContext(ctx context.Context) *Client { + if ctx == nil { + panic("nil context") + } + c2 := c.copy() + c2.ctx = ctx + return c2 +} diff --git a/redis_no_context.go b/redis_no_context.go new file mode 100644 index 00000000..78a5a637 --- /dev/null +++ b/redis_no_context.go @@ -0,0 +1,15 @@ +// +build !go1.7 + +package redis + +import ( + "gopkg.in/redis.v5/internal/pool" +) + +type baseClient struct { + connPool pool.Pooler + opt *Options + + process func(Cmder) error + onClose func() error // hook called when client is closed +}