
    sghC                         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        t        j                  d |D                    }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).
        c              3   n   K   | ]-  }t        |t        j                        r|j                  n|g / y wN)
isinstancer	   CompositePrimaryKeyfields).0fields     i/var/www/enzed_healthcare/enzed_env/lib/python3.12/site-packages/django/db/backends/sqlite3/operations.py	<genexpr>z5DatabaseOperations.bulk_batch_size.<locals>.<genexpr>(   s:         "%)C)CD LL! s   35r   i  )listr   from_iterablelen
connectionfeaturesmax_query_params)selfr"   objss      r%   bulk_batch_sizez"DatabaseOperations.bulk_batch_size   sp        $  	
 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StdDevr    get_source_expressionsoutput_fieldr   AttributeErrorr   	Aggregatedistinctr)   source_expressions)r-   
expression
bad_fieldsbad_aggregatesexprr8   s         r%   check_expression_supportz+DatabaseOperations.check_expression_support8   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_sqlT   s)     *#a0;3D3D3F2P2PPPr0   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_rows\   s    
   r0   c                     |S )z>Do nothing since formatting is handled in the custom function. )r-   rH   s     r%   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmeticc   s    
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_date_trunc(%s, 	, %s, %s)rE   _convert_tznames_to_sqlr-   rG   rH   rI   tznames        r%   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlg   F    'uI69
9
 ))&19
 
 	
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_time_trunc(%s, rS   rT   rV   s        r%   time_trunc_sqlz!DatabaseOperations.time_trunc_sqln   rY   r0   c                 X    |r(t         j                  r|| j                  j                  fS y)N)NN)r   USE_TZr*   timezone_name)r-   rW   s     r%   rU   z*DatabaseOperations._convert_tznames_to_sqlu   s#    hoo4??8888r0   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_date(rS   rU   r-   rH   rI   rW   s       r%   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlz   8    +C5	: =
=
))&1=
 
 	
r0   c                 :    d| dg || j                  |      fS )Nzdjango_datetime_cast_time(rS   r`   ra   s       r%   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sql   rc   r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_extract(%s, rS   rT   rV   s        r%   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sql   sF    -cU)<?
?
 ))&1?
 
 	
r0   c                 X    d| d|j                         g|| j                  |      fS )Nzdjango_datetime_trunc(%s, rS   rT   rV   s        r%   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   sF    +C5	:=
=
 ))&1=
 
 	
r0   c                 6    d| d|j                         g|fS )Nzdjango_time_extract(%s, rC   rD   rF   s       r%   time_extract_sqlz#DatabaseOperations.time_extract_sql   s'    )#a0;3D3D3F2P2PPPr0   c                      y)NNULLrP   r-   s    r%   pk_default_valuez#DatabaseOperations.pk_default_value   s    r0   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  rP   r   zSELECT , zQUOTE(?))	r)   range%_quote_params_for_last_executed_queryjoinr*   rM   executefetchoneclose)r-   rI   
BATCH_SIZEresultsindexchunkrH   rM   s           r%   rs   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 r   )r    r'   tuplers   valuesdictzip)r-   rM   rH   rI   r~   s        r%   last_executed_queryz&DatabaseOperations.last_executed_query   su    
 &4-0CCFK
 < v}}/CCFKc&&12< Jr0   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}r0   c                      y)NrP   rn   s    r%   no_limit_valuez!DatabaseOperations.no_limit_value   s    r0   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*   rM   ru   rL   )r-   
table_namequeryrI   rM   ry   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_graphrn   s    r%   _references_graphz$DatabaseOperations._references_graph   s     &y%d&=&=>>r0   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r   )r   )r#   tabler-   s     r%   r&   z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s     #VeD$:$:5$A#Vs   DELETE FROM;r   )setr   r(   SQL_KEYWORD	SQL_FIELDr   extendsequence_reset_by_name_sql)r-   styletablesr   r   r   rH   	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 (rq   '%s'r   z);)r   	SQL_TABLEr   r   rt   )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   r]   
make_naiver*   
ValueErrorstrr-   values     r%   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value  si    = U# ++E4??3K3KL 5z !' 
 5zr0   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r0   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   r2   DecimalField	UUIDFieldBooleanField)superget_db_convertersr8   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__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==>r0   c                     |tt        |t        j                        st        |      }t        j                  r?t        j                  |      s*t        j                  || j                  j
                        }|S r   )	r    datetimer   r   r]   r   r   
make_awarer*   r-   r   r=   r*   s       r%   r   z.DatabaseOperations.convert_datetimefield_value;  sW    eX%6%67&u-x'8'8'? ++E4??3K3KLr0   c                 T    |%t        |t        j                        st        |      }|S r   )r    r   dater   r   s       r%   r   z*DatabaseOperations.convert_datefield_valueC  %    eX]]3"5)r0   c                 T    |%t        |t        j                        st        |      }|S r   )r    r   timer   r   s       r%   r   z*DatabaseOperations.convert_timefield_valueI  r   r0   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)quantizer8   r   )r   r=   r*   create_decimalquantize_values      r%   	converterz@DatabaseOperations.get_decimalfield_converter.<locals>.converterX  s<    $)%099&
0G0G0O0O :   %r0   c                     |  |       S y r   rP   )r   r=   r*   r   s      r%   r   z@DatabaseOperations.get_decimalfield_converter.<locals>.converter`  s    $)%00 %r0   )	decimalContextcreate_decimal_from_floatr    r   Decimalscalebr8   decimal_places)r-   r=   r   r   r   s      @@r%   r   z-DatabaseOperations.get_decimalfield_converterO  sh     !b1KKj#&$__Q/66((777N 	1 r0   c                 4    |t        j                  |      }|S r   )uuidUUIDr   s       r%   r   z*DatabaseOperations.convert_uuidfield_valuef  s    IIe$Er0   c                 $    |dv rt        |      S |S )N)r   r   )boolr   s       r%   r   z-DatabaseOperations.convert_booleanfield_valuek  s    #votE{858r0   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))rt   r   combine_expression)r-   	connectorsub_expressionsr   s      r%   r   z%DatabaseOperations.combine_expressionn  sO     /!:::##((?";;;w))_EEr0   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)rq   )r   r)   r   rt   )r-   r   r   	fn_paramss       r%   combine_duration_expressionz.DatabaseOperations.combine_duration_expressionw  sZ    00 F RSSi'(?:	y>AHII*TYYy-AAAr0   c                     |dv ryy)N)PositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField)r       )l         r   rP   )r-   r   s     r%   integer_field_rangez&DatabaseOperations.integer_field_range  s      
 

 ,:r0   c                 Z    |\  }}|\  }}g ||}|dk(  rd|d|d|fS d|d|d|fS )Nr2   zdjango_time_diff(rq   rC   zdjango_timestamp_diff(rP   )	r-   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrI   s	            r%   subtract_temporalsz%DatabaseOperations.subtract_temporals  sR    !!+:+
+K'18'BFJJ (297CVKKr0   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'@@r0   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) rP   .zRETURNING %srq   rP   )r   model_metadb_tablecolumnrt   )r-   r"   r$   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(rq   z) DO UPDATE SET z = EXCLUDED.)
r   r   r*   r+   %supports_update_conflicts_with_targetrt   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(c                 2    t         j                  dk  rdgS g S )N)r   '   zGROUP BY TRUE)r   sqlite_version_inforn   s    r%   force_group_byz!DatabaseOperations.force_group_by  s    $,$@$@7$J RPRRr0   r   )1__name__
__module____qualname__"cast_char_field_without_max_lengthcast_data_typesexplain_prefix	frozensetjsonfield_datatype_valuesr/   rA   rJ   rN   rQ   rX   r[   rU   rb   re   rg   ri   rk   ro   rs   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28Q!






Q6$
:& ? ?
 ;@u *
& ".
9FB	;LA
7
*Sr0   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   rP   r0   r%   <module>r2     sI           - > > E 1 , ! I I 3 gS/ gSr0   