
 X:.                 @   s  d  d l  m Z d  d l Z d  d l Z d  d l m Z d  d l m Z m Z d  d l	 m
 Z
 d  d l m
 Z d  d l m Z d  d l m Z m Z d  d l m Z m Z d  d	 l m Z m Z m Z d  d
 l m Z y d  d l Z Wn e k
 r d Z Yn XGd d   d e  Z d S)    )unicode_literalsN)settings)
FieldErrorImproperlyConfigured)utils)BaseDatabaseOperations)
aggregatesfields)sixtimezone)
parse_dateparse_datetime
parse_time)duration_stringc                   s  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   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   f d* d+   Z d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z   f d8 d9   Z d: d;   Z d< d=   Z  d> d?   Z!   S)@DatabaseOperationsc             C   sH   t  |  d k r d n d } t  |  d k r> | t  |  St  |  S)a  
        SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
        999 variables per query.

        If there is just single field to insert, then we can hit another
        limit, SQLITE_MAX_COMPOUND_SELECT which defaults to 500.
           i  i  r   )len)selfr	   objslimit r   S/home/ubuntu/projects/ifolica/build/django/django/db/backends/sqlite3/operations.pybulk_batch_size   s    z"DatabaseOperations.bulk_batch_sizec             C   s   t  j t  j t  j f } t j t j t j t j f } t	 | |  r xW | j
   D]F } y+ | j } t	 | |  r t d   n  WqR t k
 r YqR XqR Wn  d  S)Nz{You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.)r	   	DateFieldDateTimeField	TimeFieldr   ZSumZAvgZVarianceZStdDev
isinstanceZget_source_expressionsoutput_fieldNotImplementedErrorr   )r   
expressionZ
bad_fieldsZbad_aggregatesexprr   r   r   r   check_expression_support"   s    	z+DatabaseOperations.check_expression_supportc             C   s   d | j    | f S)Nzdjango_date_extract('%s', %s))lower)r   lookup_type
field_namer   r   r   date_extract_sql4   s    z#DatabaseOperations.date_extract_sqlc             C   s   d t  |  g  f S)Nz'%s')r   )r   	timedeltar   r   r   date_interval_sql;   s    z$DatabaseOperations.date_interval_sqlc             C   s   | S)z:Do nothing here, we will handle it in the custom function.r   )r   sqlr   r   r   format_for_duration_arithmetic>   s    z1DatabaseOperations.format_for_duration_arithmeticc             C   s   d | j    | f S)Nzdjango_date_trunc('%s', %s))r"   )r   r#   r$   r   r   r   date_trunc_sqlB   s    z!DatabaseOperations.date_trunc_sqlc             C   s(   t  j r$ t d  k r$ t d   n  d  S)Nz1This query requires pytz, but it isn't installed.)r   USE_TZpytzr   )r   r   r   r   _require_pytzI   s    z DatabaseOperations._require_pytzc             C   s   |  j    d | | g f S)Nz"django_datetime_cast_date(%s, %%s))r-   )r   r$   tznamer   r   r   datetime_cast_date_sqlM   s    
z)DatabaseOperations.datetime_cast_date_sqlc             C   s'   |  j    d | j   | f | g f S)Nz&django_datetime_extract('%s', %s, %%s))r-   r"   )r   r#   r$   r.   r   r   r   datetime_extract_sqlQ   s    
z'DatabaseOperations.datetime_extract_sqlc             C   s'   |  j    d | j   | f | g f S)Nz$django_datetime_trunc('%s', %s, %%s))r-   r"   )r   r#   r$   r.   r   r   r   datetime_trunc_sqlW   s    
z%DatabaseOperations.datetime_trunc_sqlc             C   s   d | j    | f S)Nzdjango_time_extract('%s', %s))r"   )r   r#   r$   r   r   r   time_extract_sql]   s    z#DatabaseOperations.time_extract_sqlc             C   s   d S)N r   )r   r   r   r   drop_foreignkey_sqld   s    z&DatabaseOperations.drop_foreignkey_sqlc             C   s   d S)NZNULLr   )r   r   r   r   pk_default_valueg   s    z#DatabaseOperations.pk_default_valuec          
   C   s   d } t  |  | k rl f  } xG t d t  |  |  D]- } | | | |  } | |  j |  7} q7 W| Sd d j d g t  |   } |  j j j   } z | j | |  j   SWd | j   Xd S)zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        i  r   zSELECT z, zQUOTE(?)N)	r   range%_quote_params_for_last_executed_queryjoin
connectioncursorexecuteZfetchoneclose)r   paramsZ
BATCH_SIZEresultsindexchunkr(   r:   r   r   r   r7   j   s    	 z8DatabaseOperations._quote_params_for_last_executed_queryc             C   s   | rw t  | t t f  r- |  j |  } nB | j   } t | j    } |  j |  } t t | |   } | | S| Sd  S)N)r   listtupler7   keysvaluesdictzip)r   r:   r(   r=   rC   rD   r   r   r   last_executed_query   s    z&DatabaseOperations.last_executed_queryc             C   s*   | j  d  r" | j d  r" | Sd | S)N"z"%s")
startswithendswith)r   namer   r   r   
quote_name   s    zDatabaseOperations.quote_namec             C   s   d S)Nr   r   )r   r   r   r   no_limit_value   s    z!DatabaseOperations.no_limit_valueFc                s       f d d   | D } | S)Nc                sG   g  |  ]= } d   j  d   j  d   j   j |   f  q S)z	%s %s %s;DELETEZFROM)ZSQL_KEYWORDZ	SQL_FIELDrL   ).0table)r   styler   r   
<listcomp>   s   	z0DatabaseOperations.sql_flush.<locals>.<listcomp>r   )r   rR   Ztables	sequencesZallow_cascader(   r   )r   rR   r   	sql_flush   s    
zDatabaseOperations.sql_flushc             C   s_   | d  k r d  St  j |  rR t j rC t  j | |  j j   } qR t d   n  t j |  S)NzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	r   is_awarer   r+   Z
make_naiver9   
ValueErrorr
   	text_type)r   valuer   r   r   adapt_datetimefield_value   s    	z,DatabaseOperations.adapt_datetimefield_valuec             C   s;   | d  k r d  St  j |  r. t d   n  t j |  S)Nz5SQLite backend does not support timezone-aware times.)r   rV   rW   r
   rX   )r   rY   r   r   r   adapt_timefield_value   s
    z(DatabaseOperations.adapt_timefield_valuec                s   t  t |   j |  } | j j   } | d k rF | j |  j  n| | d k re | j |  j  n] | d k r | j |  j  n> | d k r | j |  j	  n | d k r | j |  j
  n  | S)Nr   r   r   ZDecimalFieldZ	UUIDField)superr   get_db_convertersr   Zget_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueconvert_decimalfield_valueconvert_uuidfield_value)r   r   Z
convertersinternal_type)	__class__r   r   r]      s    z$DatabaseOperations.get_db_convertersc             C   sX   | d  k	 rT t  | t j  s- t |  } n  t j rT t j | |  j j  } qT n  | S)N)r   datetimer   r   r+   r   Z
make_awarer9   )r   rY   r   r9   contextr   r   r   r_      s    	z.DatabaseOperations.convert_datetimefield_valuec             C   s4   | d  k	 r0 t  | t j  s0 t |  } q0 n  | S)N)r   rf   dater   )r   rY   r   r9   rg   r   r   r   r`      s    z*DatabaseOperations.convert_datefield_valuec             C   s4   | d  k	 r0 t  | t j  s0 t |  } q0 n  | S)N)r   rf   timer   )r   rY   r   r9   rg   r   r   r   ra      s    z*DatabaseOperations.convert_timefield_valuec             C   s4   | d  k	 r0 | j  j |  } t j |  } n  | S)N)r   Zformat_numberbackend_utilsZtypecast_decimal)r   rY   r   r9   rg   r   r   r   rb      s    z-DatabaseOperations.convert_decimalfield_valuec             C   s"   | d  k	 r t  j |  } n  | S)N)uuidUUID)r   rY   r   r9   rg   r   r   r   rc      s    z*DatabaseOperations.convert_uuidfield_valuec             C   s   d j  d d   | D  S)Nz UNION ALL c             s   s"   |  ] } d  d j  |  Vq d S)z	SELECT %sz, N)r8   )rP   rowr   r   r   	<genexpr>   s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>)r8   )r   r	   Zplaceholder_rowsr   r   r   bulk_insert_sql   s    	z"DatabaseOperations.bulk_insert_sqlc                s6   | d k r d d j  |  St t |   j | |  S)N^zdjango_power(%s),)r8   r\   r   combine_expression)r   	connectorsub_expressions)re   r   r   rr      s    z%DatabaseOperations.combine_expressionc             C   se   | d	 k r" t  j d |   n  d | g | } t |  d k rT t d   n  d d j |  S)
N+-z$Invalid connector for timedelta: %s.z'%s'   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)z, )ru   rv   )r   ZDatabaseErrorr   rW   r8   )r   rs   rt   Z	fn_paramsr   r   r   combine_duration_expression   s    z.DatabaseOperations.combine_duration_expressionc             C   s   d S)N)NNr   )r   rd   r   r   r   integer_field_range  s    z&DatabaseOperations.integer_field_rangec             C   sT   | \ } } | \ } } | d k r< d | | f | | f Sd | | f | | f S)Nr   zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )r   rd   ZlhsZrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr   r   r   subtract_temporals  s
    z%DatabaseOperations.subtract_temporals)"__name__
__module____qualname__r   r!   r%   r'   r)   r*   r-   r/   r0   r1   r2   r4   r5   r7   rG   rL   rN   rU   rZ   r[   r]   r_   r`   ra   rb   rc   ro   rr   rx   ry   rz   r   r   )re   r   r      s>   
r   )
__future__r   rf   rk   Zdjango.confr   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.db.backendsrj   Z"django.db.backends.base.operationsr   Zdjango.db.modelsr   r	   Zdjango.utilsr
   r   Zdjango.utils.dateparser   r   r   Zdjango.utils.durationr   r,   ImportErrorr   r   r   r   r   <module>   s    