
    h#                        d dl Z d dlZd dlZd dlT 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	 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Zn# e$ r dxZxZxZZY nw xY wej        d          dk    reZdZdZ G d de          Z G d de          Z G d de          Z G d de          Z  G d de          Z!	 	 ddZ" G d dee           Z#dS )     N)*)_atomic)_manual)ColumnMetadata)EnclosedNodeList)Entity)ForeignKeyMetadata)IndexMetadata)NodeList)_PooledPostgresqlDatabase)
ArrayField)BinaryJSONField)IntervalField   i a  CockroachDB does not support nested transactions. You may alternatively use the @transaction context-manager/decorator, which only wraps the outer-most block in transactional logic. To run a transaction with automatic retries, use the run_transaction() helper.c                       e Zd ZdS )ExceededMaxAttemptsN__name__
__module____qualname__     S/var/www/html/marketdash/venv/lib/python3.11/site-packages/playhouse/cockroachdb.pyr   r   #   s          r   r   c                   "     e Zd ZdZ fdZ xZS )UUIDKeyFieldTc                    |                     d          rt          dt          |           z            t          d          g|d<   |                    dd            t          t          |           j        |i | d S )Nconstraints%s cannot specify constraints.zDEFAULT gen_random_uuid()primary_keyT)get
ValueErrortypeSQL
setdefaultsuperr   __init__selfargskwargs	__class__s      r   r&   zUUIDKeyField.__init__)   s    ::m$$ 	L=T

JKKK!$%@!A!A B}-...*lD!!*D;F;;;;;r   )r   r   r   auto_incrementr&   __classcell__r+   s   @r   r   r   &   s=        N< < < < < < < < <r   r   c                   "     e Zd ZdZ fdZ xZS )
RowIDFieldINTc                     |                     d          rt          dt          |           z            t          d          g|d<    t	          t
          |           j        |i | d S )Nr   r   zDEFAULT unique_rowid())r    r!   r"   r#   r%   r0   r&   r'   s      r   r&   zRowIDField.__init__4   sp    ::m$$ 	L=T

JKKK!$%=!>!> ?}(j$($9&99999r   )r   r   r   
field_typer&   r-   r.   s   @r   r0   r0   1   s=        J: : : : : : : : :r   r0   c                        e Zd Zej                                        Ze                    ddi           dZ fdZ fdZ	ddZ
d fd	Zd	 Z fd
Zd Zd Zd fd	Zd fd	Z fdZ	 	 ddZ	 	 ddZ xZS )CockroachDatabaseBLOBBYTESTc                     d|vrC|rA|                     d          s,|                    dd           |                    dd            t          t          |           j        |g|R i | d S )Ndsnzpostgresql://userrootportif  )
startswithr$   r%   r5   r&   )r(   databaser)   r*   r+   s       r   r&   zCockroachDatabase.__init__C   s     H(0(;(;O(L(L ff---fe,,,/&&/J4JJJ6JJJJJr   c                    |                                 }|                    d           |                                \  }t          j        d|          }|Ddt          d |                                D                       z  }t          |          | _        d S t          t          |                               |           d S )Nzselect version()z#^CockroachDB.+?v(\d+)\.(\d+)\.(\d+)z
%d%02d%02dc              3   4   K   | ]}t          |          V  d S N)int).0is     r   	<genexpr>z8CockroachDatabase._set_server_version.<locals>.<genexpr>R   s(      (L(LAQ(L(L(L(L(L(Lr   )cursorexecutefetchonerematchtuplegroupsrB   server_versionr%   r5   _set_server_version)r(   conncursraw	match_objcleanr+   s         r   rN   z%CockroachDatabase._set_server_versionL   s    {{}}'(((}}HCSII	  5(L(L9I9I9K9K(L(L(L#L#LLE"%e**D #T**>>tDDDDDr   Nc                 |    d}|                      |||pddf          }|                                }|r|d         pd S )NzSELECT constraint_name FROM information_schema.table_constraints WHERE table_name = %s AND table_schema = %s AND constraint_type = %spubliczPRIMARY KEYr   )execute_sqlrH   )r(   tableschemaqueryrF   rows         r   _get_pk_constraintz$CockroachDatabase._get_pk_constraintX   sU    , !!%%1C8*7*9 : :oo~s1v%%r   c                     t          t          |                               ||          }|                     ||          fd|D             S )Nc                 .    g | ]}r|j         k    |S r   )name)rC   idxpkcs     r   
<listcomp>z1CockroachDatabase.get_indexes.<locals>.<listcomp>g   s%    IIIsICr   )r%   r5   get_indexesr[   )r(   rW   rX   indexesr`   r+   s       @r   rb   zCockroachDatabase.get_indexesb   sU     )400<<UFKK%%eV44IIIIwIIIIr   c                     |j         sd S |j                                         }|dv rt          d          S |dvrt          d          d S )NreplaceupsertUPSERT)ignorenothingupdatezfUn-supported action for conflict resolution. CockroachDB supports REPLACE (UPSERT), IGNORE and UPDATE.)_actionlowerr#   r!   )r(   on_conflictrY   actions       r   conflict_statementz$CockroachDatabase.conflict_statementi   sf    "*FF$**,,***x== ::: + , , , ;:r   c                    |j         r|j                                         nd}|dv ryt          d          g}|j        r1|                    t          d |j        D                                  |                    t          d                     t          |          S |dv rd S |j        rt          d          t          t          |                               ||          S )N )ri   rj   zON CONFLICTc                 Z    g | ](}t          |t                    rt          |          n|)S r   )
isinstance
basestringr   )rC   cols     r   ra   z5CockroachDatabase.conflict_update.<locals>.<listcomp>y   sA     /4 /4 /4 $.c:#>#>GF3KKKC/4 /4 /4r   z
DO NOTHINGre   zWCockroachDB does not support the usage of a constraint name. Use the column(s) instead.)rl   rm   r#   _conflict_targetappendr   r   _conflict_constraintr!   r%   r5   conflict_update)r(   ocrY   ro   partsr+   s        r   rz   z!CockroachDatabase.conflict_updatet   s   ')z9!!###r***''(E" 6- /4 /4!2/4 /4 /4 5 5 6 6 6 LL\**+++E??",,, F$ 	L K L L L &--==b%HHHr   c                 8    t                               ||          S rA   )fnextract)r(   	date_part
date_fields      r   extract_datezCockroachDatabase.extract_date   s    zz)Z000r   c                 R    |                     d                               d          S )NrB   timestamptz)cast)r(   r   s     r   from_timestampz CockroachDatabase.from_timestamp   s$     u%%**=999r   c                 V   t          t          |                                            |)|                                                     d|f           |S|                                }|dvrt          d          |                                                     d|z             d S d S )Nz$SET TRANSACTION AS OF SYSTEM TIME %s)lownormalhighz$priority must be low, normal or highzSET TRANSACTION PRIORITY %s)r%   r5   beginrF   rG   rm   r!   r(   system_timepriorityr+   s      r   r   zCockroachDatabase.begin   s    &&,,..."KKMM!!"H#..2 2 2~~''H888 !GHHHKKMM!!"?("JKKKKK	  r   c                     |                                  r|                                  | j        t          k     rt	          | ||          S t          t          |                               ||          S rA   )	is_closedconnectrM   NESTED_TX_MIN_VERSION_crdb_atomicr%   r5   atomicr   s      r   r   zCockroachDatabase.atomic   sa    >>+T\\^^^!666k8<<<&--44[(KKKr   c                     |                                  r|                                  | j        t          k     rt	          t
                    t          t          |                                           S rA   )	r   r   rM   r   NotImplementedErrorTXN_ERR_MSGr%   r5   	savepointr(   r+   s    r   r   zCockroachDatabase.savepoint   sY    >>+T\\^^^!666%k222&--77999r   c                       fd}|S )Nc                 P     t          j                    fd            }|S )Nc                  *    t                     S rA   run_transaction)cbmax_attemptsr   r(   r   s   r   new_fnzACockroachDatabase.retry_transaction.<locals>.deco.<locals>.new_fn   s     &tR{'/1 1 1r   )	functoolswraps)r   r   r   r   r(   r   s   ` r   decoz1CockroachDatabase.retry_transaction.<locals>.deco   sM    _R  1 1 1 1 1 1 1 1 ! 1 Mr   r   )r(   r   r   r   r   s   ```` r   retry_transactionz#CockroachDatabase.retry_transaction   s5    	 	 	 	 	 	 	 	 r   c                 (    t          | ||||          S rA   r   )r(   r   r   r   r   s        r   r   z!CockroachDatabase.run_transaction   s    tR{HMMMr   rA   )NNNNN)r   r   r   PostgresqlDatabasefield_typescopyrk   release_after_rollbackr&   rN   r[   rb   rp   rz   r   r   r   r   r   r   r   r-   r.   s   @r   r5   r5   ;   s       $05577K    "K K K K K
E 
E 
E 
E 
E& & & &J J J J J J	, 	, 	,I I I I I(1 1 1: : :
	L 	L 	L 	L 	L 	LL L L L L L: : : : : @D#'    BF!%N N N N N N N Nr   r5   c                        e Zd Z fdZ xZS )r   c                    | j                                         dk    r@t          | j                                         t                    st          t                    t          t          |           	                                S )Nr   )
dbtransaction_depthrt   top_transactionr   r   r   r%   r   	__enter__r   s    r   r   z_crdb_atomic.__enter__   sf    7$$&&**dg5577AA 7)+666\4((22444r   )r   r   r   r   r-   r.   s   @r   r   r      s8        5 5 5 5 5 5 5 5 5r   r   c                    |pd}|                      ||          5 }|                     d           |dk    rq	  ||           }|                     d           |cddd           S # t          $ r5}|j        j        dk    r|dz  }|                     d	           Y d}~n d}~ww xY w	 ddd           n# 1 swxY w Y   t          dd
          )a  
    Run transactional SQL in a transaction with automatic retries.

    User-provided `callback`:
    * Must accept one parameter, the `db` instance representing the connection
      the transaction is running under.
    * Must not attempt to commit, rollback or otherwise manage transactions.
    * May be called more than once.
    * Should ideally only contain SQL operations.

    Additionally, the database must not have any open transaction at the time
    this function is called, as CRDB does not support nested transactions.
    )r   r   zSAVEPOINT cockroach_restartr   z#RELEASE SAVEPOINT cockroach_restartN40001   z'ROLLBACK TO SAVEPOINT cockroach_restartzunable to commit transaction)r   rV   OperationalErrororigpgcoder   )r   callbackr   r   r   txnresultexcs           r   r   r      sW     %2L	{X	>	> #
4555a	!"DEEE        $   8?g-- A%LNN#LMMMHHHH                 d$B
C
CCs:   B6!A''
B&1*B!B6 B!!B&&B66B:=B:c                       e Zd ZdS )PooledCockroachDatabaseNr   r   r   r   r   r      s        Dr   r   r   )$r   rI   syspeeweer   r   r   r   r   r	   r
   r   playhouse.poolr   playhouse.postgres_extr   r   r   	JSONFieldImportErrorversion_infostrru   r   r   r   r   	UUIDFieldr   	AutoFieldr0   r   r5   r   r   r   r   r   r   <module>r      s       				 



                 ! ! ! ! ! ! # # # # # #       % % % % % %                   4 4 4 4 4 4D111111666666444444II D D D?CCJCC=999D AJ  + 2 1 1 1 1* 1 1 1< < < < <9 < < <: : : : : : : :xN xN xN xN xN* xN xN xNv5 5 5 5 57 5 5 5 BF!D D D D@	 	 	 	 	79J 	 	 	 	 	s   A A-,A-