
    h.                     >    d dl mZ d dlmZ d dlmZ  G d de      Zy)    Inet)settings)BaseDatabaseOperationsc                       e Zd ZdZdZdd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d+dZd Zd Zd Zd ZddddZ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$ fd(Z%d+ fd)	Z&d+ fd*	Z' xZ(S )-DatabaseOperationsvarcharEXPLAINintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldc                     |j                         }|dv r0d|j                  | j                        j                  d      d   z  S y)N)GenericIPAddressFieldIPAddressField	TimeField	UUIDFieldzCAST(%%s AS %s)(r   %s)get_internal_typedb_type
connectionsplit)selfoutput_fieldinternal_types      k/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/postgresql/operations.pyunification_cast_sqlz'DatabaseOperations.unification_cast_sql   sJ    $668aa %|';';DOO'L'R'RSV'WXY'ZZZ    c                 P    |dk(  rd|z  S |dk(  rd|z  S |dk(  rd|z  S d|d|d	S )
Nweek_dayzEXTRACT('dow' FROM %s) + 1iso_week_dayzEXTRACT('isodow' FROM %s)iso_yearzEXTRACT('isoyear' FROM %s)z	EXTRACT('z' FROM ) r   lookup_type
field_names      r   date_extract_sqlz#DatabaseOperations.date_extract_sql   sM    *$/*<<N*.;;J&/*<< ' /::FFr!   c                     d|d|dS NDATE_TRUNC('', r&   r'   r(   s      r   date_trunc_sqlz!DatabaseOperations.date_trunc_sql)   s    )4jAAr!   c                 ^    d|v r|j                  dd      S d|v r|j                  dd      S |S )N+-)replace)r   tznames     r   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_delta-   s7    &=>>#s++F]>>#s++r!   c                 T    t         j                  r|d| j                  |      d}|S )Nz AT TIME ZONE '')r   USE_TZr6   r   r*   r5   s      r   _convert_field_to_tzz'DatabaseOperations._convert_field_to_tz4   s%    ??3=t?Y?YZ`?abJr!   c                 0    | j                  ||      }d|z  S )Nz
(%s)::dater;   r:   s      r   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sql9       ..z6B
j((r!   c                 0    | j                  ||      }d|z  S )Nz
(%s)::timer=   r:   s      r   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sql=   r?   r!   c                 J    | j                  ||      }| j                  ||      S N)r;   r+   r   r)   r*   r5   s       r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlA   s'    ..z6B
$$[*==r!   c                 8    | j                  ||      }d|d|dS r-   r=   rD   s       r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sqlE   s    ..z6B
)4jAAr!   c                     d|d|dS )Nr.   r/   z)::timer'   r(   s      r   time_trunc_sqlz!DatabaseOperations.time_trunc_sqlJ   s    /:JGGr!   c                      y)Nz DEFERRABLE INITIALLY DEFERREDr'   r   s    r   deferrable_sqlz!DatabaseOperations.deferrable_sqlM   s    /r!   c                 "    |j                         S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )fetchall)r   cursors     r   fetch_returned_insert_rowsz-DatabaseOperations.fetch_returned_insert_rowsP   s    
   r!   c                 D    d}|dv r|dv rd}n	|dv rd}nd}|dv rd	|z  }|S )
Nr   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r   r   zHOST(%s))CICharFieldCIEmailFieldCITextFieldz
%s::citextz%s::text)rR   rT   rV   rX   z	UPPER(%s)r'   )r   r)   r   lookups       r   lookup_castzDatabaseOperations.lookup_castW   sS      V V KK#"PP%# MM 6)Fr!   c                      y rC   r'   rK   s    r   no_limit_valuez!DatabaseOperations.no_limit_valuej   s    r!   c                     |gS rC   r'   )r   sqls     r   prepare_sql_scriptz%DatabaseOperations.prepare_sql_scriptm   s	    ur!   c                 T    |j                  d      r|j                  d      r|S d|z  S )N"z"%s")rU   rW   )r   names     r   
quote_namezDatabaseOperations.quote_namep   s(    ??3DMM#$6K}r!   c                      y)NzSET TIME ZONE %sr'   rK   s    r   set_time_zone_sqlz$DatabaseOperations.set_time_zone_sqlu   s    !r!   F)reset_sequencesallow_cascadec                    |sg S j                  d      dj                   fd|D              g}|r |j                  j                  d             |r |j                  j                  d             ddj                  |      z  gS )NTRUNCATE, c              3   ^   K   | ]$  }j                  j                  |             & y wrC   )	SQL_FIELDrh   ).0tabler   styles     r   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s#     R%eoodooe&<=Rs   *-zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)r   rt   tablesrk   rl   	sql_partss   ``    r   	sql_flushzDatabaseOperations.sql_flushx   s    I
 j)IIR6RR
	 U../ABCU..y9:++,,r!   c           
          g }|D ]f  }|d   }|d   xs d}|j                  |j                  d      d|j                  | j                  |            d|j	                  |      d       h |S )Nrs   columnidSELECT  setval(pg_get_serial_sequence('','z'), 1, false);)rz   rx   	SQL_TABLErh   rq   )r   rt   	sequencesrc   sequence_info
table_namecolumn_names          r   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   sz     & 		M&w/J (19TKJJ!!(+
 ;<, 		 
r!   c                 V    |rd| j                  |      z  S d| j                  |      z  S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rh   )r   
tablespaceinlines      r   tablespace_sqlz!DatabaseOperations.tablespace_sql   s-    .1LLL"T__Z%@@@r!   c                    ddl m} g }| j                  }|D ]=  }|j                  j                  D ]  }t        ||j                        s|j                  |j                  d      d|j                   ||j                  j                              d|j                  |j                        d|j                   ||j                              d|j                   ||j                              d|j                  d	      d
|j                  d      d|j                   ||j                  j                              d        n |j                  j                  D ]  }|j                  j                  r|j                  |j                  d      d|j                   ||j!                                     d|j                  d      d|j                   |d            d|j                   |d            d|j                  d	      d
|j                  d      d|j                   ||j!                                     d        @ |S )Nr   )modelsr   r   r   z'), coalesce(max(z), 1), max(z) zIS NOTz null) FROMrw   ;r   )	django.dbr   rh   _metalocal_fields
isinstancer   rz   rx   r   db_tablerq   r   many_to_manyremote_fieldthroughm2m_db_table)r   rt   
model_listr   outputqnmodelfs           r   sequence_reset_sqlz%DatabaseOperations.sequence_reset_sql   s   $__ %	E [[-- a!1!12MM "--h7!OOBu{{/C/C,DE!OOAHH5!OOBqxxL9!OOBqxxL9!--h7!--f5!OOBu{{/C/C,DE
   [[-- ~~--MM "--h7!OOBq~~/?,@A!OOD1!OOBtH5!OOBtH5!--h7!--f5!OOBq~~/?,@A
/%	L r!   c                     |S rC   r'   )r   xs     r   prep_for_iexact_queryz(DatabaseOperations.prep_for_iexact_query   s    r!   c                      y)a  
        Return the maximum length of an identifier.

        The maximum length of an identifier is 63 by default, but can be
        changed by recompiling PostgreSQL after editing the NAMEDATALEN
        macro in src/include/pg_config_manual.h.

        This implementation returns 63, but can be overridden by a custom
        database backend that inherits most of its behavior from this one.
        ?   r'   rK   s    r   max_name_lengthz"DatabaseOperations.max_name_length   s     r!   c                 z    |r/|D cg c]  }|D ]  }|  }}}ddj                  |      z  g|fS dgg fS c c}}w )NzDISTINCT ON (%s)ro   DISTINCTry   )r   fieldsparams
param_listparams        r   distinct_sqlzDatabaseOperations.distinct_sql   sS    .4M
*MeMeMFM'$))F*;;<fEE<## Ns   7c                 P    |j                   |j                   j                         S y rC   )querydecode)r   rO   rc   r   s       r   last_executed_queryz&DatabaseOperations.last_executed_query   s$     <<#<<&&((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) r'   .zRETURNING %sro   r'   )rh   r   r   r   r   ry   )r   r   fieldcolumnss       r   return_insert_columnsz(DatabaseOperations.return_insert_columns   sw    
 "	
   1 1 : :;-
 
 		' 22B66
s   AA4c                 N    d |D        }dj                  d |D              }d|z   S )Nc              3   >   K   | ]  }d j                  |        yw)ro   Nr   )rr   rows     r   ru   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>   s     K3		#Ks   ro   c              3   &   K   | ]	  }d |z    yw)z(%s)Nr'   )rr   rc   s     r   ru   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>   s     Lv|L   zVALUES r   )r   r   placeholder_rowsplaceholder_rows_sql
values_sqls        r   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sql   s.    K:JKYYL7KLL
:%%r!   c                     |S rC   r'   r   values     r   adapt_datefield_valuez(DatabaseOperations.adapt_datefield_value       r!   c                     |S rC   r'   r   s     r   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value   r   r!   c                     |S rC   r'   r   s     r   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_value   r   r!   c                     |rt        |      S y rC   r   r   s     r   adapt_ipaddressfield_valuez-DatabaseOperations.adapt_ipaddressfield_value  s    ;r!   c                 h    |dk(  r|\  }}|\  }}g ||}d|d|d|fS t         	|   |||      S )N	DateFieldz(interval '1 day' * (z - z)))supersubtract_temporals)
r   r   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsr   	__class__s
            r   r   z%DatabaseOperations.subtract_temporals  sR    K'"%GZ"%GZ/z/J/F7>H&PPw)-cBBr!   c                 .   t         |   |      }i }|r||d<   |rE|j                  |j                         D ci c]  \  }}|j	                         |rdnd c}}       |r,|ddj                  d |j                         D              z  z  }|S c c}}w )NFORMATtruefalsez (%s)ro   c              3   &   K   | ]	  }d |z    yw)z%s %sNr'   )rr   is     r   ru   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>  s     )M!'A+)Mr   )r   explain_query_prefixupdateitemsupperry   )r   formatoptionsprefixextrarg   r   r   s          r   r   z'DatabaseOperations.explain_query_prefix  s    -f5$E(OLL#*==?D% 

f7:  g		)Mu{{})M MMMFs   B
c                 *    |rdS t         |   |      S )NzON CONFLICT DO NOTHING)r   ignore_conflicts_suffix_sql)r   ignore_conflictsr   s     r   r   z.DatabaseOperations.ignore_conflicts_suffix_sql  s    +;'vAdeuAvvr!   rC   )F))__name__
__module____qualname__"cast_char_field_without_max_lengthexplain_prefixcast_data_typesr    r+   r0   r6   r;   r>   rA   rE   rG   rI   rL   rP   r_   ra   rd   rh   rj   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    )2&N $O
GB
))>B
H0!&
" ;@u -  A*X$	7&

Cw wr!   r   N)psycopg2.extrasr   django.confr   "django.db.backends.base.operationsr   r   r'   r!   r   <module>r      s        EVw/ Vwr!   