o
    ^"<fV:                     @   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 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)cached_propertyc                       s`  e Zd ZdZdddZdZdd Zdd Zd	d
 Zdd Z	dPddZ
dPd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.d/Zd0d1 Zd2d3 Zd4d5 Z fd6d7Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z% fdFdGZ&dHdI Z'dJdK Z(dLdM Z)dQ fdNdO	Z*  Z+S )RDatabaseOperationstextTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLANc                 C   s6   t |dkrdS t |dkr| jjjt | S t |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  )len
connectionfeaturesmax_query_params)selffieldsobjs r   \/var/www/html/kck/venv/lib/python3.10/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||r8|	 D ]}z|j
}W n ttfy-   Y qw t||r7tdqt|t jrL|jrNt|jdkrPtdd S d S 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   	TimeFieldSumAvgVarianceStdDev
isinstanceget_source_expressionsoutput_fieldAttributeErrorr   r   	Aggregatedistinctr   source_expressions)r   
expression
bad_fieldsbad_aggregatesexprr'   r   r   r   check_expression_support(   s0   



z+DatabaseOperations.check_expression_supportc                 C      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_sqlD   s   z#DatabaseOperations.date_extract_sqlc                 C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   sqlr   r   r   format_for_duration_arithmeticL      z1DatabaseOperations.format_for_duration_arithmeticNc                 C      d|  |g| |R  S )Nz#django_date_trunc('%s', %s, %s, %s)r3   _convert_tznames_to_sqlr   r5   r6   tznamer   r   r   date_trunc_sqlP      z!DatabaseOperations.date_trunc_sqlc                 C   r;   )Nz#django_time_trunc('%s', %s, %s, %s)r<   r>   r   r   r   time_trunc_sqlW   rA   z!DatabaseOperations.time_trunc_sqlc                 C   s"   |rt jrd| d| jj fS dS )N'%s')NULLrD   )r   USE_TZr   timezone_name)r   r?   r   r   r   r=   ^   s   
z*DatabaseOperations._convert_tznames_to_sqlc                 C      d|g|  |R  S )Nz%django_datetime_cast_date(%s, %s, %s)r=   r   r6   r?   r   r   r   datetime_cast_date_sqlc   
   z)DatabaseOperations.datetime_cast_date_sqlc                 C   rG   )Nz%django_datetime_cast_time(%s, %s, %s)rH   rI   r   r   r   datetime_cast_time_sqlh   rK   z)DatabaseOperations.datetime_cast_time_sqlc                 C   r;   )Nz)django_datetime_extract('%s', %s, %s, %s)r<   r>   r   r   r   datetime_extract_sqlm   
   z'DatabaseOperations.datetime_extract_sqlc                 C   r;   )Nz'django_datetime_trunc('%s', %s, %s, %s)r<   r>   r   r   r   datetime_trunc_sqlr   rN   z%DatabaseOperations.datetime_trunc_sqlc                 C   r1   )Nzdjango_time_extract('%s', %s)r2   r4   r   r   r   time_extract_sqlw   s   z#DatabaseOperations.time_extract_sqlc                 C      dS )NrD   r   r   r   r   r   pk_default_valuez      z#DatabaseOperations.pk_default_valuec                 C   s   d}t ||kr&d}tdt ||D ]}||||  }|| |7 }q|S dddgt |  }| jj }z||| W |  S |  w )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        i  r   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr   cursorexecutefetchoneclose)r   params
BATCH_SIZEresultsindexchunkr8   rY   r   r   r   rW   }   s   	z8DatabaseOperations._quote_params_for_last_executed_queryc                 C   sT   |r(t |ttfr| |}|| S t| }| |}tt||}|| S |S N)r%   listtuplerW   valuesdictzip)r   rY   r8   r]   re   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   rQ   )Nr   rR   r   r   r   no_limit_value   rT   z!DatabaseOperations.no_limit_valuec                 C   sZ   d}|ddf}| j  }|||}dd | D W  d    S 1 s&w   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   rY   rZ   fetchall)r   
table_namequeryr]   rY   r_   r   r   r   __references_graph   s   
$z%DatabaseOperations.__references_graphc                 C   s   t dd| jS )Ni   )maxsize)r   %_DatabaseOperations__references_graphrR   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 rb   )r{   rq   tablerR   r   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              
      s2   g | ]}d  d d |f qS )z	%s %s %s;DELETEFROM)SQL_KEYWORD	SQL_FIELDrm   r~   r   styler   r   rs      s    
z0DatabaseOperations.sql_flush.<locals>.<listcomp>c                 S   s   g | ]}d |iqS )r   r   r~   r   r   r   rs      rt   )setr   from_iterableextendsequence_reset_by_name_sql)r   r   tablesr|   r}   r8   	sequencesr   r   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);UPDATEsqlite_sequenceSETseqWHERErl   INrU   c                 S   s   g | ]}d |d  qS )rC   r   r   )rq   sequence_infor   r   r   rs      s    zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)r   	SQL_TABLErm   r   rX   )r   r   r   r   r   r   r      s   
z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   sR   |d u rd S t |dr|S t|r%tjr!t|| jj}t|S tdt|S )Nresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	hasattrr   is_awarer   rE   
make_naiver   
ValueErrorstr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 )Nr   z5SQLite backend does not support timezone-aware times.)r   r   r   r   r   r   r   r   r   adapt_timefield_value   s   

z(DatabaseOperations.adapt_timefield_valuec                    s   t  |}|j }|dkr|| j |S |dkr#|| j |S |dkr/|| j |S |dkr=|| | |S |dkrI|| j	 |S |dv rS|| j
 |S )Nr   r   r    DecimalField	UUIDField)NullBooleanFieldBooleanField)superget_db_convertersr'   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 rb   )	r%   datetimer   r   rE   r   r   
make_awarer   r   r   r,   r   r   r   r   r     s   z.DatabaseOperations.convert_datetimefield_valuec                 C       |d urt |tjst|}|S rb   )r%   r   dater   r   r   r   r   r   $     z*DatabaseOperations.convert_datefield_valuec                 C   r   rb   )r%   r   timer   r   r   r   r   r   *  r   z*DatabaseOperations.convert_timefield_valuec                    sP   t jddj t|tr t d|jj  fdd}|S  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_decimalquantize_valuer   r   	converter7  s   z@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d ur | S d S rb   r   r   )r   r   r   r   ;  s   )	decimalContextcreate_decimal_from_floatr%   r
   Decimalscalebr'   decimal_places)r   r,   r   r   r   r   r   0  s   
z-DatabaseOperations.get_decimalfield_converterc                 C   s   |d ur	t |}|S rb   )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   E     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 %srU   NrX   rp   r   r   r   r   I  s
    
z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r   )r   r   placeholder_rowsr   r   r   bulk_insert_sqlH  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))rX   r   combine_expression)r   	connectorsub_expressionsr   r   r   r   N  s
   z%DatabaseOperations.combine_expressionc                 C   sD   |dvr
t d| d| g| }t|dkrtddd| S )N)+-z$Invalid connector for timedelta: %s.rC      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rU   )r   r   r   rX   )r   r   r   	fn_paramsr   r   r   combine_duration_expressionW  s   z.DatabaseOperations.combine_duration_expressionc                 C   rQ   )N)NNr   )r   r   r   r   r   integer_field_range_  r:   z&DatabaseOperations.integer_field_rangec           	      C   sF   |\}}|\}}g ||R }|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   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsr]   r   r   r   subtract_temporalsc  s   z%DatabaseOperations.subtract_temporalsc                    s   |rdS t  |S )NzINSERT OR IGNORE INTO)r   insert_statement)r   ignore_conflictsr   r   r   r   k  r   z#DatabaseOperations.insert_statementrb   )F),__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefixr   r0   r7   r9   r@   rB   r=   rJ   rL   rM   rO   rP   rS   rW   rh   rm   ro   rz   r   r{   r   r   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   django.confr   django.core.exceptionsr   	django.dbr   r   r   "django.db.backends.base.operationsr	   django.db.models.expressionsr
   django.utilsr   django.utils.dateparser   r   r   django.utils.functionalr   r   r   r   r   r   <module>   s    