U
    R+|jˆ;  ã                   @   s�   d dl Z d dl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mZ d dlmZ d dlmZ d dlmZ ed	d
„ ƒZG dd„ deƒZdS )é    N)Ú	lru_cacheÚpartial)Úsettings)ÚBaseDatabaseOperations)ÚInetÚJsonbÚerrorsÚis_psycopg3Úmogrify©Úsplit_tzname_delta)Ú
OnConflict)Ú_lazy_re_compilec                 C   s   | d krt jS tt j| d�S )N)Úcls)ÚjsonÚdumpsr   )Úencoder© r   úpc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\django/db/backends/postgresql/operations.pyÚget_json_dumps   s    r   c                	       sä  e Zd ZdZdZdZedddddd	d
dgƒZddddœZe	rfddl
mZ ejejejejejejdœZdd„ ZedƒZdd„ Zdfdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zdgd)d*„Zd+d,„ Zd-d.„ Zdhd/d0„Zd1d2„ Z d3d4„ Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$d;d;d<œd=d>„Z%d?d@„ Z&didAdB„Z'dCdD„ Z(dEdF„ Z)dGdH„ Z*dIdJ„ Z+e	�r^dKdL„ Z,ndMdL„ Z,dNdO„ Z-dPdQ„ Z.e	�r„dRdS„ Z/dTdU„ Z0dVdW„ Z1dXdY„ Z2djdZd[„Z3d\d]„ Z4d^d_„ Z5‡ fd`da„Z6dk‡ fdbdc„	Z7‡ fddde„Z8‡  Z9S )lÚDatabaseOperationsz&django.db.backends.postgresql.compilerZvarcharZEXPLAINZANALYZEZBUFFERSZCOSTSZSETTINGSZSUMMARYZTIMINGÚVERBOSEZWALÚintegerZbigintZsmallint)Ú	AutoFieldZBigAutoFieldZSmallAutoFieldr   )Únumeric)ZSmallIntegerFieldZIntegerFieldZBigIntegerFieldZPositiveSmallIntegerFieldZPositiveIntegerFieldZPositiveBigIntegerFieldc                 C   s.   |  ¡ }|dkr*d| | j¡ d¡d  S dS )N)ÚGenericIPAddressFieldÚIPAddressFieldZ	TimeFieldZ	UUIDFieldzCAST(%%s AS %s)ú(r   ú%s)Zget_internal_typeZdb_typeÚ
connectionÚsplit)ÚselfZoutput_fieldÚinternal_typer   r   r   Úunification_cast_sql;   s
    ÿz'DatabaseOperations.unification_cast_sqlz[A-Z_]+c                 C   s€   |dkrd|› d�|fS |dkr0d|› d�|fS |dkrHd|› d�|fS |  ¡ }| j |¡sjtd	|›�ƒ‚d
|› d|› d�|fS )NZweek_dayzEXTRACT(DOW FROM z) + 1Ziso_week_dayzEXTRACT(ISODOW FROM ú)Ziso_yearzEXTRACT(ISOYEAR FROM zInvalid lookup type: zEXTRACT(z FROM )ÚupperÚ_extract_format_reÚ	fullmatchÚ
ValueError©r!   Úlookup_typeÚsqlÚparamsr   r   r   Údate_extract_sqlR   s    z#DatabaseOperations.date_extract_sqlNc                 C   s(   |   |||¡\}}d|› d�|f|˜fS ©NúDATE_TRUNC(%s, r$   ©Ú_convert_sql_to_tz©r!   r*   r+   r,   Útznamer   r   r   Údate_trunc_sqla   s    z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |ƒ\}}}|r2|dkrdnd}|› |› |› �S |S )Nú+ú-r   )r!   r3   ÚsignÚoffsetr   r   r   Ú_prepare_tzname_deltaf   s
    z(DatabaseOperations._prepare_tzname_deltac                 C   s0   |r(t jr(|  |¡}|› d�||f˜fS ||fS )Nz AT TIME ZONE %s)r   ZUSE_TZr9   )r!   r+   r,   r3   Ztzname_paramr   r   r   r1   m   s    

z%DatabaseOperations._convert_sql_to_tzc                 C   s"   |   |||¡\}}d|› d�|fS )Nr   z)::dater0   ©r!   r+   r,   r3   r   r   r   Údatetime_cast_date_sqls   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s"   |   |||¡\}}d|› d�|fS )Nr   ú)::timer0   r:   r   r   r   Údatetime_cast_time_sqlw   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s<   |   |||¡\}}|dkr.d|› d�d|˜fS |  |||¡S ©NÚsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))r?   )r1   r-   r2   r   r   r   Údatetime_extract_sql{   s    z'DatabaseOperations.datetime_extract_sqlc                 C   s(   |   |||¡\}}d|› d�|f|˜fS r.   r0   r2   r   r   r   Údatetime_trunc_sql‚   s    z%DatabaseOperations.datetime_trunc_sqlc                 C   s*   |dkrd|› d�d|˜fS |   |||¡S r>   )r-   r)   r   r   r   Útime_extract_sql‡   s    z#DatabaseOperations.time_extract_sqlc                 C   s(   |   |||¡\}}d|› d�|f|˜fS )Nr/   r<   r0   r2   r   r   r   Útime_trunc_sql�   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   ©r!   r   r   r   Údeferrable_sql‘   s    z!DatabaseOperations.deferrable_sqlc                 C   s   |  ¡ S )z˜
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )Zfetchall)r!   Úcursorr   r   r   Úfetch_returned_insert_rows”   s    z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s@   d}|dkr,|dkrd}n|dkr(d}nd}|dkr<d	| }|S )
Nr   )	ÚiexactÚcontainsÚ	icontainsÚ
startswithÚistartswithÚendswithÚ	iendswithÚregexZiregex)r   r   zHOST(%s))ZCICharFieldZCIEmailFieldZCITextFieldz
%s::citextz%s::text)rH   rJ   rL   rN   z	UPPER(%s)r   )r!   r*   r"   Úlookupr   r   r   Úlookup_cast›   s    zDatabaseOperations.lookup_castc                 C   s   d S ©Nr   rD   r   r   r   Úno_limit_value·   s    z!DatabaseOperations.no_limit_valuec                 C   s   |gS rR   r   )r!   r+   r   r   r   Úprepare_sql_scriptº   s    z%DatabaseOperations.prepare_sql_scriptc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")rK   rM   )r!   Únamer   r   r   Ú
quote_name½   s    zDatabaseOperations.quote_namec                 C   s   t ||| jƒS rR   )r
   r   )r!   r+   r,   r   r   r   Úcompose_sqlÂ   s    zDatabaseOperations.compose_sqlc                 C   s   dS )Nz(SELECT set_config('TimeZone', %s, false)r   rD   r   r   r   Úset_time_zone_sqlÅ   s    z$DatabaseOperations.set_time_zone_sqlF)Úreset_sequencesÚallow_cascadec                   sd   |sg S ˆ  d¡d ‡ ‡fdd„|D ƒ¡g}|r@| ˆ  d¡¡ |rT| ˆ  d¡¡ dd |¡ gS )	NZTRUNCATEú, c                 3   s   | ]}ˆ  ˆ  |¡¡V  qd S rR   )Ú	SQL_FIELDrW   )Ú.0Útable©r!   Ústyler   r   Ú	<genexpr>Ð   s     z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s;ú )ÚSQL_KEYWORDÚjoinÚappend)r!   ra   ZtablesrZ   r[   Z	sql_partsr   r`   r   Ú	sql_flushÈ   s    þzDatabaseOperations.sql_flushc              
   C   sR   g }|D ]D}|d }|d pd}|  d| d¡| |  |¡¡| |¡f ¡ q|S )Nr_   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)rf   rd   Ú	SQL_TABLErW   r]   )r!   ra   Ú	sequencesr+   Zsequence_infoZ
table_nameZcolumn_namer   r   r   Úsequence_reset_by_name_sqlØ   s    ýÿÿz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s$   |rd|   |¡ S d|   |¡ S d S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rW   )r!   Z
tablespaceÚinliner   r   r   Útablespace_sqlë   s    z!DatabaseOperations.tablespace_sqlc                 C   s®   ddl m} g }| j}|D ]Ž}|jjD ]€}t||jƒr&| d| d¡| 	||jj
ƒ¡| |j¡| ||jƒ¡| ||jƒ¡| d¡| d¡| 	||jj
ƒ¡f ¡  qq&q|S )Nr   )ÚmodelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rj   zIS NOTZFROM)Z	django.dbrp   rW   Ú_metaZlocal_fieldsÚ
isinstancer   rf   rd   rk   Údb_tabler]   rh   )r!   ra   Z
model_listrp   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sqlñ   s*    
øþÿz%DatabaseOperations.sequence_reset_sqlc                 C   s   |S rR   r   )r!   Úxr   r   r   Úprep_for_iexact_query  s    z(DatabaseOperations.prep_for_iexact_queryc                 C   s   dS )a–  
        Return the maximum length of an identifier.

        The maximum length of an identifier is 63 by default, but can be
        changed by recompiling PostgreSQL after editing the NAMEDATALEN
        macro in src/include/pg_config_manual.h.

        This implementation returns 63, but can be overridden by a custom
        database backend that inherits most of its behavior from this one.
        é?   r   rD   r   r   r   Úmax_name_length  s    z"DatabaseOperations.max_name_lengthc                 C   s4   |r&dd„ |D ƒ}dd  |¡ g|fS dgg fS d S )Nc                 S   s   g | ]}|D ]}|‘qqS r   r   )r^   Z
param_listÚparamr   r   r   Ú
<listcomp>%  s       z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)r\   ZDISTINCT©re   )r!   Úfieldsr,   r   r   r   Údistinct_sql#  s    zDatabaseOperations.distinct_sqlc                 C   s,   z|   ||¡W S  tjk
r&   Y d S X d S rR   )rX   r   Z	DataError©r!   rF   r+   r,   r   r   r   Úlast_executed_query,  s    z&DatabaseOperations.last_executed_queryc                 C   s   |j d k	r|j  ¡ S d S rR   )ÚqueryÚdecoder‚   r   r   r   rƒ   4  s    

c                    s,   |sdS ‡ fdd„|D ƒ}dd  |¡ dfS )N)Ú r   c                    s,   g | ]$}d ˆ   |jjj¡ˆ   |j¡f ‘qS )z%s.%s)rW   rv   rq   rs   rh   ©r^   ÚfieldrD   r   r   r~   >  s   û
þÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sr\   r   r   )r!   r€   Úcolumnsr   rD   r   Úreturn_insert_columns;  s    
úz(DatabaseOperations.return_insert_columnsc                 C   s*   dd„ |D ƒ}d  dd„ |D ƒ¡}d| S )Nc                 s   s   | ]}d   |¡V  qdS )r\   Nr   )r^   Úrowr   r   r   rb   I  s     z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r\   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )r^   r+   r   r   r   rb   J  s     zVALUES r   )r!   r€   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   Úbulk_insert_sqlH  s    z"DatabaseOperations.bulk_insert_sqlc                 C   s$   |d kst |dƒr|S | j| |ƒS )NZresolve_expression)ÚhasattrÚintegerfield_type_map)r!   Úvaluer"   r   r   r   Úadapt_integerfield_valueO  s    z+DatabaseOperations.adapt_integerfield_valuec                 C   s   |S rR   r   ©r!   r�   r   r   r   Úadapt_datefield_valueT  s    z(DatabaseOperations.adapt_datefield_valuec                 C   s   |S rR   r   r‘   r   r   r   Úadapt_datetimefield_valueW  s    z,DatabaseOperations.adapt_datetimefield_valuec                 C   s   |S rR   r   r‘   r   r   r   Úadapt_timefield_valueZ  s    z(DatabaseOperations.adapt_timefield_valuec                 C   s   |S rR   r   )r!   r�   Z
max_digitsZdecimal_placesr   r   r   Úadapt_decimalfield_value]  s    z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |ƒS d S rR   )r   r‘   r   r   r   Úadapt_ipaddressfield_value`  s    z-DatabaseOperations.adapt_ipaddressfield_valuec                 C   s   t |t|ƒd�S )N)r   )r   r   )r!   r�   r   r   r   r   Úadapt_json_valuee  s    z#DatabaseOperations.adapt_json_valuec           	         s@   |dkr0|\}}|\}}||˜}d||f |fS t ƒ  |||¡S )NZ	DateFieldz(interval '1 day' * (%s - %s)))ÚsuperÚsubtract_temporals)	r!   r"   ÚlhsÚrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr,   ©Ú	__class__r   r   r™   h  s    z%DatabaseOperations.subtract_temporalsc                    s†   i }|rBdd„ |  ¡ D ƒ}| jD ] }| |d ¡}|d k	r |||< q tƒ j|f|Ž}|r^||d< |r‚|dd dd„ |  ¡ D ƒ¡ 7 }|S )Nc                 S   s"   i | ]\}}|  ¡ |rd nd“qS )ÚtrueÚfalse)r%   )r^   rV   r�   r   r   r   Ú
<dictcomp>t  s   ÿ z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)r\   c                 s   s   | ]}d | V  qdS )z%s %sNr   )r^   Úir   r   r   rb   €  s     z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)ÚitemsÚexplain_optionsÚpopr˜   Úexplain_query_prefixre   )r!   ÚformatÚoptionsÚextraZvalid_optionr�   Úprefixrœ   r   r   r¥   p  s    þ

 z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkrJdd t| j|ƒ¡d dd„ t| j|ƒD ƒ¡f S tƒ  ||||¡S )NzON CONFLICT DO NOTHINGz ON CONFLICT(%s) DO UPDATE SET %sr\   c                 S   s   g | ]}|› d |› �‘qS )z = EXCLUDED.r   r‡   r   r   r   r~   Š  s   ÿz=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>)r   ZIGNOREZUPDATEre   ÚmaprW   r˜   Úon_conflict_suffix_sql)r!   r€   Zon_conflictZupdate_fieldsZunique_fieldsrœ   r   r   r«   ƒ  s"    


þÿþ	üz)DatabaseOperations.on_conflict_suffix_sql)N)N)N)F)NN)N):Ú__name__Ú
__module__Ú__qualname__Zcompiler_moduleZ"cast_char_field_without_max_lengthZexplain_prefixÚ	frozensetr£   Zcast_data_typesr	   Zpsycopg.typesr   ZInt2ZInt4ZInt8rŽ   r#   r   r&   r-   r4   r9   r1   r;   r=   r@   rA   rB   rC   rE   rG   rQ   rS   rT   rW   rX   rY   rg   rm   ro   rx   rz   r|   r�   rƒ   rŠ   rŒ   r�   r’   r“   r”   r•   r–   r—   r™   r¥   r«   Ú__classcell__r   r   rœ   r   r      sŒ   øÿýú	



"

r   )r   Ú	functoolsr   r   Zdjango.confr   Z"django.db.backends.base.operationsr   Z)django.db.backends.postgresql.psycopg_anyr   r   r   r	   r
   Zdjango.db.backends.utilsr   Zdjango.db.models.constantsr   Zdjango.utils.regex_helperr   r   r   r   r   r   r   Ú<module>   s   
