Skip to content

Commit

Permalink
Do not use formatted string in query for binary hashes
Browse files Browse the repository at this point in the history
  • Loading branch information
boecklim committed Dec 12, 2023
1 parent c56f802 commit 2d95227
Showing 1 changed file with 33 additions and 32 deletions.
65 changes: 33 additions & 32 deletions blocktx/store/sql/get_transaction_blocks.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package sql

import (
"database/sql"
"encoding/hex"
"fmt"
"github.com/lib/pq"
"strings"

"github.com/bitcoin-sv/arc/blocktx/blocktx_api"
Expand All @@ -13,33 +15,24 @@ import (

const (
queryGetBlockHashHeightForTxHashesPostgres = `
SELECT
b.hash, b.height, t.hash
FROM blocks b
INNER JOIN block_transactions_map m ON m.blockid = b.id
INNER JOIN transactions t ON m.txid = t.id
WHERE t.hash in (%s)
AND b.orphanedyn = FALSE`
SELECT
b.hash, b.height, t.hash
FROM blocks b
INNER JOIN block_transactions_map m ON m.blockid = b.id
INNER JOIN transactions t ON m.txid = t.id
WHERE t.hash = ANY($1)
AND b.orphanedyn = FALSE`

queryGetBlockHashHeightForTxHashesSQLite = `
SELECT
b.hash, b.height, t.hash
FROM blocks b
INNER JOIN block_transactions_map m ON m.blockid = b.id
INNER JOIN transactions t ON m.txid = t.id
WHERE HEX(t.hash) in ('%s')
AND b.orphanedyn = FALSE`
SELECT
b.hash, b.height, t.hash
FROM blocks b
INNER JOIN block_transactions_map m ON m.blockid = b.id
INNER JOIN transactions t ON m.txid = t.id
WHERE HEX(t.hash) in ('%s')
AND b.orphanedyn = FALSE`
)

func getQueryPostgres(transactions *blocktx_api.Transactions) string {
var result []string
for _, v := range transactions.Transactions {
result = append(result, fmt.Sprintf("decode('%x', 'hex')", (v.Hash)))
}

return fmt.Sprintf(queryGetBlockHashHeightForTxHashesPostgres, strings.Join(result, ","))
}

func getQuerySQLite(transactions *blocktx_api.Transactions) string {
var result []string
for _, v := range transactions.Transactions {
Expand All @@ -58,24 +51,32 @@ func (s *SQL) GetTransactionBlocks(ctx context.Context, transactions *blocktx_ap
defer cancel()

results := &blocktx_api.TransactionBlocks{}
var query string
var rows *sql.Rows
var err error

switch s.engine {
case sqliteEngine:
query = getQuerySQLite(transactions)
fallthrough
case sqliteMemoryEngine:
query = getQuerySQLite(transactions)
rows, err = s.db.QueryContext(ctx, getQuerySQLite(transactions))
if err != nil {
return nil, err
}
case postgresEngine:
query = getQueryPostgres(transactions)
var hashSlice [][]byte
for _, tx := range transactions.Transactions {
hashSlice = append(hashSlice, tx.Hash)
}

rows, err = s.db.QueryContext(ctx, queryGetBlockHashHeightForTxHashesPostgres, pq.Array(hashSlice))
if err != nil {
return nil, err
}

default:
return nil, fmt.Errorf("engine not supported: %s", s.engine)
}

rows, err := s.db.QueryContext(ctx, query)
if err != nil {
return nil, err
}

defer rows.Close()

for rows.Next() {
Expand Down

0 comments on commit 2d95227

Please sign in to comment.