o
    ۢi
                     @  s   d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZ ejZdadadd	 ZdddZdddZdddZdddZdS )    )annotations)Any)create_enginetext)SQLAlchemyError)Sessionsessionmaker)ConfigNc                   C  s   t d u rttdddda t S )NTi  )pool_pre_pingpool_recyclefuture)_enginer   CONTROL_DATABASE_URL r   r   config/control_plane.pyget_control_plane_engine   s   r   returnr   c                   C  s    t d u rtt dddda t  S )NFT)bind
autocommit	autoflushr   )_SessionFactoryr   r   r   r   r   r   get_control_plane_session   s   r   hostname
str | Nonec                 C  s\   | sd S |    }|sd S d|v r|ddd }|ddd }|ddd }|p-d S )Nz://   /r   :)striplowersplit)r   valuer   r   r   _normalize_hostname*   s   r!   dict[str, Any] | Nonec                 C  s   t | }|sd S d }z:z$t }|tdd|i  }|r#t|nd W W |d ur/|  S S  tyD   Y W |d urB|  d S d S w |d urN|  w w )Nz
                SELECT td.tenant_id, td.routing_key, td.domain
                FROM tenant_domains td
                WHERE td.domain = :domain
                LIMIT 1
                domain)	r!   r   executer   mappingsfirstdictcloser   )r   
normalizedsessionrowr   r   r   resolve_tenant_by_host7   s6   


r,   routing_keyc                 C  s   | sd S d }z:z$t  }|tdd| i  }|rt|nd W W |d ur+|  S S  ty@   Y W |d ur>|  d S d S w |d urJ|  w w )Na3  
                SELECT tenant_id, routing_key, server_role, tenant_db_name, files_base_path
                FROM tenant_assignments
                WHERE routing_key = :routing_key
                ORDER BY CASE WHEN server_role = 'primary' THEN 0 ELSE 1 END, id ASC
                LIMIT 1
                r-   )r   r$   r   r%   r&   r'   r(   r   )r-   r*   r+   r   r   r   get_tenant_assignmentR   s4   	

r.   )r   r   )r   r   r   r   )r   r   r   r"   )r-   r   r   r"   )
__future__r   typingr   
sqlalchemyr   r   sqlalchemy.excr   sqlalchemy.ormr   r   config.baser	   CONTROL_SQLALCHEMY_DATABASE_URIr   r   r   r   r   r!   r,   r.   r   r   r   r   <module>   s    


