a
    xd:                     @   s   d dl 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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mZ d dlmZ d dlmZ G dd deZdS )    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)Col)timezone)
parse_dateparse_datetime
parse_time)duration_microseconds)cached_propertyc                       sd  e Zd ZdZdd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d)d* Zed+d, Zd-d-d.d/d0Zd1d2 Zd3d4 Zd5d6 Z fd7d8Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z& fdGdHZ'dIdJ Z(dKdL Z)dMdN Z*dQ fdOdP	Z+  Z,S )RDatabaseOperationstextZTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLANc                 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)selffieldsobjs r   ]/var/www/html/Ranjet/env/lib/python3.9/site-packages/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||rp|	 D ]8}z
|j
}W n ttfyZ   Y q60 t||r6tdq6t|t jr|jrt|jdkrtd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   zTSQLite doesn't support DISTINCT on aggregate functions accepting multiple arguments.)r   r   r   	TimeFieldZSumZAvgZVarianceZStdDev
isinstanceZget_source_expressionsoutput_fieldAttributeErrorr   r   Z	AggregateZdistinctr   Zsource_expressions)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_sqlE   s    z#DatabaseOperations.date_extract_sqlc                 C   s   t t|S N)strr   )r   	timedeltar   r   r   date_interval_sqlM   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_arithmeticP   s    z1DatabaseOperations.format_for_duration_arithmeticc                 C   s   d|  |f S )Nzdjango_date_trunc('%s', %s)r&   r(   r   r   r   date_trunc_sqlT   s    z!DatabaseOperations.date_trunc_sqlc                 C   s   d|  |f S )Nzdjango_time_trunc('%s', %s)r&   r(   r   r   r   time_trunc_sqlW   s    z!DatabaseOperations.time_trunc_sqlc                 C   s   t jrd| d| jj fS dS )N'%s')NULLr5   )r   USE_TZr   Ztimezone_name)r   tznamer   r   r   _convert_tznames_to_sqlZ   s    z*DatabaseOperations._convert_tznames_to_sqlc                 C   s   d|g|  |R  S )Nz%django_datetime_cast_date(%s, %s, %s)r8   r   r*   r7   r   r   r   datetime_cast_date_sql_   s
    z)DatabaseOperations.datetime_cast_date_sqlc                 C   s   d|g|  |R  S )Nz%django_datetime_cast_time(%s, %s, %s)r9   r:   r   r   r   datetime_cast_time_sqld   s
    z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   d|  |g| |R  S )Nz)django_datetime_extract('%s', %s, %s, %s)r'   r8   r   r)   r*   r7   r   r   r   datetime_extract_sqli   s
    z'DatabaseOperations.datetime_extract_sqlc                 C   s   d|  |g| |R  S )Nz'django_datetime_trunc('%s', %s, %s, %s)r=   r>   r   r   r   datetime_trunc_sqln   s
    z%DatabaseOperations.datetime_trunc_sqlc                 C   s   d|  |f S )Nzdjango_time_extract('%s', %s)r&   r(   r   r   r   time_extract_sqls   s    z#DatabaseOperations.time_extract_sqlc                 C   s   dS )Nr5   r   r   r   r   r   pk_default_valuev   s    z#DatabaseOperations.pk_default_valuec                 C   s   d}t ||krLd}tdt ||D ]"}||||  }|| |7 }q$|S dddgt |  }| jj }z||| W |  S |  0 dS )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        i  r   r   zSELECT , zQUOTE(?)N)	r   range%_quote_params_for_last_executed_queryjoinr   cursorexecuteZfetchoneclose)r   paramsZ
BATCH_SIZEresultsindexchunkr0   rH   r   r   r   rF   y   s    	z8DatabaseOperations._quote_params_for_last_executed_queryc                 C   sR   |rJt |ttfr| |}n$t| }| |}tt||}|| S |S d S r,   )r    listtuplerF   valuesdictzip)r   rH   r0   rK   rQ   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 )Nr   rB   r   r   r   no_limit_value   s    z!DatabaseOperations.no_limit_valuec                 C   sZ   d}|ddf}| j  .}|||}dd | D W  d    S 1 sL0    Y  d S )Nz
        WITH tables AS (
            SELECT %s name
            UNION
            SELECT sqlite_master.name
            FROM sqlite_master
            JOIN tables ON (sql REGEXP %s || tables.name || %s)
        ) SELECT name FROM tables;
        z(?i)\s+references\s+("|\')?z("|\')?\s*\(c                 S   s   g | ]}|d  qS )r   r   .0rowr   r   r   
<listcomp>       z9DatabaseOperations.__references_graph.<locals>.<listcomp>)r   rH   rI   Zfetchall)r   Z
table_namequeryrK   rH   rL   r   r   r   Z__references_graph   s    
z%DatabaseOperations.__references_graphc                 C   s   t dd| jS )Ni   )maxsize)r   %_DatabaseOperations__references_graphrB   r   r   r   _references_graph   s    z$DatabaseOperations._references_graphF)reset_sequencesallow_cascadec                   s`   |r$|r$t t fdd|D } fdd|D }|r\dd |D }| | |S )Nc                 3   s   | ]}  |V  qd S r,   )rd   r]   tablerB   r   r   	<genexpr>   r`   z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              
      s2   g | ]*}d  d d |f qS )z	%s %s %s;DELETEZFROM)SQL_KEYWORD	SQL_FIELDrY   rg   r   styler   r   r_      s   z0DatabaseOperations.sql_flush.<locals>.<listcomp>c                 S   s   g | ]}d |iqS )rh   r   rg   r   r   r   r_      r`   )setr   from_iterableextendsequence_reset_by_name_sql)r   rn   Ztablesre   rf   r0   	sequencesr   rm   r   	sql_flush   s    zDatabaseOperations.sql_flushc                 C   sn   |sg S d| d|| d| d|| d| d|| d| dd	d
d |D f gS )Nz%s %s %s %s = 0 %s %s %s (%s);ZUPDATEZsqlite_sequenceZSETseqZWHERErX   INrD   c                 S   s   g | ]}d |d  qS )r4   rh   r   )r]   Zsequence_infor   r   r   r_      s   zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)rk   Z	SQL_TABLErY   rl   rG   )r   rn   rs   r   r   r   rr      s    
z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   sL   |d u 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   r6   Z
make_naiver   
ValueErrorr-   r   valuer   r   r   adapt_datetimefield_value   s    

z,DatabaseOperations.adapt_datetimefield_valuec                 C   s4   |d u rd S t |dr|S t|r,tdt|S )Nrw   z5SQLite backend does not support timezone-aware times.)rx   r   ry   rz   r-   r{   r   r   r   adapt_timefield_value   s    

z(DatabaseOperations.adapt_timefield_valuec                    s   t  |}|j }|dkr,|| j np|dkrB|| j nZ|dkrX|| j nD|dkrr|| | n*|dkr|| j	 n|dv r|| j
 |S )Nr   r   r   ZDecimalFieldZ	UUIDField)ZNullBooleanFieldZBooleanField)superget_db_convertersr!   Zget_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r   r#   
convertersinternal_type	__class__r   r   r     s    
z$DatabaseOperations.get_db_convertersc                 C   s@   |d ur<t |tjst|}tjr<t|s<t|| jj}|S r,   )	r    datetimer   r   r6   r   ry   Z
make_awarer   r   r|   r#   r   r   r   r   r     s    z.DatabaseOperations.convert_datetimefield_valuec                 C   s    |d urt |tjst|}|S r,   )r    r   dater   r   r   r   r   r      s    z*DatabaseOperations.convert_datefield_valuec                 C   s    |d urt |tjst|}|S r,   )r    r   timer   r   r   r   r   r   &  s    z*DatabaseOperations.convert_timefield_valuec                    sN   t jddj t|tr>t d|jj  fdd}n fdd}|S )N   )precr   c                    s"   | d ur | j |jjdS d S )N)context)quantizer!   r   r|   r#   r   create_decimalZquantize_valuer   r   	converter3  s    z@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d ur | S d S r,   r   r   )r   r   r   r   7  s    )	decimalContextcreate_decimal_from_floatr    r
   Decimalscalebr!   Zdecimal_places)r   r#   r   r   r   r   r   ,  s    
z-DatabaseOperations.get_decimalfield_converterc                 C   s   |d urt |}|S r,   )uuidUUIDr   r   r   r   r   <  s    
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |dv rt |S |S )N)r   r   )boolr   r   r   r   r   A  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 %srD   NrG   r\   r   r   r   ri   E  s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r   )r   r   Zplaceholder_rowsr   r   r   bulk_insert_sqlD  s    
z"DatabaseOperations.bulk_insert_sqlc                    s:   |dkrdd | S |dkr,dd | S t ||S )N^z	POWER(%s),#z
BITXOR(%s))rG   r   combine_expression)r   	connectorsub_expressionsr   r   r   r   J  s
    z%DatabaseOperations.combine_expressionc                 C   sD   |dvrt d| d| g| }t|dkr6tddd| S )N)+-z$Invalid connector for timedelta: %s.r4      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rD   )r   r   rz   rG   )r   r   r   Z	fn_paramsr   r   r   combine_duration_expressionS  s    z.DatabaseOperations.combine_duration_expressionc                 C   s   dS )N)NNr   )r   r   r   r   r   integer_field_range[  s    z&DatabaseOperations.integer_field_rangec           	      C   sF   |\}}|\}}g ||R }|dkr6d||f |fS d||f |fS )Nr   zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )	r   r   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsrK   r   r   r   subtract_temporals_  s    z%DatabaseOperations.subtract_temporalsc                    s   |rdS t  |S )NzINSERT OR IGNORE INTO)r   insert_statement)r   Zignore_conflictsr   r   r   r   g  s    z#DatabaseOperations.insert_statement)F)-__name__
__module____qualname__Z"cast_char_field_without_max_lengthZcast_data_typesZexplain_prefixr   r%   r+   r/   r1   r2   r3   r8   r;   r<   r?   r@   rA   rC   rF   rT   rY   r[   rc   r   rd   rt   rr   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      sV   
	r   )r   r   r   	functoolsr   	itertoolsr   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   r   r   Z"django.db.backends.base.operationsr	   Zdjango.db.models.expressionsr
   Zdjango.utilsr   Zdjango.utils.dateparser   r   r   Zdjango.utils.durationr   Zdjango.utils.functionalr   r   r   r   r   r   <module>   s   