B
    CVvg¬.  ã               @   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            	       sv  e Zd ZdZdZeddddddd	d
gƒZddddœZdd„ Zdd„ Z	dXdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ ZdYd"d#„Zd$d%„ Zd&d'„ ZdZd(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d2d3œd4d5„Zd6d7„ Zd[d8d9„Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ Z dDdE„ Z!dFdG„ Z"dHdI„ Z#dJdK„ Z$dLdM„ Z%d\dNdO„Z&dPdQ„ Z'‡ fdRdS„Z(d]‡ fdTdU„	Z)d^‡ fdVdW„	Z*‡  Z+S )_ÚDatabaseOperationsZvarcharZEXPLAINZANALYZEZBUFFERSZCOSTSZSETTINGSZSUMMARYZTIMINGÚVERBOSEZWALÚintegerZbigintZsmallint)Ú	AutoFieldZBigAutoFieldZSmallAutoFieldc             C   s.   |  ¡ }|dkr*d| | j¡ d¡d  S dS )N)ÚGenericIPAddressFieldÚIPAddressFieldZ	TimeFieldZ	UUIDFieldzCAST(%%s AS %s)ú(r   z%s)Zget_internal_typeZdb_typeÚ
connectionÚsplit)ÚselfZoutput_fieldÚinternal_type© r   úL/tmp/pip-install-o3oxmrkh/Django/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_sql5   s    z!DatabaseOperations.date_trunc_sqlc             C   s,   d|kr|  dd¡S d|kr(|  dd¡S |S )Nú+ú-)Úreplace)r   r   r   r   r   Ú_prepare_tzname_delta:   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   A   s    
z'DatabaseOperations._convert_field_to_tzc             C   s   |   ||¡}d| S )Nz
(%s)::date)r   )r   r   r   r   r   r   Údatetime_cast_date_sqlF   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   |   ||¡}d| S )Nz
(%s)::time)r   )r   r   r   r   r   r   Údatetime_cast_time_sqlJ   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   |   ||¡}|  ||¡S )N)r   r   )r   r   r   r   r   r   r   Údatetime_extract_sqlN   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   |   ||¡}d||f S )NzDATE_TRUNC('%s', %s))r   )r   r   r   r   r   r   r   Údatetime_trunc_sqlR   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   |   ||¡}d||f S )NzDATE_TRUNC('%s', %s)::time)r   )r   r   r   r   r   r   r   Útime_trunc_sqlW   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 )
Nz%s)	ÚiexactÚcontainsÚ	icontainsÚ
startswithÚistartswithÚendswithÚ	iendswithÚregexZiregex)r
   r	   zHOST(%s))ZCICharFieldZCIEmailFieldZCITextFieldz
%s::citextz%s::text)r%   r'   r)   r+   z	UPPER(%s)r   )r   r   r   Úlookupr   r   r   Úlookup_caste   s    zDatabaseOperations.lookup_castc             C   s   d S )Nr   )r   r   r   r   Úno_limit_valuex   s    z!DatabaseOperations.no_limit_valuec             C   s   |gS )Nr   )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")r(   r*   )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TRUNCATEz, c             3   s   | ]}ˆ  ˆ  |¡¡V  qd S )N)Ú	SQL_FIELDr4   )Ú.0Útable)r   Ústyler   r   ú	<genexpr>Ž   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s;ú )ÚSQL_KEYWORDÚjoinÚappend)r   r;   Útablesr6   r7   Z	sql_partsr   )r   r;   r   Ú	sql_flush†   s    zDatabaseOperations.sql_flushc          
   C   sV   g }xL|D ]D}|d }|d p d}|  d| d¡| |  |¡¡| |¡f ¡ q
W |S )Nr:   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)r@   r>   Ú	SQL_TABLEr4   r8   )r   r;   Ú	sequencesr0   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)r4   )r   Z
tablespaceÚinliner   r   r   Útablespace_sql¦   s    z!DatabaseOperations.tablespace_sqlc             C   s´   ddl m} g }| j}x˜|D ]�}xŠ|jjD ]~}t||jƒr*| d| d¡| 	||jj
ƒ¡| |j¡| ||jƒ¡| ||jƒ¡| d¡| d¡| 	||jj
ƒ¡f ¡ P q*W qW |S )Nr   )ÚmodelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rE   zIS NOTZFROM)Z	django.dbrK   r4   Ú_metaZlocal_fieldsÚ
isinstancer   r@   r>   rF   Údb_tabler8   rC   )r   r;   Z
model_listrK   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sql¬   s$    


z%DatabaseOperations.sequence_reset_sqlc             C   s   |S )Nr   )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   )r9   Z
param_listÚparamr   r   r   ú
<listcomp>Û   s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)z, ZDISTINCT)r?   )r   ÚfieldsÚparamsr   r   r   Údistinct_sqlÙ   s    zDatabaseOperations.distinct_sqlc             C   s   |j d k	r|j  ¡ S d S )N)ÚqueryÚdecode)r   r#   r0   r[   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)r4   rQ   rL   rN   rC   )r9   Úfield)r   r   r   rY   ë   s   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sz, r   )r?   )r   rZ   Ú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 )z, N)r?   )r9   Úrowr   r   r   r<   ó   s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r9   r0   r   r   r   r<   ô   s    zVALUES )r?   )r   rZ   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   Úbulk_insert_sqlò   s    z"DatabaseOperations.bulk_insert_sqlc             C   s   |S )Nr   )r   Úvaluer   r   r   Úadapt_datefield_value÷   s    z(DatabaseOperations.adapt_datefield_valuec             C   s   |S )Nr   )r   rf   r   r   r   Úadapt_datetimefield_valueú   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   |S )Nr   )r   rf   r   r   r   Úadapt_timefield_valueý   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   |S )Nr   )r   rf   Z
max_digitsZdecimal_placesr   r   r   Úadapt_decimalfield_value   s    z+DatabaseOperations.adapt_decimalfield_valuec             C   s   |rt |ƒS d S )N)r   )r   rf   r   r   r   Úadapt_ipaddressfield_value  s    z-DatabaseOperations.adapt_ipaddressfield_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   rm     s    z%DatabaseOperations.subtract_temporalsc                sŽ   i }|rJdd„ |  ¡ D ƒ}x.| jD ]$}| |d ¡}|d k	r"||| ¡ < q"W tƒ j|f|Ž}|rf||d< |rŠ|dd dd„ |  ¡ D ƒ¡ 7 }|S )Nc             S   s"   i | ]\}}|rd nd|  ¡ “qS )ÚtrueÚfalse)Úupper)r9   r3   rf   r   r   r   ú
<dictcomp>  s   z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)z, c             s   s   | ]}d | V  qdS )z%s %sNr   )r9   Úir   r   r   r<      s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)ÚitemsÚexplain_optionsÚpoprs   rl   Úexplain_query_prefixr?   )r   ÚformatÚoptionsÚextraZvalid_optionrf   Úprefix)rp   r   r   ry     s     z'DatabaseOperations.explain_query_prefixc                s   |rdS t ƒ  |¡S )NzON CONFLICT DO NOTHING)rl   Úignore_conflicts_suffix_sql)r   Zignore_conflicts)rp   r   r   r~   #  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_prefixÚ	frozensetrw   Zcast_data_typesr   r   r   r   r   r   r   r   r    r!   r"   r$   r.   r/   r1   r4   r5   rB   rH   rJ   rS   rU   rW   r\   r_   rc   re   rg   rh   ri   rj   rk   rm   ry   r~   Ú__classcell__r   r   )rp   r   r      sb   




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   Ú<module>   s   