a
    ÛEbê.  ã                   @   sD   d dl mZ d dlmZ d dlmZ d dlmZ G dd„ deƒZdS )é    ©ÚInet)Úsettings)ÚBaseDatabaseOperations©Úsplit_tzname_deltac                       s^  e Zd ZdZdZddddœZdd„ Zd	d
„ ZdPdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdQdd„Zdd„ Zdd„ ZdRd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d*d+œd,d-„Zd.d/„ ZdSd0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Z d@dA„ Z!dBdC„ Z"dDdE„ Z#dTdFdG„Z$dHdI„ Z%‡ fdJdK„Z&dU‡ fdLdM„	Z'dV‡ fdNdO„	Z(‡  Z)S )WÚDatabaseOperationsZvarcharZEXPLAINÚintegerZbigintZsmallint)Ú	AutoFieldZBigAutoFieldZSmallAutoFieldc                 C   s.   |  ¡ }|dv 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_type© r   úh/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/django/db/backends/postgresql/operations.pyÚunification_cast_sql   s
    ÿz'DatabaseOperations.unification_cast_sqlc                 C   s@   |dkrd| S |dkr d| S |dkr0d| S d||f S d S )NZweek_dayzEXTRACT('dow' FROM %s) + 1Ziso_week_dayzEXTRACT('isodow' FROM %s)Ziso_yearzEXTRACT('isoyear' FROM %s)zEXTRACT('%s' FROM %s)r   )r   Úlookup_typeÚ
field_namer   r   r   Údate_extract_sql%   s    z#DatabaseOperations.date_extract_sqlNc                 C   s   |   ||¡}d||f S ©NzDATE_TRUNC('%s', %s)©Ú_convert_field_to_tz©r   r   r   Útznamer   r   r   Údate_trunc_sql1   s    z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |ƒ\}}}|r2|dkrdnd}|› |› |› �S |S )Nú+ú-r   )r   r   ÚsignÚoffsetr   r   r   Ú_prepare_tzname_delta6   s
    z(DatabaseOperations._prepare_tzname_deltac                 C   s    |rt jrd||  |¡f }|S )Nz%s AT TIME ZONE '%s')r   ZUSE_TZr#   ©r   r   r   r   r   r   r   =   s    
þz'DatabaseOperations._convert_field_to_tzc                 C   s   |   ||¡}d| S )Nz
(%s)::dater   r$   r   r   r   Údatetime_cast_date_sqlE   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s   |   ||¡}d| S )Nz
(%s)::timer   r$   r   r   r   Údatetime_cast_time_sqlI   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |   ||¡}|  ||¡S ©N)r   r   r   r   r   r   Údatetime_extract_sqlM   s    z'DatabaseOperations.datetime_extract_sqlc                 C   s   |   ||¡}d||f S r   r   r   r   r   r   Údatetime_trunc_sqlQ   s    z%DatabaseOperations.datetime_trunc_sqlc                 C   s   |   ||¡}d||f S )NzDATE_TRUNC('%s', %s)::timer   r   r   r   r   Útime_trunc_sqlV   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   ©r   r   r   r   Údeferrable_sqlZ   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v r,|dv rd}n|dv r(d}nd}|dv 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)r/   r1   r3   r5   z	UPPER(%s)r   )r   r   r   Úlookupr   r   r   Úlookup_castd   s    zDatabaseOperations.lookup_castc                 C   s   d S r'   r   r+   r   r   r   Úno_limit_value€   s    z!DatabaseOperations.no_limit_valuec                 C   s   |gS r'   r   )r   Úsqlr   r   r   Úprepare_sql_scriptƒ   s    z%DatabaseOperations.prepare_sql_scriptc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")r2   r4   )r   Únamer   r   r   Ú
quote_name†   s    zDatabaseOperations.quote_namec                 C   s   dS )NzSET TIME ZONE %sr   r+   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 r'   )Ú	SQL_FIELDr>   )Ú.0Útable©r   Ústyler   r   Ú	<genexpr>–   ó    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s;ú )ÚSQL_KEYWORDÚjoinÚappend)r   rG   Ztablesr@   rA   Z	sql_partsr   rF   r   Ú	sql_flushŽ   s    þzDatabaseOperations.sql_flushc              
   C   sR   g }|D ]D}|d }|d pd}|  d| d¡| |  |¡¡| |¡f ¡ q|S )NrE   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)rM   rK   Ú	SQL_TABLEr>   rC   )r   rG   Ú	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)r>   )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;rQ   zIS NOTZFROM)Z	django.dbrW   r>   Ú_metaZlocal_fieldsÚ
isinstancer
   rM   rK   rR   Údb_tablerC   rO   )r   rG   Z
model_listrW   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sql·   s*    
øþÿz%DatabaseOperations.sequence_reset_sqlc                 C   s   |S r'   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   r+   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   )rD   Z
param_listÚparamr   r   r   Ú
<listcomp>ë   rI   z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rB   ZDISTINCT©rL   )r   ÚfieldsÚparamsr   r   r   Údistinct_sqlé   s    zDatabaseOperations.distinct_sqlc                 C   s   |j d ur|j  ¡ S d S r'   )ÚqueryÚdecode)r   r-   r:   rh   r   r   r   Úlast_executed_queryð   s    

z&DatabaseOperations.last_executed_queryc                    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]   rX   rZ   rO   )rD   Úfieldr+   r   r   re   ú   s   û
þÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srB   r   rf   )r   rg   Úcolumnsr   r+   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 )rB   Nrf   )rD   Úrowr   r   r   rH     rI   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rB   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )rD   r:   r   r   r   rH     rI   zVALUES rf   )r   rg   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   Úbulk_insert_sql  s    z"DatabaseOperations.bulk_insert_sqlc                 C   s   |S r'   r   ©r   Úvaluer   r   r   Úadapt_datefield_value	  s    z(DatabaseOperations.adapt_datefield_valuec                 C   s   |S r'   r   rs   r   r   r   Úadapt_datetimefield_value  s    z,DatabaseOperations.adapt_datetimefield_valuec                 C   s   |S r'   r   rs   r   r   r   Úadapt_timefield_value  s    z(DatabaseOperations.adapt_timefield_valuec                 C   s   |S r'   r   )r   rt   Z
max_digitsZdecimal_placesr   r   r   Úadapt_decimalfield_value  s    z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |ƒS d S r'   r   rs   r   r   r   Úadapt_ipaddressfield_value  s    z-DatabaseOperations.adapt_ipaddressfield_valuec           	         sF   |dkr6|\}}|\}}g |¢|¢R }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_paramsrh   ©Ú	__class__r   r   r{     s    z%DatabaseOperations.subtract_temporalsc                    s`   t ƒ  |¡}i }|r||d< |r8| dd„ | ¡ D ƒ¡ |r\|dd dd„ | ¡ D ƒ¡ 7 }|S )NZFORMATc                 S   s"   i | ]\}}|  ¡ |rd nd“qS )ÚtrueÚfalse)Úupper)rD   r=   rt   r   r   r   Ú
<dictcomp>)  s   ÿz;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)rB   c                 s   s   | ]}d | V  qdS )z%s %sNr   )rD   Úir   r   r   rH   /  rI   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rz   Úexplain_query_prefixÚupdateÚitemsrL   )r   ÚformatÚoptionsÚprefixÚextrar~   r   r   r…   "  s    þÿ z'DatabaseOperations.explain_query_prefixc                    s   |rdS t ƒ  |¡S )NzON CONFLICT DO NOTHING)rz   Úignore_conflicts_suffix_sql)r   Zignore_conflictsr~   r   r   rŒ   2  s    ÿ
ýz.DatabaseOperations.ignore_conflicts_suffix_sql)N)N)N)F)NN)N)N)*Ú__name__Ú
__module__Ú__qualname__Z"cast_char_field_without_max_lengthZexplain_prefixZcast_data_typesr   r   r   r#   r   r%   r&   r(   r)   r*   r,   r.   r8   r9   r;   r>   r?   rN   rT   rV   r_   ra   rc   ri   rl   rp   rr   ru   rv   rw   rx   ry   r{   r…   rŒ   Ú__classcell__r   r   r~   r   r      sR   ý



"
r   N)	Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.db.backends.utilsr   r   r   r   r   r   Ú<module>   s   