o
    ðT·j#  ã                   @   s,  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	 zd d	l
mZ d d
l
mZ d dl
mZ eZW n eyW   d Z Z ZZY nw dZdZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ		ddd„ZG dd„ de	eƒZdS )é    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dS )ÚExceededMaxAttemptsN©Ú__name__Ú
__module__Ú__qualname__© r   r   úX/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/cockroachdb.pyr      s    r   c                       ó    e Zd ZdZ‡ fdd„Z‡  ZS )ÚUUIDKeyFieldTc                    sN   |  d¡rtdt| ƒ ƒ‚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__r   r   r   "   s
   
zUUIDKeyField.__init__)r   r   r   Úauto_incrementr   Ú__classcell__r   r   r$   r   r      ó    r   c                       r   )Ú
RowIDFieldÚINTc                    sB   |  d¡rtdt| ƒ ƒ‚tdƒg|d< tt| ƒj|i |¤Ž d S )Nr   r   zDEFAULT unique_rowid())r   r   r   r   r   r)   r   r    r$   r   r   r   -   s   
zRowIDField.__init__)r   r   r   Ú
field_typer   r'   r   r   r$   r   r)   *   r(   r)   c                       sÀ   e Zd Zej ¡ Ze ddi¡ ‡ fdd„Z‡ fdd„Zddd	„Z	d‡ fd
d„	Z
dd„ Z‡ fdd„Zdd„ Zdd„ Zd‡ fdd„	Zd‡ fdd„	Z‡ fdd„Z		d dd„Z		d dd„Z‡  ZS )!ÚCockroachDatabaseÚBLOBÚBYTESc                    sP   d|vr|r|  d¡s| dd¡ | dd¡ tt| ƒj|g|¢R i |¤Ž d S )NÚdsnzpostgresql://ÚuserÚrootÚporti‘f  )Ú
startswithr   r   r,   r   )r!   Údatabaser"   r#   r$   r   r   r   :   s   ÿ"zCockroachDatabase.__init__c                    sl   |  ¡ }| d¡ | ¡ \}t d|¡}|d ur,dtdd„ | ¡ D ƒƒ }t|ƒ| _d S t	t
| ƒ |¡ d S )Nzselect version()z#^CockroachDB.+?v(\d+)\.(\d+)\.(\d+)z
%d%02d%02dc                 s   s   � | ]}t |ƒV  qd S ©N)Úint)Ú.0Úir   r   r   Ú	<genexpr>I   s   € z8CockroachDatabase._set_server_version.<locals>.<genexpr>)ÚcursorÚexecuteÚfetchoneÚreÚmatchÚtupleÚgroupsr6   Úserver_versionr   r,   Ú_set_server_version)r!   ÚconnÚcursÚrawÚ	match_objÚcleanr$   r   r   rB   C   s   

z%CockroachDatabase._set_server_versionNc                 C   s.   d}|   |||df¡}| ¡ }|r|d pd S )Nz¡SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = %s AND table_schema = COALESCE(%s, current_schema()) AND constraint_type = %szPRIMARY KEYr   )Úexecute_sqlr<   )r!   ÚtableÚschemaÚqueryr:   Úrowr   r   r   Ú_get_pk_constraintO   s   z$CockroachDatabase._get_pk_constraintc                    s0   t t| ƒ ||¡}|  ||¡‰ ‡ fdd„|D ƒS )Nc                    s   g | ]}ˆ r|j ˆ kr|‘qS r   )Úname)r7   Úidx©Úpkcr   r   Ú
<listcomp>^   s    z1CockroachDatabase.get_indexes.<locals>.<listcomp>)r   r,   Úget_indexesrM   )r!   rI   rJ   Úindexesr$   rP   r   rS   Y   s   zCockroachDatabase.get_indexesc                 C   s8   |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_conflictrK   Úactionr   r   r   Úconflict_statement`   s   

ÿz$CockroachDatabase.conflict_statementc                    sˆ   |j r|j  ¡ nd}|dv r.tdƒg}|jr#| tdd„ |jD ƒƒ¡ | tdƒ¡ t|ƒS |dv r4d S |jr;tdƒ‚t	t
| ƒ ||¡S )	NÚ )rY   rZ   zON CONFLICTc                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r   )Ú
isinstanceÚstrr   )r7   Úcolr   r   r   rR   p   s    ÿÿz5CockroachDatabase.conflict_update.<locals>.<listcomp>z
DO NOTHINGrU   zWCockroachDB does not support the usage of a constraint name. Use the column(s) instead.)r\   r]   r   Ú_conflict_targetÚappendr   r   Ú_conflict_constraintr   r   r,   Úconflict_update)r!   ÚocrK   r_   Úpartsr$   r   r   rh   k   s   

þz!CockroachDatabase.conflict_updatec                 C   s   t  ||¡S r5   )ÚfnÚextract)r!   Ú	date_partÚ
date_fieldr   r   r   Úextract_date   s   zCockroachDatabase.extract_datec                 C   s   |  d¡  d¡S )Nr6   Útimestamptz)Úcast)r!   rn   r   r   r   Úfrom_timestamp‚   s   z CockroachDatabase.from_timestampc                    sb   t t| ƒ ¡  |d ur|  ¡  d|f¡ |d ur/| ¡ }|dvr$tdƒ‚|  ¡  d| ¡ 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   r,   Úbeginr:   r;   r]   r   ©r!   Úsystem_timeÚpriorityr$   r   r   rv   ‡   s   
ÿüzCockroachDatabase.beginc                    s8   |   ¡ r|  ¡  | jtk rt| ||ƒS tt| ƒ ||¡S r5   )Ú	is_closedÚconnectrA   ÚNESTED_TX_MIN_VERSIONÚ_crdb_atomicr   r,   Úatomicrw   r$   r   r   r~   ’   s   
zCockroachDatabase.atomicc                    s0   |   ¡ r|  ¡  | jtk rttƒ‚tt| ƒ ¡ S r5   )	rz   r{   rA   r|   ÚNotImplementedErrorÚTXN_ERR_MSGr   r,   Ú	savepoint©r!   r$   r   r   r�   ˜   s   
zCockroachDatabase.savepointc                    s   ‡ ‡‡‡fdd„}|S )Nc                    s"   t  ˆ ¡‡ ‡‡‡‡fdd„ƒ}|S )Nc                      s   t ˆˆ ˆˆˆƒS r5   ©Úrun_transactionr   )ÚcbÚmax_attemptsry   r!   rx   r   r   Únew_fn¡   s   
ÿzACockroachDatabase.retry_transaction.<locals>.deco.<locals>.new_fn)Ú	functoolsÚwraps)r…   r‡   ©r†   ry   r!   rx   )r…   r   Údeco    s   z1CockroachDatabase.retry_transaction.<locals>.decor   )r!   r†   rx   ry   r‹   r   rŠ   r   Úretry_transactionž   s   z#CockroachDatabase.retry_transactionc                 C   s   t | ||||ƒS r5   rƒ   )r!   r…   r†   rx   ry   r   r   r   r„   ¨   s   z!CockroachDatabase.run_transactionr5   )NN©NNN)r   r   r   ÚPostgresqlDatabaseÚfield_typesÚcopyr[   r   rB   rM   rS   r`   rh   ro   rr   rv   r~   r�   rŒ   r„   r'   r   r   r$   r   r,   4   s,    
ÿ	


ÿ
ÿr,   c                       s   e Zd Z‡ fdd„Z‡  ZS )r}   c                    s4   | j  ¡ dkrt| j  ¡ tƒsttƒ‚tt| ƒ 	¡ S )Nr   )
ÚdbÚtransaction_depthrb   Útop_transactionr   r   r€   r   r}   Ú	__enter__r‚   r$   r   r   r”   ®   s   z_crdb_atomic.__enter__)r   r   r   r”   r'   r   r   r$   r   r}   ­   s    r}   c           	      C   sÖ   |pd}| j ||d��S}|  d¡ |dkrWz|| ƒ}|  d¡ |W W  d  ƒ S  tyV } z"t|jddƒp=t|jddƒ}|d	krQ|d
8 }|  d¡ W Y d}~q‚ d}~ww W d  ƒ n1 saw   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.
    éÿÿÿÿ)rx   ry   zSAVEPOINT cockroach_restartr   z#RELEASE SAVEPOINT cockroach_restartNÚpgcodeÚsqlstateÚ40001é   z'ROLLBACK TO SAVEPOINT cockroach_restartzunable to commit transaction)r~   rH   ÚOperationalErrorÚgetattrÚorigr   )	r‘   Úcallbackr†   rx   ry   ÚtxnÚresultÚexcÚcoder   r   r   r„   µ   s.   

úÿ
€ùûþ
r„   c                   @   r   )ÚPooledCockroachDatabaseNr   r   r   r   r   r¢   ×   s    r¢   r�   )rˆ   r=   Úpeeweer   r   r   r   r   Úplayhouse.poolr   Úplayhouse.postgres_extr	   r
   r   Ú	JSONFieldÚImportErrorr|   r€   rš   r   Ú	UUIDFieldr   Ú	AutoFieldr)   rŽ   r,   r}   r„   r¢   r   r   r   r   Ú<module>   s8    ÿ
y
ÿ"