| 617 | } |
| 618 | |
| 619 | func (kv *kvs) get(key string, revision uint64) (KeyValueEntry, error) { |
| 620 | if !keyValid(key) { |
| 621 | return nil, ErrInvalidKey |
| 622 | } |
| 623 | |
| 624 | var b strings.Builder |
| 625 | b.WriteString(kv.pre) |
| 626 | b.WriteString(key) |
| 627 | |
| 628 | var m *RawStreamMsg |
| 629 | var err error |
| 630 | var _opts [1]JSOpt |
| 631 | opts := _opts[:0] |
| 632 | if kv.useDirect { |
| 633 | opts = append(opts, DirectGet()) |
| 634 | } |
| 635 | |
| 636 | if revision == kvLatestRevision { |
| 637 | m, err = kv.js.GetLastMsg(kv.stream, b.String(), opts...) |
| 638 | } else { |
| 639 | m, err = kv.js.GetMsg(kv.stream, revision, opts...) |
| 640 | // If a sequence was provided, just make sure that the retrieved |
| 641 | // message subject matches the request. |
| 642 | if err == nil && m.Subject != b.String() { |
| 643 | return nil, ErrKeyNotFound |
| 644 | } |
| 645 | } |
| 646 | if err != nil { |
| 647 | if errors.Is(err, ErrMsgNotFound) { |
| 648 | err = ErrKeyNotFound |
| 649 | } |
| 650 | return nil, err |
| 651 | } |
| 652 | |
| 653 | entry := &kve{ |
| 654 | bucket: kv.name, |
| 655 | key: key, |
| 656 | value: m.Data, |
| 657 | revision: m.Sequence, |
| 658 | created: m.Time, |
| 659 | } |
| 660 | |
| 661 | // Double check here that this is not a DEL Operation marker. |
| 662 | if len(m.Header) > 0 { |
| 663 | switch m.Header.Get(kvop) { |
| 664 | case kvdel: |
| 665 | entry.op = KeyValueDelete |
| 666 | return entry, ErrKeyDeleted |
| 667 | case kvpurge: |
| 668 | entry.op = KeyValuePurge |
| 669 | return entry, ErrKeyDeleted |
| 670 | } |
| 671 | } |
| 672 | |
| 673 | return entry, nil |
| 674 | } |
| 675 | |
| 676 | // Put will place the new value for the key into the store. |