
    gA                         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 d dlmZmZmZ d dlmZ ddlmZ  G d de      Zy)    N)	lru_cache)chain)settings)
FieldError)DatabaseErrorNotSupportedErrormodels)BaseDatabaseOperations)
OnConflict)Col)timezone)
parse_dateparse_datetime
parse_time)cached_property   )Databasec                   L    e Zd ZdZdddZdZ eg d      Zd Zd Z	d Z
d	 Zd
 Zd/dZd/dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        ZddddZd Zd Zd Z  fd Z!d! Z"d" Z#d# Z$d$ Z%d% Z&d& Z' fd'Z(d( Z)d) Z*d* Z+d/ fd+	Z,d, Z- fd-Z.d. Z/ xZ0S )0DatabaseOperationstextTEXT)	DateFieldDateTimeFieldzEXPLAIN QUERY PLAN)nullfalsetruec                     t        |      dk(  ryt        |      dkD  r,| j                  j                  j                  t        |      z  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).
        r   i  )len
connectionfeaturesmax_query_params)selffieldsobjss      }/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/operations.pybulk_batch_sizez"DatabaseOperations.bulk_batch_size   sG     v;![1_??++<<FKKt9    c                 (   t         j                  t         j                  t         j                  f}t         j                  t         j
                  t         j                  t         j                  f}t        ||      r9|j                         D ]&  }	 |j                  }t        ||      st        d       t        |t         j                        r1|j                  r$t!        |j"                        dkD  rt        d      y y y # t        t        f$ r Y w xY w)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_fieldr   AttributeErrorr   	Aggregatedistinctr   source_expressions)r"   
expression
bad_fieldsbad_aggregatesexprr0   s         r%   check_expression_supportz+DatabaseOperations.check_expression_support.   s    &&(<(<f>N>NO
 **fjj&//6==Qj.1"99;#'#4#4L ",
;/@  < z6#3#34##J112Q6#0  7 $ 5 '
3  s   C??DDc                 6    d| d|j                         g|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, )lowerr"   lookup_typesqlparamss       r%   date_extract_sqlz#DatabaseOperations.date_extract_sqlJ   s)     *#a0;3D3D3F2P2PPPr'   c                 "    |j                         S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the list of returned data.
        )fetchall)r"   cursors     r%   fetch_returned_insert_rowsz-DatabaseOperations.fetch_returned_insert_rowsR   s    
   r'   c                     |S )z>Do nothing since formatting is handled in the custom function. )r"   r@   s     r%   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmeticY   s    
r'   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_date_trunc(%s, 	, %s, %s)r=   _convert_tznames_to_sqlr"   r?   r@   rA   tznames        r%   date_trunc_sqlz!DatabaseOperations.date_trunc_sql]   F    'uI69
9
 ))&19
 
 	
r'   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_time_trunc(%s, rK   rL   rN   s        r%   time_trunc_sqlz!DatabaseOperations.time_trunc_sqld   rQ   r'   c                 X    |r(t         j                  r|| j                  j                  fS y)N)NN)r   USE_TZr   timezone_name)r"   rO   s     r%   rM   z*DatabaseOperations._convert_tznames_to_sqlk   s#    hoo4??8888r'   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_date(rK   rM   r"   r@   rA   rO   s       r%   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlp   8    +C5	: =
=
))&1=
 
 	
r'   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_time(rK   rX   rY   s       r%   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlv   r[   r'   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_extract(%s, rK   rL   rN   s        r%   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sql|   sF    -cU)<?
?
 ))&1?
 
 	
r'   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_trunc(%s, rK   rL   rN   s        r%   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   sF    +C5	:=
=
 ))&1=
 
 	
r'   c                 6    d| d|j                         g|fS )Nzdjango_time_extract(%s, r;   r<   r>   s       r%   time_extract_sqlz#DatabaseOperations.time_extract_sql   s'    )#a0;3D3D3F2P2PPPr'   c                      y)NNULLrH   r"   s    r%   pk_default_valuez#DatabaseOperations.pk_default_value   s    r'   c                    d}t        |      |kD  r;d}t        dt        |      |      D ]  }||||z    }|| j                  |      z  }  |S ddj                  dgt        |      z        z   }| j                  j                  j                         }	 |j                  ||      j                         |j                          S # |j                          w xY w)zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        i  rH   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr   rE   executefetchoneclose)r"   rA   
BATCH_SIZEresultsindexchunkr@   rE   s           r%   rk   z8DatabaseOperations._quote_params_for_last_executed_query   s     
v;#Gq#f+z:uuz'9:4EEeLL ; N$))ZL3v;$>?? ++224	>>#v.779LLNFLLNs   C Cc                     |rpt        |t        t        f      r| j                  |      }||z  S t        |j	                               }| j                  |      }t        t        ||            }||z  S |S N)r.   listtuplerk   valuesdictzip)r"   rE   r@   rA   rx   s        r%   last_executed_queryz&DatabaseOperations.last_executed_query   su    
 &4-0CCFK
 < v}}/CCFKc&&12< Jr'   c                 T    |j                  d      r|j                  d      r|S d|z  S )N"z"%s")
startswithendswith)r"   names     r%   
quote_namezDatabaseOperations.quote_name   s(    ??3DMM#$6K}r'   c                      y)NrH   rf   s    r%   no_limit_valuez!DatabaseOperations.no_limit_value   s    r'   c                     d}|ddf}| j                   j                         5 }|j                  ||      }|j                         D cg c]  }|d   	 c}cd d d        S c c}w # 1 sw Y   y xY w)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*\(r   )r   rE   rm   rD   )r"   
table_namequeryrA   rE   rq   rows          r%   __references_graphz%DatabaseOperations.__references_graph   st     *

 __##%nnUF3G&-&6&6&89&8sCF&89 &%9 &%s   %A$AA$A$$A-c                 :     t        d      | j                        S )Ni   )maxsize)r   %_DatabaseOperations__references_graphrf   s    r%   _references_graphz$DatabaseOperations._references_graph   s     &y%d&=&=>>r'   F)reset_sequencesallow_cascadec                    |r)|r't        t        j                   fd|D                    }|D cg c]I  }|j                  d      d|j                  d      d|j	                   j                  |            dK }}|r2|D cg c]  }d|i }}|j                   j                  ||             |S c c}w c c}w )Nc              3   @   K   | ]  }j                  |        y wru   )r   ).0tabler"   s     r%   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s     #VveD$:$:5$Avs   DELETE FROM;r   )setr   from_iterableSQL_KEYWORD	SQL_FIELDr   extendsequence_reset_by_name_sql)r"   styletablesr   r   r   r@   	sequencess   `       r%   	sql_flushzDatabaseOperations.sql_flush   s    m ###Vv#VVF  
  	 !!(+!!&) 67	   	 
 7=>ve'5)vI>JJt66uiHI

 ?s   AB7B<c                    |sg S |j                  d      d|j                  | j                  d            d|j                  d      d|j                  | j                  d            d|j                  d      d|j                  | j                  d            d|j                  d	      d
dj	                  |D cg c]
  }d|d   z   c}      dgS c c}w )NUPDATEr   sqlite_sequenceSETseqz = 0 WHEREr   INz (ri   '%s'r   z);)r   	SQL_TABLEr   r   rl   )r"   r   r   sequence_infos       r%   r   z-DatabaseOperations.sequence_reset_by_name_sql   s    I !!(+0A BC!!%( 67!!'* 78!!$'		JST)VmG44)T
 	
 Us   ?C$c                     |y t        j                  |      rPt        j                  r5t        j                  || j
                  j                         }t        |      S t        d      t        |      S )NzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)r   is_awarer   rU   
make_naiver   
ValueErrorstrr"   values     r%   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value  si    = U# ++E4??3K3KL 5z !' 
 5zr'   c                 ^    |y t        j                  |      rt        d      t        |      S )Nz5SQLite backend does not support timezone-aware times.)r   r   r   r   r   s     r%   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value  s0    = U#TUU5zr'   c                    t         |   |      }|j                  j                         }|dk(  r|j	                  | j
                         |S |dk(  r|j	                  | j                         |S |dk(  r|j	                  | j                         |S |dk(  r"|j	                  | j                  |             |S |dk(  r|j	                  | j                         |S |dk(  r|j	                  | j                         |S )Nr   r   r)   DecimalField	UUIDFieldBooleanField)superget_db_convertersr0   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r"   r5   
convertersinternal_type	__class__s       r%   r   z$DatabaseOperations.get_db_converters   s   W.z:
"//AACO+d>>?  k)d::;  k)d::;  n,d==jIJ
 	 k)d::;  n,d==>r'   c                     |tt        |t        j                        st        |      }t        j                  r?t        j                  |      s*t        j                  || j                  j
                        }|S ru   )	r.   datetimer   r   rU   r   r   
make_awarer   r"   r   r5   r   s       r%   r   z.DatabaseOperations.convert_datetimefield_value1  sW    eX%6%67&u-x'8'8'? ++E4??3K3KLr'   c                 T    |%t        |t        j                        st        |      }|S ru   )r.   r   dater   r   s       r%   r   z*DatabaseOperations.convert_datefield_value9  %    eX]]3"5)r'   c                 T    |%t        |t        j                        st        |      }|S ru   )r.   r   timer   r   s       r%   r   z*DatabaseOperations.convert_timefield_value?  r   r'   c                     t        j                  d      j                  t        |t              rAt        j
                  d      j                  |j                  j                         fd}|S fd}|S )N   )precr   c                 d    | - |       j                  |j                  j                        S y )N)context)quantizer0   r   )r   r5   r   create_decimalquantize_values      r%   	converterz@DatabaseOperations.get_decimalfield_converter.<locals>.converterN  s<    $)%099&
0G0G0O0O :   %r'   c                     |  |       S y ru   rH   )r   r5   r   r   s      r%   r   z@DatabaseOperations.get_decimalfield_converter.<locals>.converterV  s    $)%00 %r'   )	decimalContextcreate_decimal_from_floatr.   r   Decimalscalebr0   decimal_places)r"   r5   r   r   r   s      @@r%   r   z-DatabaseOperations.get_decimalfield_converterE  sh     !b1KKj#&$__Q/66((777N 	1 r'   c                 4    |t        j                  |      }|S ru   )uuidUUIDr   s       r%   r   z*DatabaseOperations.convert_uuidfield_value\  s    IIe$Er'   c                 $    |dv rt        |      S |S )N)r   r   )boolr   s       r%   r   z-DatabaseOperations.convert_booleanfield_valuea  s    #votE{858r'   c                     |dk(  rddj                  |      z  S |dk(  rddj                  |      z  S t        | 	  ||      S )N^z	POWER(%s),#z
BITXOR(%s))rl   r   combine_expression)r"   	connectorsub_expressionsr   s      r%   r   z%DatabaseOperations.combine_expressiond  sO     /!:::##((?";;;w))_EEr'   c                     |dvrt        d|z        d|z  g|z   }t        |      dkD  rt        d      ddj                  |      z  S )N)+-*/z$Invalid connector for timedelta: %s.r      z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)ri   )r   r   r   rl   )r"   r   r   	fn_paramss       r%   combine_duration_expressionz.DatabaseOperations.combine_duration_expressionm  sZ    00 F RSSi'(?:	y>AHII*TYYy-AAAr'   c                     |dv ryy)N)PositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField)r       )l         r   rH   )r"   r   s     r%   integer_field_rangez&DatabaseOperations.integer_field_rangeu  s      
 

 ,:r'   c                 Z    |\  }}|\  }}g ||}|dk(  rd|d|d|fS d|d|d|fS )Nr)   zdjango_time_diff(ri   r;   zdjango_timestamp_diff(rH   )	r"   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrA   s	            r%   subtract_temporalsz%DatabaseOperations.subtract_temporals  sR    !!+:+
+K'18'BFJJ (297CVKKr'   c                 L    |t         j                  k(  ryt        |   |      S )NzINSERT OR IGNORE INTO)on_conflict)r   IGNOREr   insert_statement)r"   r  r   s     r%   r  z#DatabaseOperations.insert_statement  s'    *+++*w'K'@@r'   c                     |sy|D cg c]O  }| j                  |j                  j                  j                        d| j                  |j                        Q }}ddj                  |      z  dfS c c}w )N) rH   .zRETURNING %sri   rH   )r   model_metadb_tablecolumnrl   )r"   r#   fieldcolumnss       r%   return_insert_columnsz(DatabaseOperations.return_insert_columns  s|      
    1 1 : :;-
   	 
 		' 22B66
s   AA4c                 Z   |t         j                  k(  r| j                  j                  j                  raddj                  t        | j                  |            ddj                  t        | j                  |      D cg c]	  }| d|  c}      S t        | %  ||||      S c c}w )NzON CONFLICT(ri   z) DO UPDATE SET z = EXCLUDED.)
r   r   r   r    %supports_update_conflicts_with_targetrl   mapr   r   on_conflict_suffix_sql)r"   r#   r  update_fieldsunique_fieldsr  r   s         r%   r  z)DatabaseOperations.on_conflict_suffix_sql  s    :,,,((NN 		#doo}=>		 &)-%H%HE !'eW5%H  w-	
 	
s   ?B(c                 2    t         j                  dk  rdgS g S )N)r   '   zGROUP BY TRUE)r   sqlite_version_inforf   s    r%   force_group_byz!DatabaseOperations.force_group_by  s    $,$@$@7$J RPRRr'   ru   )1__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr&   r9   rB   rF   rI   rP   rS   rM   rZ   r]   r_   ra   rc   rg   rk   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  __classcell__)r   s   @r%   r   r      s   )/&O *N !**C D8Q!






Q6$
:& ? ?
 ;@u *
& ".
9FB	;LA
7
*Sr'   r   ) r   r   r   	functoolsr   	itertoolsr   django.confr   django.core.exceptionsr   	django.dbr   r   r	   "django.db.backends.base.operationsr
   django.db.models.constantsr   django.db.models.expressionsr   django.utilsr   django.utils.dateparser   r   r   django.utils.functionalr   baser   r   rH   r'   r%   <module>r0     sI           - > > E 1 , ! I I 3 ]S/ ]Sr'   