o
    þÞhD>  ã                   @   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	 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 d d
lmZ edd„ ƒZG dd„ deƒZdS )é    N)Ú	lru_cacheÚpartial)Úsettings)ÚBaseDatabaseOperations)ÚInsertUnnest)ÚInetÚJsonbÚerrorsÚis_psycopg3Úmogrify©Úsplit_tzname_delta)Ú
OnConflict)ÚCast)Ú_lazy_re_compilec                 C   s   | d u rt jS tt j| d�S )N)Úcls)ÚjsonÚdumpsr   )Úencoder© r   úh/var/www/html/premium_crap/venv/lib/python3.10/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g d¢ƒZddddœZe	r-d	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d_dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd_d"d#„Zd$d%„ Z‡ fd&d'„Zd(d)„ Zd_d*d+„Z d,d-„ Z!d.d/„ Z"d0d1„ Z#d2d3„ Z$d4d5„ Z%d6d6d7œd8d9„Z&d:d;„ Z'd`d<d=„Z(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,e	r®dFdG„ Z-ndHdG„ Z-dIdJ„ Z.e	r¼dKdL„ Z/dMdN„ Z0dOdP„ Z1dQdR„ Z2dSdT„ Z3dUdV„ Z4‡ fdWdX„Z5d_‡ fdYdZ„	Z6‡ fd[d\„Z7‡ fd]d^„Z8‡  Z9S )aÚDatabaseOperationsz&django.db.backends.postgresql.compilerÚvarcharÚEXPLAIN)ÚANALYZEÚBUFFERSÚCOSTSÚGENERIC_PLANÚMEMORYÚSETTINGSÚ	SERIALIZEÚSUMMARYÚTIMINGÚVERBOSEÚWALÚintegerÚbigintÚsmallint)Ú	AutoFieldÚBigAutoFieldÚSmallAutoFieldr   )Únumeric)ÚSmallIntegerFieldÚIntegerFieldÚBigIntegerFieldÚPositiveSmallIntegerFieldÚPositiveIntegerFieldÚPositiveBigIntegerFieldc                 C   s.   |  ¡ }|dv rd| | j¡ d¡d  S dS )N)ÚGenericIPAddressFieldÚIPAddressFieldÚ	TimeFieldÚ	UUIDFieldzCAST(%%s AS %s)ú(r   ú%s)Úget_internal_typeÚdb_typeÚ
connectionÚsplit)ÚselfÚ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rd|› d�|fS |dkr$d|› d�|fS |  ¡ }| j |¡s5td	|›�ƒ‚d
|› d|› d�|fS )NÚweek_dayzEXTRACT(DOW FROM z) + 1Úiso_week_dayzEXTRACT(ISODOW FROM ú)Ú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_sqlW   s   z#DatabaseOperations.date_extract_sqlNc                 C   ó*   |   |||¡\}}d|› d�|g|¢R fS ©NúDATE_TRUNC(%s, rC   ©Ú_convert_sql_to_tz©r=   rJ   rK   rL   Útznamer   r   r   Údate_trunc_sqlf   ó   z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |ƒ\}}}|r|dkrdnd}|› |› |› �S |S )Nú+ú-r   )r=   rT   ÚsignÚoffsetr   r   r   Ú_prepare_tzname_deltak   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s4   |rt jr|  |¡}|› d�g |¢|‘R fS ||fS )Nz AT TIME ZONE %s)r   ÚUSE_TZr[   )r=   rK   rL   rT   Útzname_paramr   r   r   rR   r   s   

z%DatabaseOperations._convert_sql_to_tzc                 C   ó"   |   |||¡\}}d|› d�|fS )Nr7   z)::daterQ   ©r=   rK   rL   rT   r   r   r   Údatetime_cast_date_sqlx   ó   z)DatabaseOperations.datetime_cast_date_sqlc                 C   r^   )Nr7   ú)::timerQ   r_   r   r   r   Údatetime_cast_time_sql|   ra   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s@   |   |||¡\}}|dkrd|› d�dg|¢R fS |  |||¡S ©NÚsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))rR   rM   rS   r   r   r   Údatetime_extract_sql€   s   z'DatabaseOperations.datetime_extract_sqlc                 C   rN   rO   rQ   rS   r   r   r   Údatetime_trunc_sql‡   rV   z%DatabaseOperations.datetime_trunc_sqlc                 C   s.   |dkrd|› d�dg|¢R fS |   |||¡S rd   )rM   rI   r   r   r   Útime_extract_sqlŒ   s   z#DatabaseOperations.time_extract_sqlc                 C   rN   )NrP   rb   rQ   rS   r   r   r   Útime_trunc_sql’   s   z!DatabaseOperations.time_trunc_sqlc                 C   ó   dS )Nz DEFERRABLE INITIALLY DEFERREDr   ©r=   r   r   r   Údeferrable_sql–   ó   z!DatabaseOperations.deferrable_sqlc                    s"   t |tƒr
d|› �S tƒ  ||¡S )NzSELECT * FROM )Ú
isinstancer   ÚsuperÚbulk_insert_sql)r=   ÚfieldsÚplaceholder_rows©Ú	__class__r   r   rp   ™   s   

z"DatabaseOperations.bulk_insert_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.
        )Úfetchall)r=   Úcursorr   r   r   Úfetch_returned_insert_rowsž   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s2   d}|dv r|dv rd}nd}|dv rd| }|S )Nr8   )	ÚiexactÚcontainsÚ	icontainsÚ
startswithÚistartswithÚendswithÚ	iendswithÚregexÚiregex)r4   r3   zHOST(%s)z%s::text)rx   rz   r|   r~   z	UPPER(%s)r   )r=   rJ   r?   Úlookupr   r   r   Úlookup_cast¥   s   zDatabaseOperations.lookup_castc                 C   s   d S ©Nr   rk   r   r   r   Úno_limit_value¾   rm   z!DatabaseOperations.no_limit_valuec                 C   s   |gS rƒ   r   )r=   rK   r   r   r   Úprepare_sql_scriptÁ   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")r{   r}   )r=   Únamer   r   r   Ú
quote_nameÄ   s   zDatabaseOperations.quote_namec                 C   s   t ||| jƒS rƒ   )r   r;   )r=   rK   rL   r   r   r   Úcompose_sqlÉ   s   zDatabaseOperations.compose_sqlc                 C   rj   )Nz(SELECT set_config('TimeZone', %s, false)r   rk   r   r   r   Úset_time_zone_sqlÌ   rm   z$DatabaseOperations.set_time_zone_sqlF)Úreset_sequencesÚallow_cascadec                   sd   |sg S ˆ  d¡d ‡ ‡fdd„|D ƒ¡g}|r | ˆ  d¡¡ |r*| ˆ  d¡¡ dd |¡ gS )	NÚTRUNCATEú, c                 3   s    � | ]}ˆ  ˆ  |¡¡V  qd S rƒ   )Ú	SQL_FIELDrˆ   )Ú.0Útable©r=   Ústyler   r   Ú	<genexpr>×   s   € z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYÚCASCADEz%s;ú )ÚSQL_KEYWORDÚjoinÚappend)r=   r“   Útablesr‹   rŒ   Ú	sql_partsr   r’   r   Ú	sql_flushÏ   s   þzDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}|  d| d¡| |  |¡¡| |¡f ¡ q|S )Nr‘   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)r™   r—   Ú	SQL_TABLErˆ   r�   )r=   r“   Ú	sequencesrK   Úsequence_infoÚ
table_nameÚcolumn_namer   r   r   Úsequence_reset_by_name_sqlß   s   ýÿÿz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s    |r	d|   |¡ S d|   |¡ S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rˆ   )r=   Ú
tablespaceÚinliner   r   r   Útablespace_sqlò   s   z!DatabaseOperations.tablespace_sqlc                 C   s®   ddl m} g }| j}|D ]G}|jjD ]@}t||jƒrS| d| d¡| 	||jj
ƒ¡| |j¡| ||jƒ¡| ||jƒ¡| d¡| d¡| 	||jj
ƒ¡f ¡  nqq|S )Nr   )ÚmodelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rŸ   zIS NOTÚFROM)Ú	django.dbr©   rˆ   Ú_metaÚlocal_fieldsrn   r)   r™   r—   r    Údb_tabler�   r�   )r=   r“   Ú
model_listr©   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sqlø   s.   
øþÿï€z%DatabaseOperations.sequence_reset_sqlc                 C   ó   |S rƒ   r   )r=   Úxr   r   r   Úprep_for_iexact_query  rm   z(DatabaseOperations.prep_for_iexact_queryc                 C   rj   )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   rk   r   r   r   Úmax_name_length  s   z"DatabaseOperations.max_name_lengthc                 C   s0   |rdd„ |D ƒ}dd  |¡ g|fS dgg fS )Nc                 S   s   g | ]	}|D ]}|‘qqS r   r   )r�   Ú
param_listÚparamr   r   r   Ú
<listcomp>,  s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rŽ   ÚDISTINCT©r˜   )r=   rq   rL   r   r   r   Údistinct_sql*  s   
zDatabaseOperations.distinct_sqlc                 C   sR   | j jjrz|  ||¡W S  tjy   Y d S w |jr'|jjd ur'|jj ¡ S d S rƒ   )	r;   ÚfeaturesÚuses_server_side_bindingr‰   r	   Ú	DataErrorÚ_queryÚqueryÚdecode©r=   rv   rK   rL   r   r   r   Úlast_executed_query3  s   
ÿz&DatabaseOperations.last_executed_queryc                 C   s   |j d ur
|j  ¡ S d S rƒ   )rÄ   rÅ   rÆ   r   r   r   rÇ   @  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)rˆ   r²   r¬   r®   r�   ©r�   Úfieldrk   r   r   r¼   J  s    û
þÿÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srŽ   r   r¾   )r=   rq   Úcolumnsr   rk   r   Úreturn_insert_columnsG  s   
úz(DatabaseOperations.return_insert_columnsc                 C   s$   |d u s	t |dƒr|S | j| |ƒS )NÚresolve_expression)ÚhasattrÚintegerfield_type_map)r=   Úvaluer?   r   r   r   Úadapt_integerfield_valueV  s   z+DatabaseOperations.adapt_integerfield_valuec                 C   rµ   rƒ   r   ©r=   rÐ   r   r   r   Úadapt_datefield_value[  rm   z(DatabaseOperations.adapt_datefield_valuec                 C   rµ   rƒ   r   rÒ   r   r   r   Úadapt_datetimefield_value^  rm   z,DatabaseOperations.adapt_datetimefield_valuec                 C   rµ   rƒ   r   rÒ   r   r   r   Úadapt_timefield_valuea  rm   z(DatabaseOperations.adapt_timefield_valuec                 C   s   |rt |ƒS d S rƒ   )r   rÒ   r   r   r   Úadapt_ipaddressfield_valued  s   z-DatabaseOperations.adapt_ipaddressfield_valuec                 C   s   t |t|ƒd�S )N)r   )r   r   )r=   rÐ   r   r   r   r   Úadapt_json_valuei  s   z#DatabaseOperations.adapt_json_valuec           	         sF   |dkr|\}}|\}}g |¢|¢R }d||f |fS t ƒ  |||¡S )NÚ	DateFieldz(interval '1 day' * (%s - %s)))ro   Úsubtract_temporals)	r=   r?   ÚlhsÚrhsÚlhs_sqlÚ
lhs_paramsÚrhs_sqlÚ
rhs_paramsrL   rs   r   r   rÙ   l  s   z%DatabaseOperations.subtract_temporalsc                    s²   i }|  dd ¡ }r| ¡ dv r| ¡ |d< |r5dd„ | ¡ D ƒ}| jD ]}|  |d ¡}|d ur4|||< q$tƒ j|fi |¤Ž}|rE||d< |rW|dd d	d
„ | ¡ D ƒ¡ 7 }|S )NÚ	serialize>   ÚTEXTÚBINARYr!   c                 S   s"   i | ]\}}|  ¡ |rd nd“qS )ÚtrueÚfalse)rE   )r�   r‡   rÐ   r   r   r   Ú
<dictcomp>{  s    ÿÿz;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ÚFORMATz (%s)rŽ   c                 s   s   � | ]}d | V  qdS )z%s %sNr   )r�   Úir   r   r   r”   ‡  s   € z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)ÚpoprE   ÚitemsÚexplain_optionsro   Úexplain_query_prefixr˜   )r=   ÚformatÚoptionsÚextrarà   Úvalid_optionrÐ   Úprefixrs   r   r   rë   t  s&   þ
€ z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkr%d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   ÚIGNOREÚUPDATEr˜   Úmaprˆ   ro   Úon_conflict_suffix_sql)r=   rq   Úon_conflictÚupdate_fieldsÚunique_fieldsrs   r   r   rô   Š  s"   


þÿþ	üz)DatabaseOperations.on_conflict_suffix_sqlc                    s@   t ƒ  ||||¡\}}| | j¡| | j¡krt||ƒ}||fS rƒ   )ro   Úprepare_join_on_clauser:   r;   r   )r=   Ú	lhs_tableÚ	lhs_fieldÚ	rhs_tableÚ	rhs_fieldÚlhs_exprÚrhs_exprrs   r   r   rø   ž  s   ÿ
z)DatabaseOperations.prepare_join_on_clauserƒ   )F):Ú__name__Ú
__module__Ú__qualname__Úcompiler_moduleÚ"cast_char_field_without_max_lengthÚexplain_prefixÚ	frozensetrê   Úcast_data_typesr
   Úpsycopg.typesr,   ÚInt2ÚInt4ÚInt8rÏ   r@   r   rF   rM   rU   r[   rR   r`   rc   rf   rg   rh   ri   rl   rp   rw   r‚   r„   r…   rˆ   r‰   rŠ   rœ   r¥   r¨   r´   r·   r¹   r¿   rÇ   rÌ   rÑ   rÓ   rÔ   rÕ   rÖ   r×   rÙ   rë   rô   rø   Ú__classcell__r   r   rs   r   r      s~    ÿýú	



"
r   )r   Ú	functoolsr   r   Údjango.confr   Ú"django.db.backends.base.operationsr   Ú&django.db.backends.postgresql.compilerr   Ú)django.db.backends.postgresql.psycopg_anyr   r   r	   r
   r   Údjango.db.backends.utilsr   Údjango.db.models.constantsr   Údjango.db.models.functionsr   Údjango.utils.regex_helperr   r   r   r   r   r   r   Ú<module>   s    
