3
(h:.                 @   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W n ek
r   dZY nX G d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d0d1 Zd2d3 Zd4d5 Zd6d7 Z fd8d9Zd:d; Zd<d= Z d>d? Z!  Z"S )ADatabaseOperationsc             C   s4   t |dkrdnd}t |dkr,|t | S t |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   I/tmp/pip-install-q3hcpn_q/Django/django/db/backends/sqlite3/operations.pybulk_batch_size   s    z"DatabaseOperations.bulk_batch_sizec             C   sv   t jt jt jf}tjtjtjtjf}t	||rrxB|j
 D ]6}y|j}t	||rVtdW q8 tk
rl   Y q8X q8W 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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rPf }x6tdt ||D ]"}||||  }|| j|7 }q&W |S ddjdgt |  }| jjj }z|j||j S |j  X d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   sZ   |rRt |ttfr| j|}n,|j }t|j }| j|}tt||}|| S |S d 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|S d| 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                s2   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   tables	sequencesZallow_cascader(   r   )r   rR   r   	sql_flush   s    zDatabaseOperations.sql_flushc             C   s@   |d krd S t j|r6tjr.t j|| jj }ntd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 S t j|rtdtj|S )Nz5SQLite backend does not support timezone-aware times.)r   rW   rX   r
   rY   )r   rZ   r   r   r   adapt_timefield_value   s
    
z(DatabaseOperations.adapt_timefield_valuec                s   t t| j|}|jj }|dkr0|j| j nV|dkrF|j| j n@|dkr\|j| j n*|dkrr|j| j	 n|dkr|j| j
 |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   
convertersinternal_type)	__class__r   r   r^      s    
z$DatabaseOperations.get_db_convertersc             C   s6   |d k	r2t |tjst|}tjr2tj|| jj}|S )N)r   datetimer   r   r+   r   Z
make_awarer9   )r   rZ   r   r9   contextr   r   r   r`      s    z.DatabaseOperations.convert_datetimefield_valuec             C   s    |d k	rt |tjst|}|S )N)r   rh   dater   )r   rZ   r   r9   ri   r   r   r   ra      s    z*DatabaseOperations.convert_datefield_valuec             C   s    |d k	rt |tjst|}|S )N)r   rh   timer   )r   rZ   r   r9   ri   r   r   r   rb      s    z*DatabaseOperations.convert_timefield_valuec             C   s"   |d k	r|j j|}tj|}|S )N)r   Zformat_numberbackend_utilsZtypecast_decimal)r   rZ   r   r9   ri   r   r   r   rc      s    
z-DatabaseOperations.convert_decimalfield_valuec             C   s   |d k	rt j|}|S )N)uuidUUID)r   rZ   r   r9   ri   r   r   r   rd      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                s(   |dkrddj | S tt| j||S )N^zdjango_power(%s),)r8   r]   r   combine_expression)r   	connectorsub_expressions)rg   r   r   rt      s    z%DatabaseOperations.combine_expressionc             C   sF   |d	krt jd| d| g| }t|dkr8td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, )rw   rx   )r   ZDatabaseErrorr   rX   r8   )r   ru   rv   Z	fn_paramsr   r   r   combine_duration_expression   s    z.DatabaseOperations.combine_duration_expressionc             C   s   dS )N)NNr   )r   rf   r   r   r   integer_field_range  s    z&DatabaseOperations.integer_field_rangec             C   s@   |\}}|\}}|dkr,d||f || fS d||f || fS )Nr   zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )r   rf   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr   r   r   subtract_temporals  s
    z%DatabaseOperations.subtract_temporals)F)#__name__
__module____qualname__r   r!   r%   r'   r)   r*   r-   r/   r0   r1   r2   r4   r5   r7   rG   rL   rN   rV   r[   r\   r^   r`   ra   rb   rc   rd   rq   rt   rz   r{   r~   __classcell__r   r   )rg   r   r      s>   

r   )
__future__r   rh   rm   Zdjango.confr   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.db.backendsrl   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    
