109 lines
3.4 KiB
Go
109 lines
3.4 KiB
Go
|
package repositories
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
|
||
|
"github.com/8thlight/vulcanizedb/core"
|
||
|
"github.com/jmoiron/sqlx"
|
||
|
_ "github.com/lib/pq"
|
||
|
)
|
||
|
|
||
|
type Postgres struct {
|
||
|
Db *sqlx.DB
|
||
|
}
|
||
|
|
||
|
func NewPostgres(db *sqlx.DB) Postgres {
|
||
|
return Postgres{Db: db}
|
||
|
}
|
||
|
|
||
|
func (repository Postgres) FindBlockByNumber(blockNumber int64) *core.Block {
|
||
|
blockRows, _ := repository.Db.Query("SELECT id, block_number, block_gaslimit, block_gasused, block_time, block_difficulty, block_hash, block_nonce, block_parenthash, block_size, uncle_hash FROM blocks")
|
||
|
var savedBlocks []core.Block
|
||
|
for blockRows.Next() {
|
||
|
savedBlock := repository.loadBlock(blockRows)
|
||
|
savedBlocks = append(savedBlocks, savedBlock)
|
||
|
}
|
||
|
if len(savedBlocks) > 0 {
|
||
|
return &savedBlocks[0]
|
||
|
} else {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (repository Postgres) BlockCount() int {
|
||
|
var count int
|
||
|
repository.Db.Get(&count, "SELECT COUNT(*) FROM blocks")
|
||
|
return count
|
||
|
}
|
||
|
|
||
|
func (repository Postgres) CreateBlock(block core.Block) {
|
||
|
insertedBlock := repository.Db.QueryRow(
|
||
|
"Insert INTO blocks "+
|
||
|
"(block_number, block_gaslimit, block_gasused, block_time, block_difficulty, block_hash, block_nonce, block_parenthash, block_size, uncle_hash) "+
|
||
|
"VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id",
|
||
|
block.Number, block.GasLimit, block.GasUsed, block.Time, block.Difficulty, block.Hash, block.Nonce, block.ParentHash, block.Size, block.UncleHash)
|
||
|
var blockId int64
|
||
|
insertedBlock.Scan(&blockId)
|
||
|
repository.createTransactions(blockId, block.Transactions)
|
||
|
}
|
||
|
|
||
|
func (repository Postgres) createTransactions(blockId int64, transactions []core.Transaction) {
|
||
|
for _, transaction := range transactions {
|
||
|
repository.Db.MustExec("Insert INTO transactions "+
|
||
|
"(block_id, tx_hash, tx_nonce, tx_to, tx_gaslimit, tx_gasprice, tx_value) VALUES ($1, $2, $3, $4, $5, $6, $7)",
|
||
|
blockId, transaction.Hash, transaction.Nonce, transaction.To, transaction.GasLimit, transaction.GasPrice, transaction.Value)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (repository Postgres) loadBlock(blockRows *sql.Rows) core.Block {
|
||
|
var blockId int64
|
||
|
var blockHash string
|
||
|
var blockNonce string
|
||
|
var blockNumber int64
|
||
|
var blockParentHash string
|
||
|
var blockSize int64
|
||
|
var blockTime float64
|
||
|
var difficulty int64
|
||
|
var gasLimit float64
|
||
|
var gasUsed float64
|
||
|
var uncleHash string
|
||
|
blockRows.Scan(&blockId, &blockNumber, &gasLimit, &gasUsed, &blockTime, &difficulty, &blockHash, &blockNonce, &blockParentHash, &blockSize, &uncleHash)
|
||
|
transactions := repository.loadTransactions(blockId)
|
||
|
return core.Block{
|
||
|
Difficulty: difficulty,
|
||
|
GasLimit: int64(gasLimit),
|
||
|
GasUsed: int64(gasUsed),
|
||
|
Hash: blockHash,
|
||
|
Nonce: blockNonce,
|
||
|
Number: blockNumber,
|
||
|
ParentHash: blockParentHash,
|
||
|
Size: blockSize,
|
||
|
Time: int64(blockTime),
|
||
|
Transactions: transactions,
|
||
|
UncleHash: uncleHash,
|
||
|
}
|
||
|
}
|
||
|
func (repository Postgres) loadTransactions(blockId int64) []core.Transaction {
|
||
|
transactionRows, _ := repository.Db.Query("SELECT tx_hash, tx_nonce, tx_to, tx_gaslimit, tx_gasprice, tx_value FROM transactions")
|
||
|
var transactions []core.Transaction
|
||
|
for transactionRows.Next() {
|
||
|
var hash string
|
||
|
var nonce uint64
|
||
|
var to string
|
||
|
var gasLimit int64
|
||
|
var gasPrice int64
|
||
|
var value int64
|
||
|
transactionRows.Scan(&hash, &nonce, &to, &gasLimit, &gasPrice, &value)
|
||
|
transaction := core.Transaction{
|
||
|
Hash: hash,
|
||
|
Nonce: nonce,
|
||
|
To: to,
|
||
|
GasLimit: gasLimit,
|
||
|
GasPrice: gasPrice,
|
||
|
Value: value,
|
||
|
}
|
||
|
transactions = append(transactions, transaction)
|
||
|
}
|
||
|
return transactions
|
||
|
}
|