
    HwgAB                         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  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_propertyc                   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'd' Z( fd(Z)d) Z*d* Z+d+ Z,d/ fd,	Z-d- Z. f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).
           i  )len
connectionfeaturesmax_query_params)selffieldsobjss      \/var/www/horilla/myenv/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exprr/   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_sqlH   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_rowsP   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_arithmeticW   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?   r@   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, rJ   rK   rM   s        r$   time_trunc_sqlz!DatabaseOperations.time_trunc_sqlb   rP   r&   c                 X    |r(t         j                  r|| j                  j                  fS yN)NN)r   USE_TZr   timezone_name)r!   rN   s     r$   rL   z*DatabaseOperations._convert_tznames_to_sqli   s#    hoo4??8888r&   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_date(rJ   rL   r!   r?   r@   rN   s       r$   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqln   8    +C5	: =
=
))&1=
 
 	
r&   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_time(rJ   rX   rY   s       r$   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlt   r[   r&   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_extract(%s, rJ   rK   rM   s        r$   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlz   sF    -cU)<?
?
 ))&1?
 
 	
r&   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_trunc(%s, rJ   rK   rM   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NULLrG   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  rG   r   zSELECT , zQUOTE(?))	r   range%_quote_params_for_last_executed_queryjoinr   rD   executefetchoneclose)r!   r@   
BATCH_SIZEresultsindexchunkr?   rD   s           r$   rk   z8DatabaseOperations._quote_params_for_last_executed_query   s     
v;#Gq#f+z: Muuz'9:4EEeLLM 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!   rD   r?   r@   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)NrG   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   rD   rm   rC   )r!   
table_namequeryr@   rD   rq   rows          r$   __references_graphz%DatabaseOperations.__references_graph   sw     *

 __##% 	:nnUF3G&-&6&6&89sCF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     #VeD$:$:5$A#Vs   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=>e'5)>I>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        |d      r|S t        j                  |      rPt        j                  r5t        j
                  || 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   rU   
make_naiver   
ValueErrorstrr!   values     r$   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value  s{    = 5./L U# ++E4??3K3KL 5z !' 
 5zr&   c                 z    |y t        |d      r|S t        j                  |      rt        d      t	        |      S )Nr   z5SQLite backend does not support timezone-aware times.)r   r   r   r   r   r   s     r$   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value  sB    = 5./L 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_convertersr/   get_internal_typeappendconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueget_decimalfield_converterconvert_uuidfield_valueconvert_booleanfield_value)r!   r4   
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   r4   r   s       r$   r   z.DatabaseOperations.convert_datetimefield_value7  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_value?  %    eX]]3"5)r&   c                 T    |%t        |t        j                        st        |      }|S ru   )r-   r   timer   r   s       r$   r   z*DatabaseOperations.convert_timefield_valueE  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)quantizer/   r   )r   r4   r   create_decimalquantize_values      r$   	converterz@DatabaseOperations.get_decimalfield_converter.<locals>.converterT  s<    $)%099&
0G0G0O0O :   %r&   c                     |  |       S y ru   rG   )r   r4   r   r   s      r$   r   z@DatabaseOperations.get_decimalfield_converter.<locals>.converter\  s    $)%00 %r&   )	decimalContextcreate_decimal_from_floatr-   r   Decimalscalebr/   decimal_places)r!   r4   r   r   r   s      @@r$   r   z-DatabaseOperations.get_decimalfield_converterK  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_valueb  s    IIe$Er&   c                 $    |dv rt        |      S |S )N)r   r   )boolr   s       r$   r   z-DatabaseOperations.convert_booleanfield_valueg  s    #votE{858r&   c                 N    d |D        }dj                  d |D              }d| S )Nc              3   >   K   | ]  }d j                  |        yw)ri   Nrl   )r   r   s     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>k  s     K3		#Ks   ri   c              3   (   K   | ]
  }d | d  yw)(r:   NrG   )r   r?   s     r$   r   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>l  s     Jc3%qzJs   zVALUES r   )r!   r"   placeholder_rowsplaceholder_rows_sql
values_sqls        r$   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sqlj  s0    K:JKYYJ5IJJ
%%r&   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_expressiono  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_expressionx  sZ    00 F RSSi'(?:	y>AHII*TYYy-AAAr&   c                      yrT   rG   )r!   r   s     r$   integer_field_rangez&DatabaseOperations.integer_field_range  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(rG   )	r!   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsr@   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) rG   .zRETURNING %sri   rG   )r   model_metadb_tablecolumnrl   )r!   r"   fieldcolumnss       r$   return_insert_columnsz(DatabaseOperations.return_insert_columns  sw      
   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! !'eW5  w-	
 	
s   ?B(ru   )1__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr%   r8   rA   rE   rH   rO   rR   rL   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
 
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   r   rG   r&   r$   <module>r2     sD           - > > E 1 , ! I I 3`
/ `
r&   