î
Ý^Q\ù0  ã               @   sê   d  d l  m Z d  d l Z d  d l Z d  d l m Z d  d l 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 Gd d „  d e ƒ Z d S)é    )Úunicode_literalsN)Úsettings)Ú
FieldError)Ú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 d8 d9 „  Z ‡  f d: d; †  Z d< d= „  Z  d> d? „  Z! d@ dA „  Z" ‡  S)BÚDatabaseOperationsc             C   sH   t  | ƒ d k r d n d } t  | ƒ d k r> | t  | ƒ St  | ƒ S)zà
        SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
        999 variables per query.

        If there's only a single field to insert, the limit is 500
        (SQLITE_MAX_COMPOUND_SELECT).
        é   iç  iô  r   )Úlen)Úselfr   ÚobjsÚlimit© r   úK/var/www/dbchiro/venv/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_sql/   s    z#DatabaseOperations.date_extract_sqlc             C   s   d t  | ƒ g  f S)Nz'%s')r   )r   Ú	timedeltar   r   r   Údate_interval_sql6   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_arithmetic9   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_sql=   s    z!DatabaseOperations.date_trunc_sqlc             C   s   d | j  ƒ  | f S)Nzdjango_time_trunc('%s', %s))r!   )r   r"   r#   r   r   r   Útime_trunc_sqlD   s    z!DatabaseOperations.time_trunc_sqlc             C   s   d | | g f S)Nz"django_datetime_cast_date(%s, %%s)r   )r   r#   Útznamer   r   r   Údatetime_cast_date_sqlK   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   d | | g f S)Nz"django_datetime_cast_time(%s, %%s)r   )r   r#   r+   r   r   r   Údatetime_cast_time_sqlN   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   d | j  ƒ  | f | g f S)Nz&django_datetime_extract('%s', %s, %%s))r!   )r   r"   r#   r+   r   r   r   Údatetime_extract_sqlQ   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   d | j  ƒ  | f | g f S)Nz$django_datetime_trunc('%s', %s, %%s))r!   )r   r"   r#   r+   r   r   r   Údatetime_trunc_sqlV   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)NZNULLr   )r   r   r   r   Úpk_default_valueb   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'   r6   r   r   r   r3   e   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Útupler3   ÚkeysÚvaluesÚdictÚzip)r   r6   r'   r9   r?   r@   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_FIELDrH   )Ú.0Útable)r   Ústyler   r   ú
<listcomp>Ÿ   s   	z0DatabaseOperations.sql_flush.<locals>.<listcomp>r   )r   rN   ZtablesÚ	sequencesZallow_cascader'   r   )r   rN   r   Ú	sql_flush›   s    
zDatabaseOperations.sql_flushc             C   sr   | d  k r d  St  | d ƒ r# | St j | ƒ re t j rV t j | |  j j ƒ } qe t d ƒ ‚ n  t j	 | ƒ S)NÚresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)
Úhasattrr
   Úis_awarer   ÚUSE_TZZ
make_naiver5   Ú
ValueErrorr	   Ú	text_type)r   Úvaluer   r   r   Úadapt_datetimefield_value¨   s    	z,DatabaseOperations.adapt_datetimefield_valuec             C   sN   | d  k r d  St  | d ƒ r# | St j | ƒ rA t d ƒ ‚ n  t j | ƒ S)NrR   z5SQLite backend does not support timezone-aware times.)rS   r
   rT   rV   r	   rW   )r   rX   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 | d k rá | j |  j ƒ n  | S)	Nr   r   r   ZDecimalFieldZ	UUIDFieldÚNullBooleanFieldÚBooleanField)r[   r\   )Úsuperr   Úget_db_convertersr   Zget_internal_typeÚappendÚconvert_datetimefield_valueÚconvert_datefield_valueÚconvert_timefield_valueÚconvert_decimalfield_valueÚconvert_uuidfield_valueÚconvert_booleanfield_value)r   r   Z
convertersÚinternal_type)Ú	__class__r   r   r^   Ç   s    z$DatabaseOperations.get_db_convertersc             C   sh   | d  k	 rd t  | t j ƒ s- t | ƒ } n  t j rd t j | ƒ rd t j | |  j j ƒ } qd n  | S)N)	r   Údatetimer   r   rU   r
   rT   Z
make_awarer5   )r   rX   r   r5   Ú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   rh   Údater   )r   rX   r   r5   ri   r   r   r   ra   à   s    z*DatabaseOperations.convert_datefield_valuec             C   s4   | d  k	 r0 t  | t j ƒ s0 t | ƒ } q0 n  | S)N)r   rh   Útimer   )r   rX   r   r5   ri   r   r   r   rb   æ   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   rX   r   r5   ri   r   r   r   rc   ì   s    z-DatabaseOperations.convert_decimalfield_valuec             C   s"   | d  k	 r t  j | ƒ } n  | S)N)ÚuuidÚUUID)r   rX   r   r5   ri   r   r   r   rd   ò   s    z*DatabaseOperations.convert_uuidfield_valuec             C   s   | d k r t  | ƒ S| S)Nr   r   )r   r   )Úbool)r   rX   r   r5   ri   r   r   r   re   ÷   s    z-DatabaseOperations.convert_booleanfield_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)r4   )rL   Úrowr   r   r   ú	<genexpr>ü   s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>)r4   )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)ú,)r4   r]   r   Úcombine_expression)r   Ú	connectorÚsub_expressions)rg   r   r   ru      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, )rx   ry   )r   ZDatabaseErrorr   rV   r4   )r   rv   rw   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   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   rf   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,   r-   r.   r/   r0   r1   r3   rC   rH   rJ   rQ   rY   rZ   r^   r`   ra   rb   rc   rd   re   rr   ru   r{   r|   r}   r   r   )rg   r   r      s@   r   )Ú
__future__r   rh   rm   Zdjango.confr   Zdjango.core.exceptionsr   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   r   r   r   r   Ú<module>   s   