o
    6	f                     @   s  d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ erfddlm Z  ddl!m"Z" ddl#m$Z$ G dd dZ%G dd de%ee Z&G dd de%ee Z'G dd deZ(dS )z#
CockroachDB-specific connections.
    N)AnyOptionalTypeUnionoverloadTYPE_CHECKING   )errors)AdaptContext)Row
RowFactoryAsyncRowFactoryTupleRow)Self)
Connection)AdaptersMap)ConnectionInfo)AsyncConnection   )adapters)PGconn)Cursor)AsyncCursorc                   @   st   e Zd ZU ee ed< ded< edeee	 e
e	 df defddZedefdd	ZedddZdddZdS )_CrdbConnectionMixin	_adaptersr   pgconnconnreturnc                 C   s"   t |ttfr
|j}t|dS )zS
        Return `!True` if the server connected to `!conn` is CockroachDB.
        s   crdb_version)
isinstancer   r   r   boolparameter_status)clsr    r"   P/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg/crdb/connection.pyis_crdb   s   z_CrdbConnectionMixin.is_crdbc                 C   s   | j stt| _ | j S N)r   r   r   selfr"   r"   r#   r   *   s   
z_CrdbConnectionMixin.adaptersCrdbConnectionInfoc                 C   s
   t | jS r%   )r(   r   r&   r"   r"   r#   info2   s   
z_CrdbConnectionMixin.infoNc                 C   s   |  | jrtdd S )Nz/CockroachDB doesn't support prepared statements)r$   r   eNotSupportedErrorr&   r"   r"   r#   
_check_tpc6   s   
z_CrdbConnectionMixin._check_tpc)r   r(   )r   N)__name__
__module____qualname__r   r   __annotations__classmethodr   r   r   r   r   r$   propertyr   r)   r,   r"   r"   r"   r#   r      s   
 r   c                       s   e Zd ZdZdZee	ddddddded	ed
ee	 de
e ddde
e dedeef ddfddZee	ddddddded	ede
e ddde
e dedeef ddfddZeddededef fddZ  ZS )CrdbConnectionz=
    Wrapper for a connection to a CockroachDB database.
    psycopg.crdb F   N
autocommitprepare_thresholdcursor_factorycontextconninfor8   row_factoryr9   r:   zOptional[Type[Cursor[Row]]]r;   kwargsr   zCrdbConnection[Row]c                K      d S r%   r"   )r!   r<   r8   r=   r9   r:   r;   r>   r"   r"   r#   connectE   s   zCrdbConnection.connectzOptional[Type[Cursor[Any]]]zCrdbConnection[TupleRow]c                K   r?   r%   r"   r!   r<   r8   r9   r:   r;   r>   r"   r"   r#   r@   S   s   c                    s   t  j|fi |S )zZ
        Connect to a database server and return a new `CrdbConnection` instance.
        superr@   r!   r<   r>   	__class__r"   r#   r@   `   s   r5   )r-   r.   r/   __doc__r   r1   strr   r   r   r   intr
   r   r@   r   r   __classcell__r"   r"   rE   r#   r3   ;   sj    	
	&r3   c                       s   e Zd ZdZdZee	ddddddded	ed
ee	 de
e dddee dede	ef ddfddZee	ddddddded	ed
ee	 dddee dede	ef ddfddZeddededef fddZ  ZS )AsyncCrdbConnectionzD
    Wrapper for an async connection to a CockroachDB database.
    r4   r5   Fr6   Nr7   r<   r8   r9   r=   r:   z Optional[Type[AsyncCursor[Row]]]r;   r>   r   zAsyncCrdbConnection[Row]c                      d S r%   r"   )r!   r<   r8   r9   r=   r:   r;   r>   r"   r"   r#   r@   r   s   zAsyncCrdbConnection.connectz Optional[Type[AsyncCursor[Any]]]zAsyncCrdbConnection[TupleRow]c                   rM   r%   r"   rA   r"   r"   r#   r@      s   c                    s   t  j|fi |I d H S r%   rB   rD   rE   r"   r#   r@      s   rG   )r-   r.   r/   rH   r   r1   rI   r   r   rJ   r   r   r
   r   r@   r   r   rK   r"   r"   rE   r#   rL   h   sj    	
	&rL   c                   @   sR   e Zd ZdZdZedefddZedefddZe	dede
e fd	d
ZdS )r(   zV
    `~psycopg.ConnectionInfo` subclass to get info about a CockroachDB database.
    r4   r   c                 C   s   dS )NCockroachDBr"   r&   r"   r"   r#   vendor   s   zCrdbConnectionInfo.vendorc                 C   s>   |  d}|std| |}|du rtd||S )z
        Return the CockroachDB server version connected.

        Return a number in the PostgreSQL format (e.g. 21.2.10 -> 210210).
        crdb_versionz''crdb_version' parameter status not setNz)couldn't parse CockroachDB version from: )r    r*   InternalErrorparse_crdb_versionInterfaceError)r'   sververr"   r"   r#   server_version   s   


z!CrdbConnectionInfo.server_versionrT   c                 C   sF   t d|}|s
d S t|dd t|dd  t|d S )Nz\bv(\d+)\.(\d+)\.(\d+)r   i'  r   d      )researchrJ   group)r'   rT   mr"   r"   r#   rR      s   2z%CrdbConnectionInfo.parse_crdb_versionN)r-   r.   r/   rH   r2   rI   rO   rJ   rV   r1   r   rR   r"   r"   r"   r#   r(      s    r(   ))rH   rY   typingr   r   r   r   r   r   r5   r	   r*   abcr
   rowsr   r   r   r   _compatr   
connectionr   _adapters_mapr   _connection_infor   connection_asyncr   _typesr   pq.abcr   cursorr   cursor_asyncr   r   r3   rL   r(   r"   r"   r"   r#   <module>   s(     !-*