(dbID proto.DatabaseID, h *hash.Hash)
| 509 | } |
| 510 | |
| 511 | func (s *Service) getResponseHeader(dbID proto.DatabaseID, h *hash.Hash) (response *types.SignedResponseHeader, err error) { |
| 512 | var ( |
| 513 | blockHeight int32 |
| 514 | dataOffset int32 |
| 515 | ) |
| 516 | |
| 517 | err = s.db.Writer().QueryRow(getResponseByHashSQL, string(dbID), h.String()).Scan(&blockHeight, &dataOffset) |
| 518 | if err != nil { |
| 519 | if errors.Cause(err) == sql.ErrNoRows { |
| 520 | err = ErrNotFound |
| 521 | return |
| 522 | } |
| 523 | |
| 524 | err = errors.Wrapf(err, "query response failed: %s, %s", dbID, h.String()) |
| 525 | return |
| 526 | } |
| 527 | |
| 528 | // get data from block |
| 529 | var b *types.Block |
| 530 | if _, b, err = s.getBlockByHeight(dbID, blockHeight); err != nil { |
| 531 | return |
| 532 | } |
| 533 | |
| 534 | if dataOffset < 0 || int32(len(b.QueryTxs)) <= dataOffset { |
| 535 | err = ErrInconsistentData |
| 536 | return |
| 537 | } |
| 538 | |
| 539 | response = b.QueryTxs[int(dataOffset)].Response |
| 540 | |
| 541 | // verify hash |
| 542 | respHash := response.Hash() |
| 543 | if !respHash.IsEqual(h) { |
| 544 | err = ErrInconsistentData |
| 545 | } |
| 546 | |
| 547 | return |
| 548 | } |
| 549 | |
| 550 | func (s *Service) getHighestBlock(dbID proto.DatabaseID) (height int32, b *types.Block, err error) { |
| 551 | var ( |
no test coverage detected