

_V'                 @   sZ   d  d l  m Z d  d l m Z d  d l m Z d  d l m Z Gd d   d e  Z d S)    )unicode_literals)Inet)settings)BaseDatabaseOperationsc               @   si  e  Z 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 d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d d   Z d! d"   Z d d# d$  Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d S);DatabaseOperationsc             C   s=   | j    } | d	 k r9 d | j |  j  j d  d Sd 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   J/tmp/pip-build-ghmbqnp_/Django/django/db/backends/postgresql/operations.pyunification_cast_sql
   s    !z'DatabaseOperations.unification_cast_sqlc             C   s&   | d k r d | Sd | | f Sd  S)NZweek_dayzEXTRACT('dow' FROM %s) + 1z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   r   r   date_trunc_sql   s    z!DatabaseOperations.date_trunc_sqlc             C   s/   t  j r d | } | g } n g  } | | f S)Nz%s AT TIME ZONE %%s)r   ZUSE_TZ)r   r   tznameparamsr   r   r   _convert_field_to_tz#   s
    	
z'DatabaseOperations._convert_field_to_tzc             C   s,   |  j  | |  \ } } d | } | | f S)Nz
(%s)::date)r   )r   r   r   r   sqlr   r   r   datetime_cast_date_sql+   s    
z)DatabaseOperations.datetime_cast_date_sqlc             C   s4   |  j  | |  \ } } |  j | |  } | | f S)N)r   r   )r   r   r   r   r   r   r   r   r   datetime_extract_sql0   s    z'DatabaseOperations.datetime_extract_sqlc             C   s2   |  j  | |  \ } } d | | f } | | f S)NzDATE_TRUNC('%s', %s))r   )r   r   r   r   r   r   r   r   r   datetime_trunc_sql5   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   d S)Nz DEFERRABLE INITIALLY DEFERREDr   )r   r   r   r   deferrable_sql;   s    z!DatabaseOperations.deferrable_sqlNc          
   C   sM   d } | d k r0 | d k r' d } q0 d } n  | d k rI d | } n  | S)Nz%siexactcontains	icontains
startswithistartswithendswith	iendswithregexiregexr   r   zHOST(%s)z%s::textz	UPPER(%s))	r   zcontainsr!   z
startswithr#   zendswithr%   zregexr'   )zIPAddressFieldzGenericIPAddressField)r   r!   r#   r%   r   )r   r   r   lookupr   r   r   lookup_cast>   s    			zDatabaseOperations.lookup_castc             C   s.   | j  d |  j |  | f  | j   d S)Nz1SELECT CURRVAL(pg_get_serial_sequence('%s','%s'))r   )execute
quote_nameZfetchone)r   cursor
table_nameZpk_namer   r   r   last_insert_idO   s    	z!DatabaseOperations.last_insert_idc             C   s   d  S)Nr   )r   r   r   r   no_limit_valueV   s    z!DatabaseOperations.no_limit_valuec             C   s   | g S)Nr   )r   r   r   r   r   prepare_sql_scriptY   s    z%DatabaseOperations.prepare_sql_scriptc             C   s*   | j  d  r" | j d  r" | Sd | S)N"z"%s")r"   r$   )r   namer   r   r   r+   \   s    zDatabaseOperations.quote_namec             C   s   d S)NzSET TIME ZONE %sr   )r   r   r   r   set_time_zone_sqla   s    z$DatabaseOperations.set_time_zone_sqlFc                s   | r d j     f d d   | D  } | r\ d  j d  |  j d  f g } n d  j d  | f g } | j   j  |   | Sg  Sd  S)Nz, c             3   s'   |  ] }  j    j |   Vq d  S)N)	SQL_FIELDr+   ).0table)r   styler   r   	<genexpr>j   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>z	%s %s %s;ZTRUNCATEZCASCADEz%s %s;)joinSQL_KEYWORDextendsequence_reset_by_name_sql)r   r7   Ztables	sequencesZallow_cascadeZ
tables_sqlr   r   )r   r7   r   	sql_flushd   s    zDatabaseOperations.sql_flushc             C   s   g  } x | D]y } | d } | d } | o< t  |  d k sH d } n  | j d | j d  | j |  j |   | j |  f  q W| S)Nr6   columnr   idz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)lenappendr:   	SQL_TABLEr+   r4   )r   r7   r=   r   Zsequence_infor-   Zcolumn_namer   r   r   r<   {   s    

		z-DatabaseOperations.sequence_reset_by_name_sqlc             C   s,   | r d |  j  |  Sd |  j  |  Sd  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  r9 | j d | j d  | j	 | | j j
   | j | j  | j | | j   | j | | j   | j d  | j d  | j	 | | j j
   f  Pq9 q9 Wx | j j D] } | j j s| j d | j d  | j	 | | j     | j d  | j | d   | j | d   | j d  | j d  | j	 | | j     f  qqWq& W| S)Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rA   zIS NOTZFROMr@   )Z	django.dbrG   r+   Z_metaZlocal_fields
isinstanceZ	AutoFieldrC   r:   rD   Zdb_tabler4   r?   Zmany_to_manyZremote_fieldZthroughZm2m_db_table)r   r7   Z
model_listrG   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  
        Returns the maximum length of an identifier.

        Note that 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 simply returns 63, but can easily 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   s   | r d d j  |  Sd Sd  S)NzDISTINCT ON (%s)z, ZDISTINCT)r9   )r   fieldsr   r   r   distinct_sql   s    zDatabaseOperations.distinct_sqlc             C   s#   | j  d  k	 r | j  j d  Sd  S)Nzutf-8)querydecode)r   r,   r   r   r   r   r   last_executed_query   s    z&DatabaseOperations.last_executed_queryc             C   s
   d f  f S)NzRETURNING %sr   )r   r   r   r   return_insert_id   s    z#DatabaseOperations.return_insert_idc             C   s7   d d   | D } d j  d d   | D  } d | S)Nc             s   s   |  ] } d  j  |  Vq d S)z, N)r9   )r5   rowr   r   r   r8      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   |  ] } d  | Vq d S)z(%s)Nr   )r5   r   r   r   r   r8      s    zVALUES )r9   )r   rR   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   rZ   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   s   | S)Nr   )r   rZ   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s   | r t  |  Sd  S)N)r   )r   rZ   r   r   r   adapt_ipaddressfield_value   s    
z-DatabaseOperations.adapt_ipaddressfield_value)__name__
__module____qualname__r   r   r   r   r   r   r   r   r)   r.   r/   r0   r+   r3   r>   r<   rF   rM   rO   rQ   rS   rV   rW   rY   r[   r\   r]   r^   r   r   r   r   r   	   s8   ,r   N)	
__future__r   Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s   