swarm/api: Add all lookup types + public getblock

This commit is contained in:
lash 2018-01-19 17:08:04 +01:00
parent 13543f40c9
commit 81ec1f9694
4 changed files with 55 additions and 13 deletions

View file

@ -364,8 +364,23 @@ func (self *Api) BuildDirectoryTree(mhash string, nameresolver bool) (key storag
return key, manifestEntryMap, nil return key, manifestEntryMap, nil
} }
func (self *Api) DbLookupLatest(name string) (io.ReadSeeker, error) { // Look up mutable resource updates at specific periods and versions
_, err := self.resource.LookupLatest(name, true) func (self *Api) DbLookup(name string, period uint32, version uint32) (io.ReadSeeker, error) {
var err error
if version != 0 {
if period == 0 {
currentblocknumber, err := self.resource.GetBlock()
if err != nil {
return nil, fmt.Errorf("Could not determine latest block: %v", err)
}
period = self.resource.BlockToPeriod(name, currentblocknumber)
}
_, err = self.resource.LookupVersion(name, period, version, true)
} else if period != 0 {
_, err = self.resource.LookupHistorical(name, period, true)
} else {
_, err = self.resource.LookupLatest(name, true)
}
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -320,25 +320,48 @@ func (s *Server) HandlePostDb(w http.ResponseWriter, r *Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
// Retrieve mutable resource updates:
// bzz-db[-[immutable|-raw]]://<id> - get latest update
// bzz-db[-[immutable|-raw]]://<id>/<n> - get latest update on period n
// bzz-db[-[immutable|-raw]]://<id>/<n>/<m> - get update version m of period n
func (s *Server) HandleGetDb(w http.ResponseWriter, r *Request) { func (s *Server) HandleGetDb(w http.ResponseWriter, r *Request) {
w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Type", "application/octet-stream")
key, err := s.api.Resolve(r.uri)
if err != nil {
s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err))
return
}
_ = key
var params []string var params []string
if len(r.uri.Path) > 0 { if len(r.uri.Path) > 0 {
params = strings.Split(r.uri.Path, "/") params = strings.Split(r.uri.Path, "/")
} }
switch len(params) { switch len(params) {
case 0: case 0:
data, err := s.api.DbLookupLatest(r.uri.Addr) data, err := s.api.DbLookup(r.uri.Addr)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
break break
} case 2:
http.ServeContent(w, &r.Request, "", time.Now(), data) strconv.ParseUint(params[1], 10, 32)
case 1:
strconv.ParseUint(params[0], 10, 32)
break break
default: default:
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
err = "params 0-2"
} }
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
wrappedData := wrapDbContent(data, s.uri.Scheme)
http.ServeContent(w, &r.Request, "", time.Now(), data)
}
func wrapDbContent(data io.Reader, scheme *string) io.Reader {
} }
// HandleGet handles a GET request to // HandleGet handles a GET request to

View file

@ -69,7 +69,7 @@ func Parse(rawuri string) (*URI, error) {
// check the scheme is valid // check the scheme is valid
switch uri.Scheme { switch uri.Scheme {
case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzzr", "bzzi", "bzz-db": case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzzr", "bzzi", "bzz-db", "bzz-db-raw":
default: default:
return nil, fmt.Errorf("unknown scheme %q", u.Scheme) return nil, fmt.Errorf("unknown scheme %q", u.Scheme)
} }
@ -96,6 +96,10 @@ func (u *URI) Db() bool {
return u.Scheme == "bzz-db" return u.Scheme == "bzz-db"
} }
func (u *URI) DbRaw() bool {
return u.Scheme == "bzz-db-raw"
}
func (u *URI) Raw() bool { func (u *URI) Raw() bool {
return u.Scheme == "bzz-raw" return u.Scheme == "bzz-raw"
} }

View file

@ -231,7 +231,7 @@ func (self *ResourceHandler) NewResource(name string, frequency uint64) (*resour
} }
// get our blockheight at this time // get our blockheight at this time
currentblock, err := self.getBlock() currentblock, err := self.GetBlock()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -310,7 +310,7 @@ func (self *ResourceHandler) LookupLatest(name string, refresh bool) (*resource,
if err != nil { if err != nil {
return nil, err return nil, err
} }
currentblock, err := self.getBlock() currentblock, err := self.GetBlock()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -492,7 +492,7 @@ func (self *ResourceHandler) Update(name string, data []byte) (Key, error) {
} }
// get our blockheight at this time and the next block of the update period // get our blockheight at this time and the next block of the update period
currentblock, err := self.getBlock() currentblock, err := self.GetBlock()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -560,7 +560,7 @@ func (self *ResourceHandler) Close() {
self.ChunkStore.Close() self.ChunkStore.Close()
} }
func (self *ResourceHandler) getBlock() (uint64, error) { func (self *ResourceHandler) GetBlock() (uint64, error) {
// get the block height and convert to uint64 // get the block height and convert to uint64
var currentblock string var currentblock string
err := self.rpcClient.Call(&currentblock, "eth_blockNumber") err := self.rpcClient.Call(&currentblock, "eth_blockNumber")