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 }