package memcached import ( "errors" "io" "github.com/couchbase/gomemcached" ) var errNoConn = errors.New("no connection") // UnwrapMemcachedError converts memcached errors to normal responses. // // If the error is a memcached response, declare the error to be nil // so a client can handle the status without worrying about whether it // indicates success or failure. func UnwrapMemcachedError(rv *gomemcached.MCResponse, err error) (*gomemcached.MCResponse, error) { if rv == err { return rv, nil } return rv, err } // ReceiveHook is called after every packet is received (or attempted to be) var ReceiveHook func(*gomemcached.MCResponse, int, error) func getResponse(s io.Reader, hdrBytes []byte) (rv *gomemcached.MCResponse, n int, err error) { if s == nil { return nil, 0, errNoConn } rv = &gomemcached.MCResponse{} n, err = rv.Receive(s, hdrBytes) if ReceiveHook != nil { ReceiveHook(rv, n, err) } if err == nil && (rv.Status != gomemcached.SUCCESS && rv.Status != gomemcached.AUTH_CONTINUE) { err = rv } return rv, n, err } // TransmitHook is called after each packet is transmitted. var TransmitHook func(*gomemcached.MCRequest, int, error) func transmitRequest(o io.Writer, req *gomemcached.MCRequest) (int, error) { if o == nil { return 0, errNoConn } n, err := req.Transmit(o) if TransmitHook != nil { TransmitHook(req, n, err) } return n, err } func transmitResponse(o io.Writer, res *gomemcached.MCResponse) (int, error) { if o == nil { return 0, errNoConn } n, err := res.Transmit(o) return n, err }