forked from mirror/go-ethereum
parent
5c25403b13
commit
c3f6c322c0
@ -0,0 +1,128 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/ethereum/go-ethereum/eth" |
||||||
|
"github.com/ethereum/go-ethereum/rpc/codec" |
||||||
|
"github.com/ethereum/go-ethereum/rpc/shared" |
||||||
|
"github.com/ethereum/go-ethereum/xeth" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
DbApiversion = "1.0" |
||||||
|
) |
||||||
|
|
||||||
|
var ( |
||||||
|
// mapping between methods and handlers
|
||||||
|
DbMapping = map[string]dbhandler{ |
||||||
|
"db_getString": (*dbApi).GetString, |
||||||
|
"db_putString": (*dbApi).PutString, |
||||||
|
"db_getHex": (*dbApi).GetHex, |
||||||
|
"db_putHex": (*dbApi).PutHex, |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
// db callback handler
|
||||||
|
type dbhandler func(*dbApi, *shared.Request) (interface{}, error) |
||||||
|
|
||||||
|
// db api provider
|
||||||
|
type dbApi struct { |
||||||
|
xeth *xeth.XEth |
||||||
|
ethereum *eth.Ethereum |
||||||
|
methods map[string]dbhandler |
||||||
|
codec codec.ApiCoder |
||||||
|
} |
||||||
|
|
||||||
|
// create a new db api instance
|
||||||
|
func NewDbApi(xeth *xeth.XEth, ethereum *eth.Ethereum, coder codec.Codec) *dbApi { |
||||||
|
return &dbApi{ |
||||||
|
xeth: xeth, |
||||||
|
ethereum: ethereum, |
||||||
|
methods: DbMapping, |
||||||
|
codec: coder.New(nil), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// collection with supported methods
|
||||||
|
func (self *dbApi) Methods() []string { |
||||||
|
methods := make([]string, len(self.methods)) |
||||||
|
i := 0 |
||||||
|
for k := range self.methods { |
||||||
|
methods[i] = k |
||||||
|
i++ |
||||||
|
} |
||||||
|
return methods |
||||||
|
} |
||||||
|
|
||||||
|
// Execute given request
|
||||||
|
func (self *dbApi) Execute(req *shared.Request) (interface{}, error) { |
||||||
|
if callback, ok := self.methods[req.Method]; ok { |
||||||
|
return callback(self, req) |
||||||
|
} |
||||||
|
|
||||||
|
return nil, &shared.NotImplementedError{req.Method} |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) Name() string { |
||||||
|
return DbApiName |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) ApiVersion() string { |
||||||
|
return DbApiversion |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) GetString(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(DbArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if err := args.requirements(); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
ret, err := self.xeth.DbGet([]byte(args.Database + args.Key)) |
||||||
|
return string(ret), err |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) PutString(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(DbArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if err := args.requirements(); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return self.xeth.DbPut([]byte(args.Database+args.Key), args.Value), nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) GetHex(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(DbHexArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if err := args.requirements(); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
if res, err := self.xeth.DbGet([]byte(args.Database + args.Key)); err == nil { |
||||||
|
return newHexData(res), nil |
||||||
|
} else { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (self *dbApi) PutHex(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(DbHexArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if err := args.requirements(); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return self.xeth.DbPut([]byte(args.Database+args.Key), args.Value), nil |
||||||
|
} |
@ -0,0 +1,110 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/json" |
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common" |
||||||
|
"github.com/ethereum/go-ethereum/rpc/shared" |
||||||
|
) |
||||||
|
|
||||||
|
type DbArgs struct { |
||||||
|
Database string |
||||||
|
Key string |
||||||
|
Value []byte |
||||||
|
} |
||||||
|
|
||||||
|
func (args *DbArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
var obj []interface{} |
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if len(obj) < 2 { |
||||||
|
return shared.NewInsufficientParamsError(len(obj), 2) |
||||||
|
} |
||||||
|
|
||||||
|
var objstr string |
||||||
|
var ok bool |
||||||
|
|
||||||
|
if objstr, ok = obj[0].(string); !ok { |
||||||
|
return shared.NewInvalidTypeError("database", "not a string") |
||||||
|
} |
||||||
|
args.Database = objstr |
||||||
|
|
||||||
|
if objstr, ok = obj[1].(string); !ok { |
||||||
|
return shared.NewInvalidTypeError("key", "not a string") |
||||||
|
} |
||||||
|
args.Key = objstr |
||||||
|
|
||||||
|
if len(obj) > 2 { |
||||||
|
objstr, ok = obj[2].(string) |
||||||
|
if !ok { |
||||||
|
return shared.NewInvalidTypeError("value", "not a string") |
||||||
|
} |
||||||
|
|
||||||
|
args.Value = []byte(objstr) |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (a *DbArgs) requirements() error { |
||||||
|
if len(a.Database) == 0 { |
||||||
|
return shared.NewValidationError("Database", "cannot be blank") |
||||||
|
} |
||||||
|
if len(a.Key) == 0 { |
||||||
|
return shared.NewValidationError("Key", "cannot be blank") |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
type DbHexArgs struct { |
||||||
|
Database string |
||||||
|
Key string |
||||||
|
Value []byte |
||||||
|
} |
||||||
|
|
||||||
|
func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
var obj []interface{} |
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if len(obj) < 2 { |
||||||
|
return shared.NewInsufficientParamsError(len(obj), 2) |
||||||
|
} |
||||||
|
|
||||||
|
var objstr string |
||||||
|
var ok bool |
||||||
|
|
||||||
|
if objstr, ok = obj[0].(string); !ok { |
||||||
|
return shared.NewInvalidTypeError("database", "not a string") |
||||||
|
} |
||||||
|
args.Database = objstr |
||||||
|
|
||||||
|
if objstr, ok = obj[1].(string); !ok { |
||||||
|
return shared.NewInvalidTypeError("key", "not a string") |
||||||
|
} |
||||||
|
args.Key = objstr |
||||||
|
|
||||||
|
if len(obj) > 2 { |
||||||
|
objstr, ok = obj[2].(string) |
||||||
|
if !ok { |
||||||
|
return shared.NewInvalidTypeError("value", "not a string") |
||||||
|
} |
||||||
|
|
||||||
|
args.Value = common.FromHex(objstr) |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (a *DbHexArgs) requirements() error { |
||||||
|
if len(a.Database) == 0 { |
||||||
|
return shared.NewValidationError("Database", "cannot be blank") |
||||||
|
} |
||||||
|
if len(a.Key) == 0 { |
||||||
|
return shared.NewValidationError("Key", "cannot be blank") |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
const Db_JS = ` |
||||||
|
web3._extend({ |
||||||
|
property: 'db', |
||||||
|
methods: |
||||||
|
[ |
||||||
|
new web3._extend.Method({ |
||||||
|
name: 'getString', |
||||||
|
call: 'db_getString', |
||||||
|
params: 2, |
||||||
|
inputFormatter: [web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString], |
||||||
|
outputFormatter: web3._extend.formatters.formatOutputString |
||||||
|
}), |
||||||
|
new web3._extend.Method({ |
||||||
|
name: 'putString', |
||||||
|
call: 'db_putString', |
||||||
|
params: 3, |
||||||
|
inputFormatter: [web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString], |
||||||
|
outputFormatter: web3._extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3._extend.Method({ |
||||||
|
name: 'getHex', |
||||||
|
call: 'db_getHex', |
||||||
|
params: 2, |
||||||
|
inputFormatter: [web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString], |
||||||
|
outputFormatter: web3._extend.formatters.formatOutputString |
||||||
|
}), |
||||||
|
new web3._extend.Method({ |
||||||
|
name: 'putHex', |
||||||
|
call: 'db_putHex', |
||||||
|
params: 3, |
||||||
|
inputFormatter: [web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString, web3._extend.formatters.formatInputString], |
||||||
|
outputFormatter: web3._extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
], |
||||||
|
properties: |
||||||
|
[ |
||||||
|
] |
||||||
|
}); |
||||||
|
` |
Loading…
Reference in new issue