| 663 | } |
| 664 | |
| 665 | func (c *Client) populateOne(rw *bufio.ReadWriter, verb string, item *Item) error { |
| 666 | if !legalKey(item.Key) { |
| 667 | return ErrMalformedKey |
| 668 | } |
| 669 | var err error |
| 670 | if verb == "cas" { |
| 671 | _, err = fmt.Fprintf(rw, "%s %s %d %d %d %d\r\n", |
| 672 | verb, item.Key, item.Flags, item.Expiration, len(item.Value), item.CasID) |
| 673 | } else { |
| 674 | _, err = fmt.Fprintf(rw, "%s %s %d %d %d\r\n", |
| 675 | verb, item.Key, item.Flags, item.Expiration, len(item.Value)) |
| 676 | } |
| 677 | if err != nil { |
| 678 | return err |
| 679 | } |
| 680 | if _, err = rw.Write(item.Value); err != nil { |
| 681 | return err |
| 682 | } |
| 683 | if _, err := rw.Write(crlf); err != nil { |
| 684 | return err |
| 685 | } |
| 686 | if err := rw.Flush(); err != nil { |
| 687 | return err |
| 688 | } |
| 689 | line, err := rw.ReadSlice('\n') |
| 690 | if err != nil { |
| 691 | return err |
| 692 | } |
| 693 | switch { |
| 694 | case bytes.Equal(line, resultStored): |
| 695 | return nil |
| 696 | case bytes.Equal(line, resultNotStored): |
| 697 | return ErrNotStored |
| 698 | case bytes.Equal(line, resultExists): |
| 699 | return ErrCASConflict |
| 700 | case bytes.Equal(line, resultNotFound): |
| 701 | return ErrCacheMiss |
| 702 | } |
| 703 | return fmt.Errorf("memcache: unexpected response line from %q: %q", verb, string(line)) |
| 704 | } |
| 705 | |
| 706 | func writeReadLine(rw *bufio.ReadWriter, format string, args ...interface{}) ([]byte, error) { |
| 707 | _, err := fmt.Fprintf(rw, format, args...) |