get-fullidpubkey-by-serial.go raw

   1  //go:build !(js && wasm)
   2  
   3  package database
   4  
   5  import (
   6  	"bytes"
   7  
   8  	"github.com/dgraph-io/badger/v4"
   9  	"next.orly.dev/pkg/lol/chk"
  10  	"next.orly.dev/pkg/database/indexes"
  11  	"next.orly.dev/pkg/database/indexes/types"
  12  	"next.orly.dev/pkg/interfaces/store"
  13  )
  14  
  15  func (d *D) GetFullIdPubkeyBySerial(ser *types.Uint40) (
  16  	fidpk *store.IdPkTs, err error,
  17  ) {
  18  	if err = d.View(
  19  		func(txn *badger.Txn) (err error) {
  20  			buf := new(bytes.Buffer)
  21  			if err = indexes.FullIdPubkeyEnc(
  22  				ser, nil, nil, nil,
  23  			).MarshalWrite(buf); chk.E(err) {
  24  				return
  25  			}
  26  			prf := buf.Bytes()
  27  			it := txn.NewIterator(
  28  				badger.IteratorOptions{
  29  					Prefix: prf,
  30  				},
  31  			)
  32  			defer it.Close()
  33  			it.Seek(prf)
  34  			if it.Valid() {
  35  				item := it.Item()
  36  				key := item.Key()
  37  				ser, fid, p, ca := indexes.FullIdPubkeyVars()
  38  				buf2 := bytes.NewBuffer(key)
  39  				if err = indexes.FullIdPubkeyDec(
  40  					ser, fid, p, ca,
  41  				).UnmarshalRead(buf2); chk.E(err) {
  42  					return
  43  				}
  44  				idpkts := store.NewIdPkTs(
  45  					fid.Bytes(),
  46  					p.Bytes(),
  47  					int64(ca.Get()),
  48  					ser.Get(),
  49  				)
  50  				fidpk = &idpkts
  51  			}
  52  			return
  53  		},
  54  	); chk.E(err) {
  55  		return
  56  	}
  57  	return
  58  }
  59