
    h8'h#                        d dl Z d dlZd dlZd dl 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ej(                  d    dkD  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#y# e$ r dxZxZxZZY qw xY w)     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y)ExceededMaxAttemptsN__name__
__module____qualname__     Q/var/www/html/trade_iq/venv/lib/python3.12/site-packages/playhouse/cockroachdb.pyr   r   #   s    r   r   c                   "     e Zd ZdZ fdZ xZS )UUIDKeyFieldTc                     |j                  d      rt        dt        |       z        t        d      g|d<   |j	                  dd       t        t        |   |i | y )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$=T
JKK!$%@!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                     |j                  d      rt        dt        |       z        t        d      g|d<   t	        t
        |   |i | y )Nr   r   zDEFAULT unique_rowid())r    r!   r"   r#   r%   r0   r&   r'   s      r   r&   zRowIDField.__init__4   sK    ::m$=T
JKK!$%=!> ?}j$($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                  j                         Zej                  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r7|r5|j                  d      s$|j                  dd       |j                  dd       t        t        |   |g|i | y )Ndsnzpostgresql://userrootportif  )
startswithr$   r%   r5   r&   )r(   databaser)   r*   r+   s       r   r&   zCockroachDatabase.__init__C   sW     H(0(;(;O(Lff-fe,/J4J6Jr   c                 *   |j                         }|j                  d       |j                         \  }t        j                  d|      }|4dt        d |j                         D              z  }t        |      | _        y t        t        | /  |       y )Nzselect version()z#^CockroachDB.+?v(\d+)\.(\d+)\.(\d+)z
%d%02d%02dc              3   2   K   | ]  }t        |        y wN)int).0is     r   	<genexpr>z8CockroachDatabase._set_server_version.<locals>.<genexpr>R   s     (LAQ(Ls   )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{    {{}'(}}HHCSI	  5(L9I9I9K(L#LLE"%e*D #T>tDr   c                 r    d}| j                  |||xs ddf      }|j                         }|xr |d   xs 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   sM    , !!%%1C8*7*9 :oo~s1v%%r   c                     t         t        |   ||      }| j                  ||      }|D cg c]  }|r|j                  |k7  s| c}S c c}w rA   )r%   r5   get_indexesr[   name)r(   rW   rX   indexespkcidxr+   s         r   r]   zCockroachDatabase.get_indexesb   sK     )4<UFK%%eV4&IsCIIIs   A
A
c                     |j                   sy |j                   j                         }|dv rt        d      S |dvrt        d      y )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   sT    ""F$$**,**x= :: + , , ;r   c                    |j                   r|j                   j                         nd}|dv rt        d      g}|j                  rM|j	                  t        |j                  D cg c]  }t        |t              rt        |      n|! c}             |j	                  t        d             t        |      S |dv ry |j                  rt        d      t        t        | ;  ||      S c c}w )N )rg   rh   zON CONFLICTz
DO NOTHINGrc   zWCockroachDB does not support the usage of a constraint name. Use the column(s) instead.)rj   rk   r#   _conflict_targetappendr   
isinstance
basestringr   r   _conflict_constraintr!   r%   r5   conflict_update)r(   ocrY   rm   partscolr+   s         r   rv   z!CockroachDatabase.conflict_updatet   s    ')zz!!#r**'(E""-!22/4 $.c:#>F3KCG/4 5 6 LL\*+E?",, $$ K L L &=b%HH/4s   $$C(c                 .    t         j                  ||      S rA   )fnextract)r(   	date_part
date_fields      r   extract_datezCockroachDatabase.extract_date   s    zz)Z00r   c                 B    |j                  d      j                  d      S )NrB   timestamptz)cast)r(   r~   s     r   from_timestampz CockroachDatabase.from_timestamp   s     u%**=99r   c                     t         t        |           |!| j                         j	                  d|f       |B|j                         }|dvrt        d      | j                         j	                  d|z         y y )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   rk   r!   r(   system_timepriorityr+   s      r   r   zCockroachDatabase.begin   sy    ,."KKM!!"H#..2~~'H88 !GHHKKM!!"?("JK	  r   c                     | j                         r| j                          | 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   sH    >>T\\^!66k8<<&4[(KKr   c                     | j                         r| j                          | 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   s@    >>T\\^!66%k22&799r   c                       fd}|S )Nc                 L     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 1r   )	functoolswraps)r   r   r   r   r(   r   s   ` r   decoz1CockroachDatabase.retry_transaction.<locals>.deco   s%    __R 1 !1 Mr   r   )r(   r   r   r   r   s   ```` r   retry_transactionz#CockroachDatabase.retry_transaction   s    	 r   c                      t        | ||||      S rA   r   )r(   r   r   r   r   s        r   r   z!CockroachDatabase.run_transaction   s    tR{HMMr   rA   )NNNNN)r   r   r   PostgresqlDatabasefield_typescopyri   release_after_rollbackr&   rN   r[   r]   rn   rv   r   r   r   r   r   r   r   r-   r.   s   @r   r5   r5   ;   s    $00557K  "K
E&J	,I(1:
	LL: @D#' BF!%Nr   r5   c                        e Zd Z fdZ xZS )r   c                     | j                   j                         dkD  r7t        | j                   j                         t              st        t              t        t        | '         S )Nr   )
dbtransaction_depthrs   top_transactionr   r   r   r%   r   	__enter__r   s    r   r   z_crdb_atomic.__enter__   sJ    77$$&*dgg557A)+66\4244r   )r   r   r   r   r-   r.   s   @r   r   r      s    5 5r   r   c                 z   |xs d}| j                  ||      5 }| j                  d       |dk7  r%	  ||       }| j                  d       |cddd       S 	 ddd       t        dd
      # t        $ r:}|j                  j                  dk(  r|dz  }| j                  d	       Y d}~| d}~ww xY w# 1 sw Y   [xY w)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      s      %2L	{X	> #
45a	!"DE  d$B
CC $ 88??g- A%LNN#LM s4   B1A++	B.4/B)#B1(B))B..B11B:c                       e Zd Zy)PooledCockroachDatabaseNr   r   r   r   r   r      s    r   r   r   )$r   rI   syspeeweer   r   r   r   r   r	   r
   r   playhouse.poolr   playhouse.postgres_extr   r   r   	JSONFieldImportErrorversion_infostrrt   r   r   r   r   	UUIDFieldr   	AutoFieldr0   r   r5   r   r   r   r   r   r   <module>r      s     	 
    ! #  %    4D164I AJ  + 2* 1<9 <: :xN* xNv57 5 BF!D@	79J 	U  D?CCJCC=9Ds   	B? ?CC