a
    ŠxdÍ.  ã                   @   s8   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)ÚBaseDatabaseOperationsc                       sP  e Zd ZdZdZd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„ Zdd„ Zdd„ Zdd„ Zdd„ ZdNd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d*d+œd,d-„Zd.d/„ ZdOd0d1„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#dFdG„ Z$‡ fdHdI„Z%dP‡ fdJdK„	Z&dQ‡ fdLdM„	Z'‡  Z(S )RÚ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   ú`/var/www/html/Ranjet/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_sqlc                 C   s   d||f S ©NzDATE_TRUNC('%s', %s)r   r   r   r   r   Údate_trunc_sql)   s    z!DatabaseOperations.date_trunc_sqlc                 C   s,   d|v r|  dd¡S d|v r(|  dd¡S |S )Nú+ú-)Úreplace)r   Útznamer   r   r   Ú_prepare_tzname_delta-   s
    z(DatabaseOperations._prepare_tzname_deltac                 C   s   t jrd||  |¡f }|S )Nz%s AT TIME ZONE '%s')r   ZUSE_TZr   ©r   r   r   r   r   r   Ú_convert_field_to_tz4   s    z'DatabaseOperations._convert_field_to_tzc                 C   s   |   ||¡}d| S )Nz
(%s)::date©r    r   r   r   r   Údatetime_cast_date_sql9   s    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s   |   ||¡}d| S )Nz
(%s)::timer!   r   r   r   r   Údatetime_cast_time_sql=   s    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |   ||¡}|  ||¡S ©N)r    r   ©r   r   r   r   r   r   r   Údatetime_extract_sqlA   s    z'DatabaseOperations.datetime_extract_sqlc                 C   s   |   ||¡}d||f S r   r!   r%   r   r   r   Údatetime_trunc_sqlE   s    z%DatabaseOperations.datetime_trunc_sqlc                 C   s   d||f S )NzDATE_TRUNC('%s', %s)::timer   r   r   r   r   Útime_trunc_sqlJ   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   ©r   r   r   r   Údeferrable_sqlM   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_rowsP   s    z-DatabaseOperations.fetch_returned_insert_rowsNc                 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-   r/   r1   r3   z	UPPER(%s)r   )r   r   r   Úlookupr   r   r   Úlookup_castW   s    zDatabaseOperations.lookup_castc                 C   s   d S r$   r   r)   r   r   r   Úno_limit_valuej   s    z!DatabaseOperations.no_limit_valuec                 C   s   |gS r$   r   )r   Úsqlr   r   r   Úprepare_sql_scriptm   s    z%DatabaseOperations.prepare_sql_scriptc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")r0   r2   )r   Únamer   r   r   Ú
quote_namep   s    zDatabaseOperations.quote_namec                 C   s   dS )NzSET TIME ZONE %sr   r)   r   r   r   Úset_time_zone_sqlu   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   rE   Ztablesr>   r?   Z	sql_partsr   rD   r   Ú	sql_flushx   s    þzDatabaseOperations.sql_flushc              
   C   sR   g }|D ]D}|d }|d pd}|  d| d¡| |  |¡¡| |¡f ¡ q|S )NrC   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)rK   rI   Ú	SQL_TABLEr<   rA   )r   rE   Ú	sequencesr8   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(|jjD ]r}|jjs²| d| d¡| 	|| ¡ ƒ¡| d¡| |dƒ¡| |dƒ¡| d¡| d¡| 	|| ¡ ƒ¡f ¡ q²q|S )Nr   )ÚmodelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rO   zIS NOTZFROMrN   )Z	django.dbrU   r<   Ú_metaZlocal_fieldsÚ
isinstancer   rK   rI   rP   Údb_tablerA   rM   Zmany_to_manyZremote_fieldZthroughZm2m_db_table)r   rE   Z
model_listrU   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sqlž   sH    

øÿÿøÿÿ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   )rB   Z
param_listÚparamr   r   r   Ú
<listcomp>Ü   rG   z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)r@   ZDISTINCT©rJ   )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+   r8   rf   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[   rV   rX   rM   )rB   Úfieldr)   r   r   rc   ë   s
   ý
þz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sr@   r   rd   )r   re   Ú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 )r@   Nrd   )rB   Úrowr   r   r   rF   ô   rG   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r@   c                 s   s   | ]}d | V  qdS )z(%s)Nr   )rB   r8   r   r   r   rF   õ   rG   zVALUES rd   )r   re   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   rq   r   r   r   Úadapt_datetimefield_valueû   s    z,DatabaseOperations.adapt_datetimefield_valuec                 C   s   |S r$   r   rq   r   r   r   Úadapt_timefield_valueþ   s    z(DatabaseOperations.adapt_timefield_valuec                 C   s   |rt |ƒS d S r$   r   rq   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_paramsrf   ©Ú	__class__r   r   rx     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)rB   r;   rr   r   r   r   Ú
<dictcomp>  s   ÿz;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)r@   c                 s   s   | ]}d | V  qdS )z%s %sNr   )rB   Úir   r   r   rF     rG   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rw   Úexplain_query_prefixÚupdateÚitemsrJ   )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)rw   Úignore_conflicts_suffix_sql)r   Zignore_conflictsr{   r   r   r‰     s    z.DatabaseOperations.ignore_conflicts_suffix_sql)N)F)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,   r6   r7   r9   r<   r=   rL   rR   rT   r]   r_   ra   rg   rj   rn   rp   rs   rt   ru   rv   rx   r‚   r‰   Ú__classcell__r   r   r{   r   r      sP   ý

,r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   Ú<module>   s   