go.dedis.ch/onet/v3@v3.2.11-0.20210930124529-e36530bca7ef/dbadmin/dummy/main.go (about)

     1  // Package Dummy's only purpose is to create a DB that can be tested by the
     2  // dbadmin binary.
     3  // It sets up some services and stores data,
     4  // only to be able to store the db-file.
     5  //
     6  // It uses a fixed private/public key,
     7  // as the db-name is chosen using the hash of the key.
     8  // Taking a fixed value (the base) makes testing easier.
     9  package main
    10  
    11  import (
    12  	"flag"
    13  	"fmt"
    14  	"os"
    15  
    16  	"go.dedis.ch/onet/v3/network"
    17  
    18  	"go.dedis.ch/kyber/v3/group/edwards25519"
    19  
    20  	"go.dedis.ch/onet/v3"
    21  	"go.dedis.ch/onet/v3/log"
    22  	"go.etcd.io/bbolt"
    23  	"golang.org/x/xerrors"
    24  )
    25  
    26  var load = flag.Bool("load", false, "loading data from service")
    27  var save = flag.Bool("save", false, "saving data from service")
    28  
    29  func main() {
    30  	flag.Parse()
    31  	var a action
    32  	switch {
    33  	case *load:
    34  		a = actionLoad
    35  	case *save:
    36  		a = actionSave
    37  	default:
    38  		log.Fatal("Please give either --load or --save")
    39  	}
    40  
    41  	_, err := onet.RegisterNewService("Foo", newService("foo", a))
    42  	log.ErrFatal(err)
    43  	_, err = onet.RegisterNewService("Bar", newService("bar", a))
    44  	log.ErrFatal(err)
    45  
    46  	log.ErrFatal(os.Setenv("CONODE_SERVICE_PATH", "."))
    47  	suite := &edwards25519.SuiteEd25519{}
    48  	_, si := onet.NewPrivIdentity(suite, 2000)
    49  	si.Address = network.NewTCPAddress(si.Address.NetworkAddress())
    50  	si.Public = suite.Point().Null()
    51  	s := onet.NewServerTCP(si, suite)
    52  	log.ErrFatal(s.Close())
    53  }
    54  
    55  type action int
    56  
    57  const (
    58  	actionLoad = iota
    59  	actionSave
    60  )
    61  
    62  func newService(name string, a action) onet.NewServiceFunc {
    63  	network.RegisterMessage(&data{})
    64  	name1 := []byte(name + "1")
    65  	nameDB := []byte(name + "DB")
    66  	return func(c *onet.Context) (onet.Service, error) {
    67  		s := onet.NewServiceProcessor(c)
    68  		switch a {
    69  		case actionSave:
    70  			err := s.Save(name1, &data{name, 22})
    71  			if err != nil {
    72  				return nil, xerrors.Errorf("couldn't save data: %+v", err)
    73  			}
    74  
    75  			db, bName := c.GetAdditionalBucket(nameDB)
    76  			err = db.Update(func(tx *bbolt.Tx) error {
    77  				for i := 0; i < 10; i++ {
    78  					err := tx.Bucket([]byte(bName)).Put(
    79  						[]byte(fmt.Sprintf("key_%s_%d", name, i)),
    80  						[]byte(fmt.Sprintf("data_%s_%d", name, i)))
    81  					if err != nil {
    82  						return err
    83  					}
    84  				}
    85  				return nil
    86  			})
    87  			if err != nil {
    88  				return nil, xerrors.Errorf("couldn't update db: %+v", err)
    89  			}
    90  		case actionLoad:
    91  			d, err := s.Load(name1)
    92  			if err != nil {
    93  				return nil, err
    94  			}
    95  			var da *data
    96  			var ok bool
    97  			if da, ok = d.(*data); !ok {
    98  				return nil, xerrors.Errorf("couldn't convert to data: %+v", err)
    99  			}
   100  			log.Infof("KV: Data_%s is: %+v", name, da)
   101  
   102  			db, bName := c.GetAdditionalBucket(nameDB)
   103  			err = db.View(func(tx *bbolt.Tx) error {
   104  				c := tx.Bucket([]byte(bName)).Cursor()
   105  				i := 0
   106  				for k, v := c.First(); k != nil; k, v = c.Next() {
   107  					log.Infof("DB: Data_%s[%x]: %s / %s", name, i, string(k),
   108  						string(v))
   109  				}
   110  				return nil
   111  			})
   112  		}
   113  		return s, nil
   114  	}
   115  }
   116  
   117  type serviceBar struct {
   118  	onet.Context
   119  }
   120  
   121  type data struct {
   122  	One string
   123  	Two int
   124  }