db.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package api
  2. import (
  3. "github.com/ethereum/go-ethereum/eth"
  4. "github.com/ethereum/go-ethereum/rpc/codec"
  5. "github.com/ethereum/go-ethereum/rpc/shared"
  6. "github.com/ethereum/go-ethereum/xeth"
  7. )
  8. const (
  9. DbApiversion = "1.0"
  10. )
  11. var (
  12. // mapping between methods and handlers
  13. DbMapping = map[string]dbhandler{
  14. "db_getString": (*dbApi).GetString,
  15. "db_putString": (*dbApi).PutString,
  16. "db_getHex": (*dbApi).GetHex,
  17. "db_putHex": (*dbApi).PutHex,
  18. }
  19. )
  20. // db callback handler
  21. type dbhandler func(*dbApi, *shared.Request) (interface{}, error)
  22. // db api provider
  23. type dbApi struct {
  24. xeth *xeth.XEth
  25. ethereum *eth.Ethereum
  26. methods map[string]dbhandler
  27. codec codec.ApiCoder
  28. }
  29. // create a new db api instance
  30. func NewDbApi(xeth *xeth.XEth, ethereum *eth.Ethereum, coder codec.Codec) *dbApi {
  31. return &dbApi{
  32. xeth: xeth,
  33. ethereum: ethereum,
  34. methods: DbMapping,
  35. codec: coder.New(nil),
  36. }
  37. }
  38. // collection with supported methods
  39. func (self *dbApi) Methods() []string {
  40. methods := make([]string, len(self.methods))
  41. i := 0
  42. for k := range self.methods {
  43. methods[i] = k
  44. i++
  45. }
  46. return methods
  47. }
  48. // Execute given request
  49. func (self *dbApi) Execute(req *shared.Request) (interface{}, error) {
  50. if callback, ok := self.methods[req.Method]; ok {
  51. return callback(self, req)
  52. }
  53. return nil, &shared.NotImplementedError{req.Method}
  54. }
  55. func (self *dbApi) Name() string {
  56. return shared.DbApiName
  57. }
  58. func (self *dbApi) ApiVersion() string {
  59. return DbApiversion
  60. }
  61. func (self *dbApi) GetString(req *shared.Request) (interface{}, error) {
  62. args := new(DbArgs)
  63. if err := self.codec.Decode(req.Params, &args); err != nil {
  64. return nil, shared.NewDecodeParamError(err.Error())
  65. }
  66. if err := args.requirements(); err != nil {
  67. return nil, err
  68. }
  69. ret, err := self.xeth.DbGet([]byte(args.Database + args.Key))
  70. return string(ret), err
  71. }
  72. func (self *dbApi) PutString(req *shared.Request) (interface{}, error) {
  73. args := new(DbArgs)
  74. if err := self.codec.Decode(req.Params, &args); err != nil {
  75. return nil, shared.NewDecodeParamError(err.Error())
  76. }
  77. if err := args.requirements(); err != nil {
  78. return nil, err
  79. }
  80. return self.xeth.DbPut([]byte(args.Database+args.Key), args.Value), nil
  81. }
  82. func (self *dbApi) GetHex(req *shared.Request) (interface{}, error) {
  83. args := new(DbHexArgs)
  84. if err := self.codec.Decode(req.Params, &args); err != nil {
  85. return nil, shared.NewDecodeParamError(err.Error())
  86. }
  87. if err := args.requirements(); err != nil {
  88. return nil, err
  89. }
  90. if res, err := self.xeth.DbGet([]byte(args.Database + args.Key)); err == nil {
  91. return newHexData(res), nil
  92. } else {
  93. return nil, err
  94. }
  95. }
  96. func (self *dbApi) PutHex(req *shared.Request) (interface{}, error) {
  97. args := new(DbHexArgs)
  98. if err := self.codec.Decode(req.Params, &args); err != nil {
  99. return nil, shared.NewDecodeParamError(err.Error())
  100. }
  101. if err := args.requirements(); err != nil {
  102. return nil, err
  103. }
  104. return self.xeth.DbPut([]byte(args.Database+args.Key), args.Value), nil
  105. }