2021-02-01 18:12:51 +01:00
# standard imports
import logging
2021-03-24 15:52:52 +01:00
# external imports
2021-02-01 18:12:51 +01:00
from sqlalchemy import Column , String , Text
2021-03-24 15:52:52 +01:00
from chainlib . eth . constant import ZERO_ADDRESS
2021-02-01 18:12:51 +01:00
# local imports
from . base import SessionBase
logg = logging . getLogger ( )
class AccountRole ( SessionBase ) :
""" Key-value store providing plaintext tags for Ethereum addresses.
Address is initialized to the zero - address
: param tag : Tag
: type tag : str
"""
__tablename__ = ' account_role '
tag = Column ( Text )
address_hex = Column ( String ( 42 ) )
2021-02-21 16:41:37 +01:00
# TODO:
2021-02-01 18:12:51 +01:00
@staticmethod
2021-02-21 16:41:37 +01:00
def get_address ( tag , session ) :
2021-02-01 18:12:51 +01:00
""" Get Ethereum address matching the given tag
: param tag : Tag
: type tag : str
: returns : Ethereum address , or zero - address if tag does not exist
: rtype : str , 0 x - hex
"""
2021-02-21 16:41:37 +01:00
if session == None :
raise ValueError ( ' nested bind session calls will not succeed as the first call to release_session in the stack will leave the db object detached further down the stack. We will need additional reference count. ' )
session = SessionBase . bind_session ( session )
2021-03-01 21:15:17 +01:00
role = AccountRole . __get_role ( tag , session )
2021-02-21 16:41:37 +01:00
2021-03-24 15:52:52 +01:00
r = ZERO_ADDRESS
2021-02-21 16:41:37 +01:00
if role != None :
r = role . address_hex
2021-03-01 21:15:17 +01:00
session . flush ( )
2021-02-21 16:41:37 +01:00
SessionBase . release_session ( session )
return r
2021-02-01 18:12:51 +01:00
@staticmethod
2021-02-21 16:41:37 +01:00
def get_role ( tag , session = None ) :
2021-02-01 18:12:51 +01:00
""" Get AccountRole model object matching the given tag
: param tag : Tag
: type tag : str
: returns : Role object , if found
: rtype : cic_eth . db . models . role . AccountRole
"""
2021-02-21 16:41:37 +01:00
session = SessionBase . bind_session ( session )
role = AccountRole . __get_role ( tag , session )
2021-03-01 21:15:17 +01:00
session . flush ( )
2021-02-21 16:41:37 +01:00
SessionBase . release_session ( session )
2021-02-01 18:12:51 +01:00
return role
@staticmethod
2021-02-21 16:41:37 +01:00
def __get_role ( tag , session ) :
q = session . query ( AccountRole )
q = q . filter ( AccountRole . tag == tag )
r = q . first ( )
return r
2021-02-01 18:12:51 +01:00
@staticmethod
2021-02-21 16:41:37 +01:00
def set ( tag , address_hex , session = None ) :
2021-02-01 18:12:51 +01:00
""" Persist a tag to Ethereum address association.
This will silently overwrite the existing value .
: param tag : Tag
: type tag : str
: param address_hex : Ethereum address
: type address_hex : str , 0 x - hex
: returns : Role object
: rtype : cic_eth . db . models . role . AccountRole
"""
2021-02-21 16:41:37 +01:00
session = SessionBase . bind_session ( session )
2021-03-01 21:15:17 +01:00
role = AccountRole . __get_role ( tag , session )
2021-02-01 18:12:51 +01:00
if role == None :
role = AccountRole ( tag )
role . address_hex = address_hex
2021-03-01 21:15:17 +01:00
session . flush ( )
2021-02-21 16:41:37 +01:00
SessionBase . release_session ( session )
return role
2021-02-01 18:12:51 +01:00
@staticmethod
def role_for ( address , session = None ) :
""" Retrieve role for the given address
: param address : Ethereum address to match role for
: type address : str , 0 x - hex
: returns : Role tag , or None if no match
: rtype : str or None
"""
2021-02-21 16:41:37 +01:00
session = SessionBase . bind_session ( session )
2021-02-01 18:12:51 +01:00
2021-02-21 16:41:37 +01:00
q = session . query ( AccountRole )
2021-02-01 18:12:51 +01:00
q = q . filter ( AccountRole . address_hex == address )
role = q . first ( )
tag = None
if role != None :
tag = role . tag
2021-02-21 16:41:37 +01:00
SessionBase . release_session ( session )
2021-02-01 18:12:51 +01:00
return tag
def __init__ ( self , tag ) :
self . tag = tag
2021-03-24 15:52:52 +01:00
self . address_hex = ZERO_ADDRESS