Skip to content

Commit

Permalink
fix: ethhashlookup: clean-up query management and lifecycle
Browse files Browse the repository at this point in the history
  • Loading branch information
rvagg authored and ribasushi committed Jul 24, 2024
1 parent 2dc4994 commit 3f7e49e
Showing 1 changed file with 70 additions and 28 deletions.
98 changes: 70 additions & 28 deletions chain/ethhashlookup/eth_transaction_hash_lookup.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,29 +29,77 @@ var ddls = []string{
}

const (
insertTxHash = `INSERT INTO eth_tx_hashes
(hash, cid)
VALUES(?, ?)
ON CONFLICT (hash) DO UPDATE SET insertion_time = CURRENT_TIMESTAMP`
insertTxHash = `INSERT INTO eth_tx_hashes (hash, cid) VALUES(?, ?) ON CONFLICT (hash) DO UPDATE SET insertion_time = CURRENT_TIMESTAMP`
getCidFromHash = `SELECT cid FROM eth_tx_hashes WHERE hash = ?`
getHashFromCid = `SELECT hash FROM eth_tx_hashes WHERE cid = ?`
deleteOlderThan = `DELETE FROM eth_tx_hashes WHERE insertion_time < datetime('now', ?);`
)

type EthTxHashLookup struct {
db *sql.DB

stmtInsertTxHash *sql.Stmt
stmtGetCidFromHash *sql.Stmt
stmtGetHashFromCid *sql.Stmt
stmtDeleteOlderThan *sql.Stmt
}

func (ei *EthTxHashLookup) UpsertHash(txHash ethtypes.EthHash, c cid.Cid) error {
hashEntry, err := ei.db.Prepare(insertTxHash)
func NewTransactionHashLookup(ctx context.Context, path string) (*EthTxHashLookup, error) {
db, _, err := sqlite.Open(path)
if err != nil {
return xerrors.Errorf("prepare insert event: %w", err)
return nil, xerrors.Errorf("failed to setup eth transaction hash lookup db: %w", err)
}

if err := sqlite.InitDb(ctx, "eth transaction hash lookup", db, ddls, []sqlite.MigrationFunc{}); err != nil {
_ = db.Close()
return nil, xerrors.Errorf("failed to init eth transaction hash lookup db: %w", err)
}

ei := &EthTxHashLookup{db: db}

if err = ei.initStatements(); err != nil {
_ = ei.Close()
return nil, xerrors.Errorf("error preparing eth transaction hash lookup db statements: %w", err)
}

return ei, nil
}

func (ei *EthTxHashLookup) initStatements() (err error) {
ei.stmtInsertTxHash, err = ei.db.Prepare(insertTxHash)
if err != nil {
return xerrors.Errorf("prepare stmtInsertTxHash: %w", err)
}
ei.stmtGetCidFromHash, err = ei.db.Prepare(getCidFromHash)
if err != nil {
return xerrors.Errorf("prepare stmtGetCidFromHash: %w", err)
}
ei.stmtGetHashFromCid, err = ei.db.Prepare(getHashFromCid)
if err != nil {
return xerrors.Errorf("prepare stmtGetHashFromCid: %w", err)
}
ei.stmtDeleteOlderThan, err = ei.db.Prepare(deleteOlderThan)
if err != nil {
return xerrors.Errorf("prepare stmtDeleteOlderThan: %w", err)
}
return nil
}

func (ei *EthTxHashLookup) UpsertHash(txHash ethtypes.EthHash, c cid.Cid) error {
if ei.db == nil {
return xerrors.New("db closed")
}

_, err = hashEntry.Exec(txHash.String(), c.String())
_, err := ei.stmtInsertTxHash.Exec(txHash.String(), c.String())
return err
}

func (ei *EthTxHashLookup) GetCidFromHash(txHash ethtypes.EthHash) (cid.Cid, error) {
row := ei.db.QueryRow("SELECT cid FROM eth_tx_hashes WHERE hash = :hash;", sql.Named("hash", txHash.String()))
if ei.db == nil {
return cid.Undef, xerrors.New("db closed")
}

row := ei.stmtGetCidFromHash.QueryRow(txHash.String())
var c string
err := row.Scan(&c)
if err != nil {
Expand All @@ -64,8 +112,11 @@ func (ei *EthTxHashLookup) GetCidFromHash(txHash ethtypes.EthHash) (cid.Cid, err
}

func (ei *EthTxHashLookup) GetHashFromCid(c cid.Cid) (ethtypes.EthHash, error) {
row := ei.db.QueryRow("SELECT hash FROM eth_tx_hashes WHERE cid = :cid;", sql.Named("cid", c.String()))
if ei.db == nil {
return ethtypes.EmptyEthHash, xerrors.New("db closed")
}

row := ei.stmtGetHashFromCid.QueryRow(c.String())
var hashString string
err := row.Scan(&c)
if err != nil {
Expand All @@ -78,31 +129,22 @@ func (ei *EthTxHashLookup) GetHashFromCid(c cid.Cid) (ethtypes.EthHash, error) {
}

func (ei *EthTxHashLookup) DeleteEntriesOlderThan(days int) (int64, error) {
res, err := ei.db.Exec("DELETE FROM eth_tx_hashes WHERE insertion_time < datetime('now', ?);", "-"+strconv.Itoa(days)+" day")
if err != nil {
return 0, err
if ei.db == nil {
return 0, xerrors.New("db closed")
}

return res.RowsAffected()
}

func NewTransactionHashLookup(ctx context.Context, path string) (*EthTxHashLookup, error) {
db, _, err := sqlite.Open(path)
res, err := ei.stmtDeleteOlderThan.Exec("-" + strconv.Itoa(days) + " day")
if err != nil {
return nil, xerrors.Errorf("failed to setup eth transaction hash lookup db: %w", err)
}

if err := sqlite.InitDb(ctx, "eth transaction hash lookup", db, ddls, []sqlite.MigrationFunc{}); err != nil {
_ = db.Close()
return nil, xerrors.Errorf("failed to init eth transaction hash lookup db: %w", err)
return 0, err
}

return &EthTxHashLookup{db: db}, nil
return res.RowsAffected()
}

func (ei *EthTxHashLookup) Close() error {
func (ei *EthTxHashLookup) Close() (err error) {
if ei.db == nil {
return nil
}
return ei.db.Close()
db := ei.db
ei.db = nil
return db.Close()
}

0 comments on commit 3f7e49e

Please sign in to comment.