3
j6b,                 @   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                   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.   |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   g/var/www/html/sandeepIITI/myenv/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_sql)   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   5   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_sql:   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_sql>   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   | j ||}| j||S )N)r   r   )r   r   r   r   r   r   r   datetime_extract_sqlB   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_sqlF   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_sqlK   s    z!DatabaseOperations.time_trunc_sqlc             C   s   dS )Nz DEFERRABLE INITIALLY DEFERREDr   )r   r   r   r   deferrable_sqlO   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_rowsR   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   )r/   r0   r1   )r&   r(   r*   r,   r   )r   r   r   lookupr   r   r   lookup_castY   s    zDatabaseOperations.lookup_castc             C   s   d S )Nr   )r   r   r   r   no_limit_valuel   s    z!DatabaseOperations.no_limit_valuec             C   s   |gS )Nr   )r   sqlr   r   r   prepare_sql_scripto   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_namer   s    zDatabaseOperations.quote_namec             C   s   dS )NzSET TIME ZONE %sr   )r   r   r   r   set_time_zone_sqlw   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_FIELDr9   ).0table)r   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r   r@   Ztablesr;   r<   Z	sql_partsr   )r   r@   r   	sql_flushz   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)rE   rC   	SQL_TABLEr9   r=   )r   r@   	sequencesr5   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)r9   )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;rI   zIS NOTZFROM)Z	django.dbrO   r9   _metaZlocal_fields
isinstancer   rE   rC   rJ   db_tabler=   rG   )r   r@   Z
model_listrO   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)rD   )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$   r5   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)r9   rU   rP   rR   rG   )r>   field)r   r   r   r]      s   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sz, )rD   )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)rD   )r>   rowr   r   r   rA      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d | V  qdS )z(%s)Nr   )r>   r5   r   r   r   rA      s    zVALUES )rD   )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   rj   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   |S )Nr   )r   rj   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   |S )Nr   )r   rj   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   rj   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   rq      s    z%DatabaseOperations.subtract_temporalsc                s`   t  j|}i }|r||d< |r8|jdd |j D  |r\|ddjdd |j D  7 }|S )NZFORMATc             S   s"   i | ]\}}|rd nd|j  qS )truefalse)upper)r>   r8   rj   r   r   r   
<dictcomp>
  s   z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)z, c             s   s   | ]}d | V  qdS )z%s %sNr   )r>   ir   r   r   rA     s    z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rp   explain_query_prefixupdateitemsrD   )r   formatoptionsprefixextra)rt   r   r   rz     s    
 z'DatabaseOperations.explain_query_prefixc                s   |rdS t  j|S )NzON CONFLICT DO NOTHING)rp   ignore_conflicts_suffix_sql)r   Zignore_conflicts)rt   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_prefixZcast_data_typesr   r   r   r   r   r   r   r    r!   r"   r#   r%   r3   r4   r6   r9   r:   rF   rL   rN   rW   rY   r[   r`   rc   rg   ri   rk   rl   rm   rn   ro   rq   rz   r   __classcell__r   r   )rt   r   r      sP   




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   