From 9cbc98593eab565bb395901634d697855a4288cd Mon Sep 17 00:00:00 2001 From: kuba-4chain Date: Fri, 30 Aug 2024 14:22:49 +0200 Subject: [PATCH] feat: improve and refactor blocktx store queries --- .../blocktx/store/postgresql/get_block.go | 41 +++++++++++---- .../store/postgresql/get_block_by_height.go | 50 ------------------- .../blocktx/store/postgresql/get_chain_tip.go | 50 ------------------- 3 files changed, 30 insertions(+), 111 deletions(-) delete mode 100644 internal/blocktx/store/postgresql/get_block_by_height.go delete mode 100644 internal/blocktx/store/postgresql/get_chain_tip.go diff --git a/internal/blocktx/store/postgresql/get_block.go b/internal/blocktx/store/postgresql/get_block.go index ab38f184d..7537a1b8c 100644 --- a/internal/blocktx/store/postgresql/get_block.go +++ b/internal/blocktx/store/postgresql/get_block.go @@ -11,25 +11,44 @@ import ( ) func (p *PostgreSQL) GetBlock(ctx context.Context, hash *chainhash.Hash) (*blocktx_api.Block, error) { + predicate := "WHERE hash = $1" + + return p.queryBlockByPredicate(ctx, predicate, hash[:]) +} + +func (p *PostgreSQL) GetBlockByHeight(ctx context.Context, height uint64, status blocktx_api.Status) (*blocktx_api.Block, error) { + predicate := "WHERE height = $1 AND status = $2" + + return p.queryBlockByPredicate(ctx, predicate, height, status) +} + +func (p *PostgreSQL) GetChainTip(ctx context.Context) (*blocktx_api.Block, error) { + predicate := "WHERE height = (SELECT MAX(height) FROM blocktx.blocks blks WHERE blks.status = $1)" + + return p.queryBlockByPredicate(ctx, predicate, blocktx_api.Status_LONGEST) +} + +func (p *PostgreSQL) queryBlockByPredicate(ctx context.Context, predicate string, predicateParams ...any) (*blocktx_api.Block, error) { q := ` SELECT - b.hash, - b.prevhash, - b.merkleroot, - b.height, - b.processed_at, - b.orphanedyn, - b.status, - b.chainwork - FROM blocktx.blocks b - WHERE b.hash = $1 + hash + ,prevhash + ,merkleroot + ,height + ,processed_at + ,orphanedyn + ,status + ,chainwork + FROM blocktx.blocks ` + q += " " + predicate + var block blocktx_api.Block var processed_at sql.NullString - if err := p.db.QueryRowContext(ctx, q, hash[:]).Scan( + if err := p.db.QueryRowContext(ctx, q, predicateParams...).Scan( &block.Hash, &block.PreviousHash, &block.MerkleRoot, diff --git a/internal/blocktx/store/postgresql/get_block_by_height.go b/internal/blocktx/store/postgresql/get_block_by_height.go deleted file mode 100644 index d608b9fa5..000000000 --- a/internal/blocktx/store/postgresql/get_block_by_height.go +++ /dev/null @@ -1,50 +0,0 @@ -package postgresql - -import ( - "context" - "database/sql" - "errors" - - "github.com/bitcoin-sv/arc/internal/blocktx/blocktx_api" - "github.com/bitcoin-sv/arc/internal/blocktx/store" -) - -func (p *PostgreSQL) GetBlockByHeight(ctx context.Context, height uint64, status blocktx_api.Status) (*blocktx_api.Block, error) { - q := ` - SELECT - b.hash, - b.prevhash, - b.merkleroot, - b.height, - b.processed_at, - b.orphanedyn, - b.status, - b.chainwork - FROM blocktx.blocks b - WHERE b.height = $1 AND b.status = $2 - ` - - var block blocktx_api.Block - - var processed_at sql.NullString - - if err := p.db.QueryRowContext(ctx, q, height, status).Scan( - &block.Hash, - &block.PreviousHash, - &block.MerkleRoot, - &block.Height, - &processed_at, - &block.Orphaned, - &block.Status, - &block.Chainwork, - ); err != nil { - if errors.Is(err, sql.ErrNoRows) { - return nil, store.ErrBlockNotFound - } - return nil, err - } - - block.Processed = processed_at.Valid - - return &block, nil -} diff --git a/internal/blocktx/store/postgresql/get_chain_tip.go b/internal/blocktx/store/postgresql/get_chain_tip.go deleted file mode 100644 index 166718208..000000000 --- a/internal/blocktx/store/postgresql/get_chain_tip.go +++ /dev/null @@ -1,50 +0,0 @@ -package postgresql - -import ( - "context" - "database/sql" - "errors" - - "github.com/bitcoin-sv/arc/internal/blocktx/blocktx_api" - "github.com/bitcoin-sv/arc/internal/blocktx/store" -) - -func (p *PostgreSQL) GetChainTip(ctx context.Context) (*blocktx_api.Block, error) { - q := ` - SELECT - b.hash, - b.prevhash, - b.merkleroot, - b.height, - b.processed_at, - b.orphanedyn, - b.status, - b.chainwork - FROM blocktx.blocks b - WHERE b.height = (SELECT MAX(height) FROM blocktx.blocks blks WHERE blks.status = $1) - ` - - var block blocktx_api.Block - - var processed_at sql.NullString - - if err := p.db.QueryRowContext(ctx, q, blocktx_api.Status_LONGEST).Scan( - &block.Hash, - &block.PreviousHash, - &block.MerkleRoot, - &block.Height, - &processed_at, - &block.Orphaned, - &block.Status, - &block.Chainwork, - ); err != nil { - if errors.Is(err, sql.ErrNoRows) { - return nil, store.ErrBlockNotFound - } - return nil, err - } - - block.Processed = processed_at.Valid - - return &block, nil -}