
    B>qj#                     P   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 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 ]w xY w)    N)*)_atomic)_manual)EnclosedNodeList)Entity)NodeList)_PooledPostgresqlDatabase)
ArrayField)BinaryJSONField)IntervalFieldi 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__     T/opt/rentech/trading_bot/.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!   r,   r"   r#   s      r   r"   zRowIDField.__init__-   sK    ::m$=T
JKK!$%=!> ?}j$($9&9r   )r   r   r   
field_typer"   r)   r*   s   @r   r,   r,   *   s    J: :r   r,   c                        e Zd Zej                  j                         Zej                  ddi        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BYTESc                     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!   r1   r"   )r$   databaser%   r&   r'   s       r   r"   zCockroachDatabase.__init__:   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>I   s     (LAQ(Ls   )cursorexecutefetchonerematchtuplegroupsr>   server_versionr!   r1   _set_server_version)r$   conncursraw	match_objcleanr'   s         r   rJ   z%CockroachDatabase._set_server_versionC   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_sqlrD   )r$   tableschemaqueryrB   rows         r   _get_pk_constraintz$CockroachDatabase._get_pk_constraintO   sM    , !!%%1C8*7*9 :oo~s1v%%r   c                     t         t        |   ||      }| j                  ||      }|D cg c]  }|r|j                  |k7  s| c}S c c}w r=   )r!   r1   get_indexesrW   name)r$   rS   rT   indexespkcidxr'   s         r   rY   zCockroachDatabase.get_indexesY   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_conflictrU   actions       r   conflict_statementz$CockroachDatabase.conflict_statement`   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 )rc   rd   zON CONFLICTz
DO NOTHINGr_   zWCockroachDB does not support the usage of a constraint name. Use the column(s) instead.)rf   rg   r   _conflict_targetappendr   
isinstancestrr   r   _conflict_constraintr   r!   r1   conflict_update)r$   ocrU   ri   partscolr'   s         r   rr   z!CockroachDatabase.conflict_updatek   s    ')zz!!#r**'(E""-!22/4 $.c3#7F3KS@/4 5 6 LL\*+E?",, $$ K L L &=b%HH/4s   $$C(c                 .    t         j                  ||      S r=   )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 )Nr>   timestamptz)cast)r$   rz   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!   r1   beginrB   rC   rg   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 r=   )	is_closedconnectrI   NESTED_TX_MIN_VERSION_crdb_atomicr!   r1   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 r=   )	r   r   rI   r   NotImplementedErrorTXN_ERR_MSGr!   r1   	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 r=   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 r=   r   )r$   r   r   r   r   s        r   r   z!CockroachDatabase.run_transaction   s    tR{HMMr   r=   )NNNNN)r   r   r   PostgresqlDatabasefield_typescopyre   r"   rJ   rW   rY   rj   rr   r{   r   r   r   r   r   r   r)   r*   s   @r   r1   r1   4   s    $00557K K
E&J	,I(1:
	LL: @D#' BF!%Nr   r1   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_depthro   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                    |xs d}| j                  ||      5 }| j                  d       |dk7  r%	  ||       }| j                  d       |cddd       S 	 ddd       t        dd      # t        $ rV}t        |j                  dd      xs t        |j                  dd      }|d	k(  r|d
z  }| j                  d       Y d}~ d}~ww xY w# 1 sw Y   wx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pgcodesqlstate40001   z'ROLLBACK TO SAVEPOINT cockroach_restartzunable to commit transaction)r   rR   OperationalErrorgetattrorigr   )	r   callbackr   r   r   txnresultexccodes	            r   r   r      s      %2L	{X	> #
45a!"DE  d$B
CC $ (D9 <*d; 7? A%LNN#LM s5   CA++	C
4AC?CCC

CCc                       e Zd Zy)PooledCockroachDatabaseNr   r   r   r   r   r      s    r   r   r   )r   rE   peeweer   r   r   r   r   playhouse.poolr	   playhouse.postgres_extr
   r   r   	JSONFieldImportErrorr   r   r   r   	UUIDFieldr   	AutoFieldr,   r   r1   r   r   r   r   r   r   <module>r      s     	    #   4D164I
  + 2* 1<9 <: :vN* vNr57 5 BF!DD	79J 	O  D?CCJCC=9Ds   B B%$B%