B
    ©0H[V.  ã               @   sœ   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 d d	lmZmZmZ d d
lmZ G dd„ deƒZdS )é    N)ÚDecimal)Úsettings)Ú
FieldError)Úutils)ÚBaseDatabaseOperations)Ú
aggregatesÚfields)Útimezone)Ú
parse_dateÚparse_datetimeÚ
parse_time)Úduration_stringc                   s2  e Zd 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%„ ZdGd'd(„Z‡ fd)d*„Zd+d,„ Zd-d.„ Z‡ fd/d0„Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!‡ fd?d@„Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%‡  Z&S )HÚDatabaseOperationsÚtextc             C   s:   t |ƒdkrdS t |ƒdkr.| jjjt |ƒ S t |ƒS d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ô  N)ÚlenÚ
connectionÚfeaturesZmax_query_params)Úselfr   Úobjs© r   úiC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\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| 
¡ D ]6}y
|j}W n tk
rZ   Y q8X t	||ƒr8tdƒ‚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_fieldr   ÚNotImplementedError)r   Ú
expressionZ
bad_fieldsZbad_aggregatesÚexprr   r   r   r   Úcheck_expression_support!   s    


z+DatabaseOperations.check_expression_supportc             C   s   d|  ¡ |f S )zè
        Support EXTRACT with a user-defined function django_date_extract()
        that's registered in connect(). Use single quotes because this is a
        string and could otherwise cause a collision with a field name.
        z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 |ƒ S )Nz'%s')r   )r   Ú	timedeltar   r   r   Údate_interval_sql<   s    z$DatabaseOperations.date_interval_sqlc             C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   Úsqlr   r   r   Úformat_for_duration_arithmetic?   s    z1DatabaseOperations.format_for_duration_arithmeticc             C   s   d|  ¡ |f S )Nzdjango_date_trunc('%s', %s))r"   )r   r#   r$   r   r   r   Údate_trunc_sqlC   s    z!DatabaseOperations.date_trunc_sqlc             C   s   d|  ¡ |f S )Nzdjango_time_trunc('%s', %s))r"   )r   r#   r$   r   r   r   Útime_trunc_sqlF   s    z!DatabaseOperations.time_trunc_sqlc             C   s   t jrd| S dS )Nz'%s'ÚNULL)r   ÚUSE_TZ)r   Útznamer   r   r   Ú_convert_tzname_to_sqlI   s    z)DatabaseOperations._convert_tzname_to_sqlc             C   s   d||   |¡f S )Nz!django_datetime_cast_date(%s, %s))r/   )r   r$   r.   r   r   r   Údatetime_cast_date_sqlL   s    z)DatabaseOperations.datetime_cast_date_sqlc             C   s   d||   |¡f S )Nz!django_datetime_cast_time(%s, %s))r/   )r   r$   r.   r   r   r   Údatetime_cast_time_sqlQ   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s   d|  ¡ ||  |¡f S )Nz%django_datetime_extract('%s', %s, %s))r"   r/   )r   r#   r$   r.   r   r   r   Údatetime_extract_sqlV   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   d|  ¡ ||  |¡f S )Nz#django_datetime_trunc('%s', %s, %s))r"   r/   )r   r#   r$   r.   r   r   r   Údatetime_trunc_sql[   s    z%DatabaseOperations.datetime_trunc_sqlc             C   s   d|  ¡ |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 )Nr,   r   )r   r   r   r   Úpk_default_valuec   s    z#DatabaseOperations.pk_default_valuec             C   s”   d}t |ƒ|krPd}x6tdt |ƒ|ƒD ]"}|||| … }||  |¡7 }q&W |S dd dgt |ƒ ¡ }| jj ¡ }z| ||¡ ¡ S | ¡  X dS )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        iç  r   r   zSELECT z, zQUOTE(?)N)	r   ÚrangeÚ%_quote_params_for_last_executed_queryÚjoinr   ÚcursorÚexecuteZfetchoneÚclose)r   ÚparamsZ
BATCH_SIZEÚresultsÚindexÚchunkr(   r9   r   r   r   r7   f   s    	z8DatabaseOperations._quote_params_for_last_executed_queryc             C   sR   |rJt |ttfƒr|  |¡}n$t| ¡ ƒ}|  |¡}tt||ƒƒ}|| S |S d S )N)r   ÚlistÚtupler7   ÚvaluesÚdictÚzip)r   r9   r(   r<   rB   r   r   r   Úlast_executed_query�   s    
z&DatabaseOperations.last_executed_queryc             C   s    |  d¡r| 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 )Néÿÿÿÿr   )r   r   r   r   Úno_limit_value˜   s    z!DatabaseOperations.no_limit_valueFc                s   ‡ ‡fdd„|D ƒ}|S )Nc          
      s2   g | ]*}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f ‘qS )z	%s %s %s;ÚDELETEZFROM)ZSQL_KEYWORDZ	SQL_FIELDrJ   )Ú.0Útable)r   Ústyler   r   ú
<listcomp>œ   s   z0DatabaseOperations.sql_flush.<locals>.<listcomp>r   )r   rP   ÚtablesÚ	sequencesZallow_cascader(   r   )r   rP   r   Ú	sql_flush›   s    zDatabaseOperations.sql_flushc          	      s(   | j  ¡ � tƒ  ||¡ W d Q R X d S )N)r   Zconstraint_checks_disabledÚsuperÚexecute_sql_flush)r   ZusingZsql_list)Ú	__class__r   r   rV   ¥   s    z$DatabaseOperations.execute_sql_flushc             C   sL   |d krd S t |dƒr|S t |¡rDtjr<t || jj¡}ntdƒ‚t|ƒS )NÚresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	Úhasattrr	   Úis_awarer   r-   Z
make_naiver   Ú
ValueErrorÚstr)r   Úvaluer   r   r   Úadapt_datetimefield_value«   s    

z,DatabaseOperations.adapt_datetimefield_valuec             C   s4   |d krd S t |dƒr|S t |¡r,tdƒ‚t|ƒS )NrX   z5SQLite backend does not support timezone-aware times.)rY   r	   rZ   r[   r\   )r   r]   r   r   r   Úadapt_timefield_value¼   s    

z(DatabaseOperations.adapt_timefield_valuec                sœ   t ƒ  |¡}|j ¡ }|dkr,| | j¡ nl|dkrB| | j¡ nV|dkrX| | j¡ n@|dkrn| | j¡ n*|dkr„| | j	¡ n|dkr˜| | j
¡ |S )Nr   r   r   ZDecimalFieldZ	UUIDField)ZNullBooleanFieldZBooleanField)rU   Ú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   Ú
convertersÚinternal_type)rW   r   r   r`   Ê   s    
z$DatabaseOperations.get_db_convertersc             C   s@   |d k	r<t |tjƒst|ƒ}tjr<t |¡s<t || jj¡}|S )N)	r   Údatetimer   r   r-   r	   rZ   Z
make_awarer   )r   r]   r   r   r   r   r   rb   Û   s    z.DatabaseOperations.convert_datetimefield_valuec             C   s    |d k	rt |tjƒst|ƒ}|S )N)r   rj   Údater
   )r   r]   r   r   r   r   r   rc   ã   s    z*DatabaseOperations.convert_datefield_valuec             C   s    |d k	rt |tjƒst|ƒ}|S )N)r   rj   Útimer   )r   r]   r   r   r   r   r   rd   é   s    z*DatabaseOperations.convert_timefield_valuec             C   s    |d k	r|j  |¡}t|ƒ}|S )N)r   Zformat_numberr   )r   r]   r   r   r   r   r   re   ï   s    z-DatabaseOperations.convert_decimalfield_valuec             C   s   |d k	rt  |¡}|S )N)ÚuuidÚUUID)r   r]   r   r   r   r   r   rf   õ   s    
z*DatabaseOperations.convert_uuidfield_valuec             C   s   |dkrt |ƒS |S )N)r   r   )Úbool)r   r]   r   r   r   r   r   rg   ú   s    z-DatabaseOperations.convert_booleanfield_valuec             C   s   d  dd„ |D ƒ¡S )Nz UNION ALL c             s   s   | ]}d d  |¡ V  qdS )z	SELECT %sz, N)r8   )rN   Ú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  |¡ S tƒ  ||¡S )Nú^zdjango_power(%s)ú,)r8   rU   Úcombine_expression)r   Ú	connectorÚsub_expressions)rW   r   r   ru     s    z%DatabaseOperations.combine_expressionc             C   sF   |dkrt  d| ¡‚d| g| }t|ƒdkr8tdƒ‚dd |¡ S )N)ú+ú-z$Invalid connector for timedelta: %s.z'%s'é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)z, )r   ZDatabaseErrorr   r[   r8   )r   rv   rw   Z	fn_paramsr   r   r   Úcombine_duration_expression
  s    z.DatabaseOperations.combine_duration_expressionc             C   s   dS )N)NNr   )r   ri   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   ri   ÚlhsÚrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr   r   r   Úsubtract_temporals  s
    z%DatabaseOperations.subtract_temporals)F)'Ú__name__Ú
__module__Ú__qualname__Z"cast_char_field_without_max_lengthr   r!   r%   r'   r)   r*   r+   r/   r0   r1   r2   r3   r4   r5   r7   rE   rJ   rL   rT   rV   r^   r_   r`   rb   rc   rd   re   rf   rg   rr   ru   r{   r|   r   Ú__classcell__r   r   )rW   r   r      sF   

r   )rj   rm   Údecimalr   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Z"django.db.backends.base.operationsr   Zdjango.db.modelsr   r   Zdjango.utilsr	   Zdjango.utils.dateparser
   r   r   Zdjango.utils.durationr   r   r   r   r   r   Ú<module>   s   