3
g.                 @   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.   |j  }|d	kr*d|j| jjdd  S dS )
NGenericIPAddressFieldIPAddressField	TimeField	UUIDFieldzCAST(%%s AS %s)(r   z%s)r	   r
   r   r   )Zget_internal_typeZdb_type
connectionsplit)selfZoutput_fieldinternal_type r   f/var/www/tester-filtro-web/env/lib/python3.6/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   | j ||}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|j ddS d|kr(|j 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|| j|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   | j ||}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   | j ||}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   | j ||}| j||S )N)r   r   )r   r   r   r   r   r   r   datetime_extract_sqlN   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   | j ||}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   | j ||}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   |j  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regexiregexr
   r	   zHOST(%s)CICharFieldCIEmailFieldCITextFieldz
%s::citextz%s::textz	UPPER(%s))	r'   r(   r)   r*   r+   r,   r-   r.   r/   )r
   r	   )r0   r1   r2   )r'   r)   r+   r-   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    |j dr|j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 j ddj fdd|D g}|r@|jj d |rT|jj d ddj| gS )	NZTRUNCATEz, c             3   s   | ]}j  j|V  qd S )N)	SQL_FIELDr:   ).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tablesr<   r=   Z	sql_partsr   )r   rA   r   	sql_flush   s    zDatabaseOperations.sql_flushc             C   sV   g }xL|D ]D}|d }|d p d}|j d|jd|j| j||j|f  q
W |S )Nr@   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rF   rD   	SQL_TABLEr:   r>   )r   rA   	sequencesr6   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| j | S d| j | 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}x|D ]}x|jjD ]~}t||jr*|jd|jd|j	||jj
|j|j|j||j|j||j|jd|jd|j	||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;rJ   zIS NOTZFROM)Z	django.dbrP   r:   _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 )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j | 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)z, ZDISTINCT)rE   )r   fieldsparamsr   r   r   distinct_sql   s    zDatabaseOperations.distinct_sqlc             C   s   |j d k	r|j j S d S )N)querydecode)r   r%   r6   r`   r   r   r   last_executed_query   s    

z&DatabaseOperations.last_executed_queryc                s0   |sdf fS  fdd|D }ddj | f fS )N c                s,   g | ]$}d  j |jjj j |jf qS )z%s.%s)r:   rV   rQ   rS   rH   )r?   field)r   r   r   r^      s   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sz, )rE   )r   r_   columnsr   )r   r   return_insert_columns   s
    
z(DatabaseOperations.return_insert_columnsc             C   s*   dd |D }dj dd |D }d| S )Nc             s   s   | ]}d j |V  qdS )z, N)rE   )r?   rowr   r   r   rB      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r?   r6   r   r   r   rB      s    zVALUES )rE   )r   r_   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   rk   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   |S )Nr   )r   rk   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   |S )Nr   )r   rk   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   rk   r   r   r   adapt_ipaddressfield_value  s    z-DatabaseOperations.adapt_ipaddressfield_valuec       	         s@   |dkr0|\}}|\}}||}d||f |fS t  j|||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   rr     s    z%DatabaseOperations.subtract_temporalsc                s   i }|rJdd |j  D }x.| jD ]$}|j|d }|d k	r"|||j < q"W t j|f|}|rf||d< |r|ddjdd |j  D  7 }|S )Nc             S   s"   i | ]\}}|rd nd|j  qS )truefalse)upper)r?   r9   rk   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   )r?   ir   r   r   rB      s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspoprx   rq   explain_query_prefixrE   )r   formatoptionsextraZvalid_optionrk   prefix)ru   r   r   r~     s     z'DatabaseOperations.explain_query_prefixc                s   |rdS t  j|S )NzON CONFLICT DO NOTHING)rq   ignore_conflicts_suffix_sql)r   Zignore_conflicts)ru   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	frozensetr|   Zcast_data_typesr   r   r   r   r   r   r    r!   r"   r#   r$   r&   r4   r5   r7   r:   r;   rG   rM   rO   rX   rZ   r\   ra   rd   rh   rj   rl   rm   rn   ro   rp   rr   r~   r   __classcell__r   r   )ru   r   r      sb   




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   