moonstream/crawlers/mooncrawl/mooncrawl/state_crawler/db.py

93 wiersze
2.5 KiB
Python

import json
import logging
from typing import Any, Dict
from moonstreamdb.blockchain import AvailableBlockchainType, get_label_model
from sqlalchemy.orm import Session
from ..settings import VIEW_STATE_CRAWLER_LABEL
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def view_call_to_label(
blockchain_type: AvailableBlockchainType,
call: Dict[str, Any],
label_name=VIEW_STATE_CRAWLER_LABEL,
):
"""
Creates a label model.
"""
label_model = get_label_model(blockchain_type)
sanityzed_label_data = json.loads(
json.dumps(
{
"type": "view",
"name": call["name"],
"result": call["result"],
"inputs": call["inputs"],
"call_data": call["call_data"],
"status": call["status"],
}
).replace(r"\u0000", "")
)
label = label_model(
label=label_name,
label_data=sanityzed_label_data,
address=call["address"],
block_number=call["block_number"],
transaction_hash=None,
block_timestamp=call["block_timestamp"],
)
return label
def commit_session(db_session: Session) -> None:
"""
Save labels in the database.
"""
try:
logger.info("Committing session to database")
db_session.commit()
except Exception as e:
logger.error(f"Failed to save labels: {e}")
db_session.rollback()
raise e
def clean_labels(
db_session: Session,
blockchain_type: AvailableBlockchainType,
blocks_cutoff: int,
block_number: int,
) -> None:
"""
Remove all labels with the given name from the database.
"""
label_model = get_label_model(blockchain_type)
table = label_model.__tablename__
print(f"Cleaning labels from table {table}")
print(f"Current block number: {block_number} - blocks cutoff: {blocks_cutoff}")
print(f"Deleting labels with block_number < {block_number - blocks_cutoff}")
try:
logger.info("Removing labels from database")
query = db_session.query(label_model).filter(
label_model.label == VIEW_STATE_CRAWLER_LABEL,
label_model.block_number < block_number - blocks_cutoff,
)
result = query.delete(synchronize_session=False)
db_session.commit()
logger.info(f"Removed {result} rows from {table}")
except Exception as e:
logger.error(f"Failed to remove labels: {e}")
db_session.rollback()
raise e