
    h'                     F    d dl Z d dlmZ d dlmZ d dlmZ  G d de      Zy)    N)BaseDatabaseSchemaEditor)IndexColumns)strip_quotesc            
            e 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 Z fdZd Zd Zd Z fdZ	 d fd	Z fdZddZddZd fd	Zdddddddddd	 fd
Z xZS )DatabaseSchemaEditorzCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)sz9ALTER SEQUENCE %(sequence)s OWNED BY %(table)s.%(column)szOCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)sz\CREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)szDROP INDEX IF EXISTS %(name)sz*DROP INDEX CONCURRENTLY IF EXISTS %(name)szyCONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s; SET CONSTRAINTS %(namespace)s%(name)s IMMEDIATEzRSET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz,DROP FUNCTION %(procedure)s(%(param_types)s)c                     t        |t              r|j                  dd      }t        j                  j                  |      j                         j                         S )N%z%%)
isinstancestrreplacepsycopg2
extensionsadapt	getquoteddecode)selfvalues     g/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/postgresql/schema.pyquote_valuez DatabaseSchemaEditor.quote_value"   sE    eS!MM#t,E""((/99;BBDD    c                 r    t         |   ||      }| j                  ||      }||j                  |       |S N)super_field_indexes_sql_create_like_index_sqlappend)r   modelfieldoutputlike_index_statement	__class__s        r   r   z'DatabaseSchemaEditor._field_indexes_sql(   s?    +E59#::5%H+MM./r   c                     |j                   r|j                  | j                        S | j                  j                  j	                  |j                         |j                  | j                              S r   )is_relationrel_db_type
connection
data_typesgetget_internal_typedb_typer   r   s     r   _field_data_typez%DatabaseSchemaEditor._field_data_type/   sY    $$T__55))--##%MM$//*
 	
r   c              #      K   |j                   j                         dk(  r$| j                  |j                         E d {    y | j                  |j                          y 7 #w)N
ArrayField)
base_fieldr(   _field_base_data_typesr+   r*   s     r   r/   z+DatabaseSchemaEditor._field_base_data_types7   sT     --/<?2253C3CDDD''(8(899 Es   <A$A"$A$c                    |j                  | j                        }|m|j                  s|j                  rUd|v ry|j	                  d      r| j                  ||gddg      S |j	                  d      r| j                  ||gdd	g      S y)
z
        Return the statement to create an index with varchar operator pattern
        when the column type is 'varchar' or 'text', otherwise return None.
        )r%   N[varchar_likevarchar_pattern_ops)suffix	opclassestexttext_pattern_ops)r)   r%   db_indexunique
startswith_create_index_sql)r   r   r   r)   s       r   r   z+DatabaseSchemaEditor._create_like_index_sql>   s    
 --4??-;ENNell g~!!),--eeWWYnXo-pp##F+--eeWWYkXl-mmr   c                    d| _         d}|j                         }|j                         }|dk(  rP||k(  rKt        | j                  |            t        | j                  |            k7  rN| xj                   |z  c_         n8| j	                  |      | j	                  |      k7  r| xj                   |z  c_         t        |j                  j                        }dddd}	|j                         |	v rjt        |j                        }
|d|
d	}| j                   | j                  |
      |	|j                            d
z  g f| j                  d| j                  |      iz  g f| j                  d| j                  |      iz  g f| j                  | j                  |      | j                  | j                  |
      d| j                  |      z  dz  dz  g f| j                  | j                  |      | j                  |
      | j                  |      dz  g f| j                   | j                  |      | j                  |
      | j                  |      dz  g fgfS t"        | I  ||||      S )Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr-   bigintintegersmallint)	bigserialserialsmallserial__seq)columntypesequenceznextval('%s'))rF   default)tablechanges)rJ   rF   rH   )sql_alter_column_typer(   listr/   r+   r   _metadb_tablelowerrF   
quote_namesql_delete_sequencesql_create_sequencesql_alter_columnsql_alter_column_defaultsql_set_sequence_maxsql_set_sequence_ownerr   _alter_column_type_sql)r   r   	old_field	new_fieldnew_type	using_sqlnew_internal_typeold_internal_typerJ   serial_fields_maprF   sequence_namer!   s               r   rX   z+DatabaseSchemaEditor._alter_column_type_sqlT   s   %L"1	%779%779,1BFW1WD//	:;tDD_D_`iDj?kk**i7*""9-1F1Fy1QQ&&)3&U[[112*2iXbc>>00!)"2"23F+0&9M .."&//&"9 1(..2B C2   00&(F4  	 00&(F4  	 --%)__U%;'+'D'D*.//&*A+:T__]=[+[H (1  	 11%)__U%;&*oof&=(,(F5 
  33%)__U%;&*oof&=(,(F7 
 ?'0 0d 71%IxXXr   Fc	           
         |j                   s|j                  r|j                  d      r|j                  d      rD|j                  d      r|j                  d      r"|j                  d      re|j                  d      sT| j                  |j                  j
                  |j                  gd      }	| j                  | j                  ||	             t        | )  ||||||||       |j                   s|j                  s|j                   s|j                  s1|j                  r%| j                  ||      }
|
| j                  |
       |j                  ro|j                   sb|j                  sU| j                  |j                  j
                  |j                  gd      }| j                  | j                  ||             y y y y )Nr2   r7   citextr3   )r5   )r9   r:   r;   _create_index_namerN   rO   rF   execute_delete_index_sqlr   _alter_fieldr   )r   r   rY   rZ   old_typer[   old_db_paramsnew_db_paramsstrict
index_namer    index_to_remover!   s               r   rf   z!DatabaseSchemaEditor._alter_field   s    )"2"2  +H4G4G	4R  (1D1DV1L  *83F3Fx3P001E1E	HXHXGYbi0jJLL//zBC9i8]6	

 $$	(8(8i>P>P%%)*:*:#'#>#>ui#P #/12 Y%7%79;K;K"55ekk6J6JYM]M]L^gn5oOLL//GH <L%7r   c                 `    |rt        ||| j                  ||      S t        |   ||||      S )N)col_suffixesr6   )r   rQ   r   _index_columns)r   rJ   columnsrn   r6   r!   s        r   ro   z#DatabaseSchemaEditor._index_columns   s4    wlfoppw%eWlINNr   c                 N    | j                  |j                  || |      d        y )Nconcurrently)params)rd   
create_sqlr   r   indexrs   s       r   	add_indexzDatabaseSchemaEditor.add_index   s%    U%%eT%MVZ[r   c                 J    | j                  |j                  || |             y )Nrr   )rd   
remove_sqlrv   s       r   remove_indexz!DatabaseSchemaEditor.remove_index   s     U%%eT%MNr   Nc                 Z    |r| j                   n| j                  }t        |   |||      S r   )sql_delete_index_concurrentlysql_delete_indexr   re   )r   r   namesqlrs   r!   s        r   re   z&DatabaseSchemaEditor._delete_index_sql   s,    4@d00dF[F[w(c::r     )	r   r5   usingdb_tablespacern   r   r6   	conditionrs   c       	         j    |s| j                   n| j                  }t        |   |||||||||	|

      S )N)r   r5   r   r   rn   r   r6   r   )sql_create_indexsql_create_index_concurrentlyr   r<   )r   r   fieldsr   r5   r   r   rn   r   r6   r   rs   r!   s               r   r<   z&DatabaseSchemaEditor._create_index_sql   sH    
 ,8d##T=_=_w(6V5P]%3)y ) 
 	
r   )F)NF)__name__
__module____qualname__rS   rR   rV   rW   r   r   r~   r}   sql_create_column_inline_fksql_delete_fksql_delete_procedurer   r   r+   r/   r   rX   rf   ro   rx   r{   re   r<   __classcell__)r!   s   @r   r   r      s    8HZXhf " 7$P!
	<   iMIE
:,DYN ;@I8O
\O;
 &*"BU	
 	
r   r   )r   django.db.backends.base.schemar   !django.db.backends.ddl_referencesr   django.db.backends.utilsr   r   r   r   r   <module>r      s      C : 1F
3 F
r   