a
    ‘ÐOcß ã                   @   sÄ   d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ e  d
¡Zdd„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    N)Údatetime)Úsettings)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifier)Ú
DeferrableÚIndex)ÚQuery)ÚTransactionManagementErrorÚatomic)Útimezonezdjango.db.backends.schemac                 C   s2   | j }|jrdS |jr&|jdgkr&dS |j|jv S )zz
    When altering the given field, must constraints on its model from the given
    relation be temporarily dropped?
    FNT)ÚfieldÚmany_to_manyÚprimary_keyZ	to_fieldsÚname)ZrelationZaltered_fieldr   © r   úU/var/www/html/gsl.tools/lib/python3.9/site-packages/django/db/backends/base/schema.pyÚ_is_relevant_relation   s    r   c                 C   s"   t | jjddddd�t d¡d�S )NFT)ZforwardÚreverseZinclude_hiddenZinclude_parentsr   )Úkey)ÚsortedÚ_metaZ_get_fieldsÚoperatorÚ
attrgetter©Úmodelr   r   r   Ú_all_related_fields'   s    üùr!   c                 #   sb   t ‡fdd„tˆjƒD ƒ‡ fdd„tˆ jƒD ƒƒ}|D ]&\}}||fV  t|j|jƒE d H  q6d S )Nc                 3   s   | ]}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>8   s   
þz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   s   | ]}t |ˆ ƒr|V  qd S r"   r#   r$   )Ú	new_fieldr   r   r(   =   s   
þ)Úzipr!   r    Ú_related_non_m2m_objectsÚremote_field)r'   r)   Zrelated_fieldsÚold_relÚnew_relr   )r)   r'   r   r+   4   s    
þ
þú
þr+   c                   @   s  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eZdZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZ dZ!dZ"dZ#dZ$eZ%dZ&d®d!d"„Z'd#d$„ Z(d%d&„ Z)d¯d(d)„Z*d*d+„ Z+d,d-„ Z,d.d/„ Z-d°d0d1„Z.d2d3„ Z/d4d5„ Z0d6d7„ Z1d8d9„ Z2e3d:d;„ ƒZ4d<d=„ Z5d>d?„ Z6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:dHdI„ Z;dJdK„ Z<dLdM„ Z=dNdO„ Z>dPdQ„ Z?dRdS„ Z@dTdU„ ZAdVdW„ ZBdXdY„ ZCdZd[„ ZDd±d\d]„ZEd²d^d_„ZFd`da„ ZGd³dbdc„ZHddde„ ZIdfdg„ ZJdhdi„ ZKd´dkdl„ZLdµdmdn„ZMdodp„ ZNdqdr„ ZOdddjdjdd'dd'ddddsœdtdu„ZPd¶dvdw„ZQdxdy„ ZRdzd{„ ZSd|d}„ ZTd~d„ ZUd€d�„ ZVd‚dƒ„ ZWd„d…„ ZXd†d‡„ ZYdˆd‰„ ZZdŠd‹„ Z[dŒd�„ Z\dŽd�„ Z]d�d‘„ Z^d·d’d“„Z_d¸d”d•„Z`d¹d–d—„Zadºd˜d™„Zbdšd›„ Zcdœd�„ ZddždŸ„ Zed d¡„ Zfd»d¢d£„Zgd¼d¤d¥„Zhd¦d§„ Zid¨d©„ Zjdªd«„ Zkd½d¬d­„ZldS )¾ÚBaseDatabaseSchemaEditorzÈ
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz%ALTER COLUMN %(column)s TYPE %(type)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTc                 C   s,   || _ || _| jrg | _| j jjo$|| _d S r"   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr0   r1   r   r   r   r   Ú__init__‘   s
    z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jr$t| jjƒ| _| j ¡  | S r"   )Údeferred_sqlr5   r   r0   ÚaliasÚ	__enter__©r6   r   r   r   r:   š   s
    
z"BaseDatabaseSchemaEditor.__enter__c                 C   s8   |d u r| j D ]}|  |¡ q| jr4| j |||¡ d S r"   )r8   Úexecuter5   r   Ú__exit__)r6   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r=   ¡   s
    
z!BaseDatabaseSchemaEditor.__exit__r   c                 C   sÒ   | j s | jjr | jjjs tdƒ‚t|ƒ}tjd||||dœd� | j r˜| 	¡  
d¡rXdnd}|dur†| j |tt| j|ƒƒ | ¡ qÎ| j || ¡ n6| j ¡ �}| ||¡ W d  ƒ n1 sÄ0    Y  dS )z:Execute the given SQL statement, with optional parameters.ziExecuting DDL statements while in a transaction on databases that can't perform a rollback is prohibited.z%s; (params %r))ÚparamsrA   )Úextraú;Ú N)r1   r0   Zin_atomic_blockr3   r4   r   ÚstrÚloggerÚdebugÚrstripÚendswithr2   ÚappendÚtupleÚmapÚquote_valueÚcursorr<   )r6   rA   rB   ÚendingrO   r   r   r   r<   ª   s,    ÿþýÿÿÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r"   )r0   ÚopsÚ
quote_name)r6   r   r   r   r   rR   É   s    z#BaseDatabaseSchemaEditor.quote_namec                    s  ˆ j jD ]*}‡ fdd„|D ƒ}ˆj ˆ ˆ |¡¡ qg }g }ˆ j jD �]<}ˆ ˆ |¡\}}|du rdqD|jˆjd�}	|	d rŒ|dˆj	|	  7 }|j
ˆjd�}
|
rª|d|
 7 }| |¡ |j�r6|j�r6|jjj j}|jjj  |jj¡j}ˆj�r|dˆjˆ |¡ˆ |¡dœ  7 }n"ˆjjj�r6ˆj ˆ ˆ |d	¡¡ | d
ˆ |j¡|f ¡ | ¡ dv rDˆjj ˆ j j|j¡}|rDˆj |¡ qD‡ ‡fdd„ˆ j jD ƒ}ˆjˆ ˆ j j¡d dd„ g |¢|¢R D ƒ¡dœ }ˆ j j�rþˆjj ˆ j j¡}|�rþ|d| 7 }||fS )z-Take a model and return its table definition.c                    s   g | ]}ˆ j  |¡‘qS r   ©r   Ú	get_field©r%   r   r   r   r   Ú
<listcomp>Ñ   ó    z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r0   Úcheckú z %s)Úto_tableÚ	to_columnú_fk_%(to_table)s_%(to_column)sz%s %s)Z	AutoFieldZBigAutoFieldZSmallAutoFieldc                    s   g | ]}|  ˆ ˆ¡‘qS r   )Zconstraint_sql©r%   Ú
constraint©r    r6   r   r   rV   	  s   ÿú, c                 s   s   | ]}|rt |ƒV  qd S r"   )rF   r^   r   r   r   r(     s   þz5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r   Zunique_togetherr8   rK   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr0   Úsql_check_constraintÚdb_type_suffixÚextendr,   Údb_constraintr    Údb_tablerT   Ú
field_nameÚcolumnÚsql_create_inline_fkrR   r3   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerQ   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r6   r    Úfield_namesÚfieldsZcolumn_sqlsrB   r   rc   Zextra_paramsÚ	db_paramsÚcol_type_suffixr[   r\   rs   rt   rA   rx   r   r`   r   Ú	table_sqlÌ   sz    

ÿþÿÿ
þÿÿ	
ÿþ
þþ
ÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   s&  |V  |  d¡ }r |  |¡V  |j}|oD|  |¡ oD|oB|  |¡ }|r–|  |¡}	|	d ur–d|  |¡ }
| jjj	r†|
|  
|	¡ V  n|
V  | |	¡ |jr°|js°| jjjr°d}|s¼dV  n| jjjsÌdV  |jrÚdV  n|jrædV  |jpò|jj}|�r"| jjj�r"|j�r"| jjj|dd�V  d S )	NÚ	collationzDEFAULT TzNOT NULLZNULLzPRIMARY KEYZUNIQUE)Úinline)ÚgetÚ_collate_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlr0   r3   Úrequires_literal_defaultsÚprepare_defaultrK   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsZimplied_column_nullÚuniquerw   r   Zsupports_tablespacesrQ   rx   )r6   Úcolumn_db_typerB   r    r   Úfield_db_paramsÚinclude_defaultr~   r‚   Údefault_valueZcolumn_defaultZ
tablespacer   r   r   Ú_iter_column_sql  sP    
ÿù	


ÿþý
ÿþýz)BaseDatabaseSchemaEditor._iter_column_sqlc              
   C   sD   |j | jd�}|d }|du r"dS g }d |  ||||||¡¡|fS )z†
        Return the column definition for a field. The field must already have
        had set_attributes_from_name() called.
        rX   ÚtypeN)NNrZ   )rg   r0   rv   r�   )r6   r    r   rŽ   r�   rŒ   rB   r   r   r   rf   V  s"    úþôz#BaseDatabaseSchemaEditor.column_sqlc                 C   s   dS )z�
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        Fr   ©r6   r   r   r   r   rƒ   q  s    z%BaseDatabaseSchemaEditor.skip_defaultc                 C   s   dS )zŸ
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        Fr   r’   r   r   r   r„   x  s    z.BaseDatabaseSchemaEditor.skip_default_on_alterc                 C   s   t dƒ‚dS )zU
        Only used for backends which have requires_literal_defaults feature
        z€subclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodN©ÚNotImplementedError©r6   Úvaluer   r   r   rˆ     s    ÿz(BaseDatabaseSchemaEditor.prepare_defaultc                 C   s   dS )z�
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        ú%sr   r’   r   r   r   r†   ˆ  s    z,BaseDatabaseSchemaEditor._column_default_sqlc                 C   s¢   |   ¡ r|  ¡ }nŒ| js<| jr<| jr<|  ¡ dkr6d}qžd}nbt| ddƒsTt| ddƒrš|  ¡ }|dkrnt ¡ }qžt	 ¡ }|dkrˆ| 
¡ }qž|d	krž| ¡ }nd }|S )
NZBinaryFieldrW   rE   Zauto_nowFZauto_now_addZDateTimeFieldZ	DateFieldZ	TimeField)Úhas_defaultÚget_defaultr‚   Zblankr‰   rr   Úgetattrr   Únowr   ÚdateÚtime)r   ÚdefaultZinternal_typer   r   r   Ú_effective_default�  s"    



z+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Zget_db_prep_saverŸ   r0   r’   r   r   r   r…   §  s    z*BaseDatabaseSchemaEditor.effective_defaultc                 C   s
   t ƒ ‚dS )aX  
        Return a quoted version of the value so it's safe to use in an SQL
        string. This is not safe against injection from user code; it is
        intended only for use in making SQL scripts or preparing default values
        for particularly tricky backends (defaults are not user-defined, though,
        so this is safe).
        Nr“   r•   r   r   r   rN   «  s    z$BaseDatabaseSchemaEditor.quote_valuec                 C   s\   |   |¡\}}|  ||pd¡ | j |  |¡¡ |jjD ]}|jjjj	r8|  
|jj¡ q8dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)r}   r<   r8   rj   Ú_model_indexes_sqlr   Úlocal_many_to_manyr,   ÚthroughÚauto_createdÚcreate_model)r6   r    rA   rB   r   r   r   r   r¤   ·  s    z%BaseDatabaseSchemaEditor.create_modelc                 C   s~   |j jD ]}|jjj jr|  |jj¡ q|  | jd|  |j j	¡i ¡ t
| jƒD ](}t|tƒrP| |j j	¡rP| j |¡ qPdS )z!Delete a model from the database.rb   N)r   r¡   r,   r¢   r£   Údelete_modelr<   Úsql_delete_tablerR   rl   Úlistr8   Ú
isinstancer   Zreferences_tableÚremove)r6   r    r   rA   r   r   r   r¥   Ê  s    ÿÿÿÿz%BaseDatabaseSchemaEditor.delete_modelc                 C   s.   |j r| jjjsdS | j| || ¡dd� dS )zAdd an index on a model.N©rB   )Úcontains_expressionsr0   r3   Úsupports_expression_indexesr<   Ú
create_sql©r6   r    Úindexr   r   r   Ú	add_indexß  s    ÿþz"BaseDatabaseSchemaEditor.add_indexc                 C   s*   |j r| jjjsdS |  | || ¡¡ dS )zRemove an index from a model.N)r«   r0   r3   r¬   r<   Ú
remove_sqlr®   r   r   r   Úremove_indexê  s    ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   sD   | j jjr(| j|  ||j|j¡d d� n|  ||¡ |  ||¡ d S )Nrª   )r0   r3   Zcan_rename_indexr<   Ú_rename_index_sqlr   r²   r°   )r6   r    Z	old_indexZ	new_indexr   r   r   Úrename_indexó  s    
þz%BaseDatabaseSchemaEditor.rename_indexc                 C   s"   |  || ¡}|r| j|dd� dS )zAdd a constraint to a model.Nrª   )r­   r<   ©r6   r    r_   rA   r   r   r   Úadd_constraintý  s    z'BaseDatabaseSchemaEditor.add_constraintc                 C   s   |  || ¡}|r|  |¡ dS )z!Remove a constraint from a model.N)r±   r<   rµ   r   r   r   Úremove_constraint  s    z*BaseDatabaseSchemaEditor.remove_constraintc                    s|   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q&|  |¡D ](}‡ fdd„|D ƒ}|  |  ˆ |¡¡ qNd	S )
z°
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 S   s   h | ]}t |ƒ’qS r   ©rL   ©r%   rz   r   r   r   Ú	<setcomp>  rW   zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   r¸   r¹   r   r   r   rº     rW   TF)r‹   r   c                    s   g | ]}ˆ j  |¡‘qS r   rS   rU   r   r   r   rV     rW   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer<   rd   )r6   r    Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsrz   ry   r   r   r   Úalter_unique_together  s    üz.BaseDatabaseSchemaEditor.alter_unique_togetherc                    s€   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q&|  |¡D ],}‡ fdd„|D ƒ}|  | jˆ |d	d
�¡ qNdS )z®
        Deal with a model changing its index_together. The input
        index_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 S   s   h | ]}t |ƒ’qS r   r¸   r¹   r   r   r   rº   &  rW   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   r¸   r¹   r   r   r   rº   '  rW   TF)r¯   r‹   c                    s   g | ]}ˆ j  |¡‘qS r   rS   rU   r   r   r   rV   2  rW   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©rz   ÚsuffixN)r»   r¼   Úsql_delete_indexr<   Ú_create_index_sql)r6   r    Zold_index_togetherZnew_index_togetherr¾   r¿   rz   ry   r   r   r   Úalter_index_together   s    üz-BaseDatabaseSchemaEditor.alter_index_togetherc           
         sÜ   dd„ ˆ j jD ƒ}dd„ ˆ j jD ƒ}‡ fdd„|D ƒ}| jˆ |fd||B i|¤Ž}| d¡du r”|r”| jjjr”t| j	ˆ j j
|d	d
�ƒ}	|	|v r”|	g}t|ƒdkrÀtdt|ƒˆ j j
d |¡f ƒ‚|  |  |ˆ |d ¡¡ d S )Nc                 S   s   h | ]
}|j ’qS r   ©r   r^   r   r   r   rº   6  s   zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   s   h | ]
}|j ’qS r   rÇ   r^   r   r   r   rº   9  rW   c                    s   g | ]}ˆ j  |¡j‘qS r   )r   rT   rn   rU   r   r   r   rV   :  rW   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcluder‹   TF©Úquoteé   z1Found wrong number (%s) of constraints for %s(%s)ra   r   )r   rt   ÚindexesÚ_constraint_namesr€   r0   r3   Z*allows_multiple_constraints_on_same_fieldsrF   Ú_unique_constraint_namerl   ÚlenÚ
ValueErrorrv   r<   Ú_delete_constraint_sql)
r6   r    rz   Zconstraint_kwargsrA   Úmeta_constraint_namesÚmeta_index_namesÚcolumnsÚconstraint_namesÚdefault_namer   r   r   r¼   5  sD    ÿþýüÿþýÿýÿÿz/BaseDatabaseSchemaEditor._delete_composed_indexc                 C   sn   ||ks"| j jjr&| ¡ | ¡ kr&dS |  | j|  |¡|  |¡dœ ¡ | jD ]}t|t	ƒrN| 
||¡ qNdS )z#Rename the table a model points to.N)Z	old_tableZ	new_table)r0   r3   Zignores_table_name_caseÚlowerr<   Úsql_rename_tablerR   r8   r¨   r   Zrename_table_references)r6   r    Zold_db_tableZnew_db_tablerA   r   r   r   Úalter_db_tableW  s     ÿþþÿÿ

z'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)rb   Zold_tablespaceZnew_tablespaceN)r<   Úsql_retablespace_tablerR   r   rl   )r6   r    Zold_db_tablespaceZnew_db_tablespacer   r   r   Úalter_db_tablespacej  s    ýÿÿz,BaseDatabaseSchemaEditor.alter_db_tablespacec              
   C   s
  |j r |jjjjr |  |jj¡S | j||dd�\}}|du r@dS |j| jd� }r`|d|› �7 }|j	| jd�}|d rˆ|d| j
|  7 }|j�rT| jjj�rT|j�rTd}| j�r>|jjjj}|jjj |jj¡j}	t|jjƒ\}
}|d| j|  |||¡|
�r
d|  |
¡ nd	|  |j¡|  |¡|  |	¡| jj ¡ d
œ  7 }n| j |  |||¡¡ | j|  |jj¡|  |j¡|dœ }|  ||¡ |  |¡�sÜ|  |¡du�rÜ| j |d|dd�\}}| j!|  |jj¡|dœ }|  ||¡ | j "|  #||¡¡ | jjj$�r| j %¡  dS )z�
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)rŽ   NrX   rZ   rY   r]   z%s.rE   )r   Ú	namespacern   r[   r\   Ú
deferrable)rb   rn   rc   ©Údrop©rb   Úchanges)&r   r,   r¢   r   r£   r¤   rf   ri   r0   rg   rh   r3   rp   rk   Úsql_create_column_inline_fkr    rl   rT   rm   rn   r   Ú_fk_constraint_namerR   rQ   Údeferrable_sqlr8   rK   rq   Úsql_create_columnr<   r„   r…   Ú_alter_column_default_sqlÚsql_alter_columnrj   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r6   r    r   rc   rB   r|   r{   Zconstraint_suffixr[   r\   rÜ   Ú_rA   Úchanges_sqlr   r   r   Ú	add_fieldu  sr    ÿþý
ÿÿ

øÿ
ýÿþÿ
þz"BaseDatabaseSchemaEditor.add_fieldc                 C   sì   |j r |jjjjr |  |jj¡S |j| jd�d du r:dS |jrp| j||j	gdd�}|D ]}|  
|  ||¡¡ qX| j|  |jj¡|  |j	¡dœ }|  
|¡ | jjjr°| j ¡  t| jƒD ],}t|tƒrº| |jj|j	¡rº| j |¡ qºdS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        rX   r‘   NT©Úforeign_key)rb   rn   )r   r,   r¢   r   r£   r¥   rg   r0   rÍ   rn   r<   Ú_delete_fk_sqlÚsql_delete_columnrR   rl   r3   ré   rê   r§   r8   r¨   r   Zreferences_columnr©   )r6   r    r   Úfk_namesÚfk_namerA   r   r   r   Úremove_field¿  s(    
þ



ÿz%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s6  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }|du rN|jdu s`|du rr|jdu rrtd||f ƒ‚n¨|du rº|du rº|jjrº|jjrº|jjjjrº|jjjjrº|  ||||¡S |du rö|du rö|jjrö|jjrö|jjjjsö|jjjjsödS |du �s
|du �rtd||f ƒ‚|  	||||||||¡ dS )a'  
        Allow a field's type, uniqueness, nullability, default, column,
        constraints, etc. to be modified.
        `old_field` is required to compute the necessary changes.
        If `strict` is True, raise errors if the old column does not match
        `old_field` precisely.
        NrX   r‘   zqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)z�Cannot alter field %s into %s - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields))
Ú_field_should_be_alteredrg   r0   r,   rÐ   r¢   r   r£   Ú_alter_many_to_manyÚ_alter_field)	r6   r    r'   r)   ÚstrictÚold_db_paramsÚold_typeÚnew_db_paramsÚnew_typer   r   r   Úalter_fieldß  st    ÿÿþÿÿþüû
ú
ù
ÿþüû
ú
ùþÿøz$BaseDatabaseSchemaEditor.alter_fieldc	           /      C   sþ  t ƒ }	| jjjr†|jr†|jr†| j||jgdd�}
|r\t|
ƒdkr\t	dt|
ƒ|j
j|jf ƒ‚|
D ]$}|	 |jf¡ |  |  ||¡¡ q`|j�r|jr¢|  ||¡�rdd„ |j
jD ƒ}| j||jgdd|d�}|røt|ƒdkrøt	d	t|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ qü| d
¡}| d
¡}| jjj�od|j�rD|j�sT|j�od|j�od||k�pd||k}|�rºt||ƒD ]B\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ �qš�qv|j�r$|j�s$|j�rÚ|j�r$dd„ |j
jD ƒ}| j||jgdtj|d�}|D ]}|  |  ||¡¡ �q
|d |d k�r¶|d �r¶dd„ |j
jD ƒ}| j||jgd|d�}|�r˜t|ƒdk�r˜t	dt|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ �qœ|j|jk�r|  |  |j
j|||¡¡ | jD ](}t |t!ƒ�rä| "|j
j|j|j¡ �qäg }g }g }|j#| jd�}|j#| jd�}||k�r\|  $||||¡}| %|¡ n:||f||fk�r–|  &||||¡\}}| %|¡ | '|¡ d} |j(�rö|j(�sö|  )|¡}!|  )|¡}"|  *|¡�sö|!|"k�rö|"du�röd} | %|  +|||¡¡ |j(|j(k�r"|  ,|||¡}|�r"| %|¡ | -¡ �o:|j(�o:|j( }#|�sH|�r&|#�sV|| }| jjj.�rŽ|�rŽt/t0|Ž ƒ\}}$d 1|¡t2|$g ƒfg}|D ],\}}$|  | j3|  4|j
j¡|dœ |$¡ �q’|#�r&|  | j5|  4|j
j¡|  4|j¡ddœ |"g¡ |D ],\}}$|  | j3|  4|j
j¡|dœ |$¡ �qø|�rH|D ]\}}$|  ||$¡ �q0|j�rd|j�sd|  6||¡ |  7||¡�r†|  |  8||g¡¡ |j�r–|j�r¼|j�r¼|j�s¼|  | j9||gd�¡ g }%|�rÖ|% 't||ƒ¡ |  ||¡�r|  |  :||¡¡ |% 't||ƒ¡ |%D ]Ì\}&}|jj;| jd�}'|'d }(|' d
¡})|&jj;| jd�}*|* d
¡}+|+|)k�rr|  $|j|j|(|)¡}g }n|  &|j|&j|j|(¡\}}|  | j3|  4|jj
j¡|d dœ |d ¡ |D ]\}}$|  ||$¡ �q¼�q
| jjj�r|j�r|	�s|j�r|j�s|j�r|  |  <||d¡¡ |�rV|%D ],\},}-|-jj�r(|  |  <|-j|-jd¡¡ �q(|d |d k�r¢|d �r¢| j=|j
j|jgdd�}|  |  >|||d ¡¡ | �rä| j+|||dd�\}.}$| j3|  4|j
j¡|.dœ }|  ||$¡ | jjj?�rú| j @¡  dS )z3Perform a "physical" (non-ManyToMany) field update.Trî   rË   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   s   h | ]
}|j ’qS r   rÇ   r^   r   r   r   rº   F  s   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r‹   r   rÈ   z7Found wrong number (%s) of unique constraints for %s.%sr~   c                 S   s   h | ]
}|j ’qS r   rÇ   )r%   r¯   r   r   r   rº   €  rW   )r¯   Útype_rÈ   rY   c                 S   s   h | ]
}|j ’qS r   rÇ   r^   r   r   r   rº   ‘  s   )rY   rÈ   z6Found wrong number (%s) of check constraints for %s.%srX   Nra   rà   r—   )rb   rn   rž   ©rz   r‘   r   r]   Z_fkÚ_check©rÃ   rÞ   )AÚsetr0   r3   rp   r,   rk   rÍ   rn   rÏ   rÐ   r   rl   Úaddr<   rð   r‹   Ú_field_became_primary_keyrt   Ú_delete_unique_sqlr€   r   r+   Zrelated_modelr   Údb_indexrÌ   r   rÃ   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr8   r¨   r   Zrename_column_referencesri   Ú_alter_column_collation_sqlrK   Ú_alter_column_type_sqlrj   r‚   r…   r„   ræ   Ú_alter_column_null_sqlr˜   Zsupports_combined_altersrL   r*   rv   Úsumrç   rR   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrd   rÅ   Ú_create_primary_key_sqlrg   rq   Ú_create_index_nameÚ_create_check_sqlré   rê   )/r6   r    r'   r)   rú   rü   rù   rû   rø   Zfks_droppedrò   ró   rÒ   rÕ   Úconstraint_nameZold_collationÚnew_collationZdrop_foreign_keysZ_old_relr.   Zrel_fk_namesrÓ   Zindex_namesÚ
index_namerA   ÚactionsZnull_actionsZpost_actionsZold_type_suffixZnew_type_suffixÚfragmentZother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationrB   Zrels_to_updater-   Zrel_db_paramsZrel_typeZrel_collationZold_rel_db_paramsZold_rel_collationrë   Úrelrì   r   r   r   r÷     s    ÿþý
ÿýÿÿÿ
ÿÿûýÿÿ

ýúÿÿþýýûÿüýÿÿÿÿ
ÿ
ÿÿ



ÿþýÿ

ÿþÿú
ýÿùþÿúÿÿþý


üÿþÿúÿþüüüúÿ
ÿÿÿÿ
þz%BaseDatabaseSchemaEditor._alter_fieldc                 C   sV   | j jjr|jrdS |j| j d�}|jr.| jn| j}||  |j	¡|d dœ g fS dS )zÏ
        Hook to specialize column null alteration.

        Return a (sql, params) fragment to set a column to null or non-null
        as required by new_field, or None if no changes are required.
        NrX   r‘   ©rn   r‘   )
r0   r3   rŠ   r‰   rg   r‚   Úsql_alter_column_nullÚsql_alter_column_not_nullrR   rn   )r6   r    r'   r)   rû   rA   r   r   r   r  x  s"    ÿþÿý
þÿúz/BaseDatabaseSchemaEditor._alter_column_null_sqlc           
      C   sŠ   |   |¡}|  |¡}|g}|r$g }n| jjjr<|  |¡}g }|j| jd�}|rd|jr\| j}	qj| j	}	n| j
}	|	|  |j¡|d |dœ |fS )zÁ
        Hook to specialize column default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        rX   r‘   )rn   r‘   rž   )r…   r†   r0   r3   r‡   rˆ   rg   r‚   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultrR   rn   )
r6   r    r'   r)   rß   r  rž   rB   rû   rA   r   r   r   ræ   •  s,    




ýÿùz2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s    | j |  |j¡|dœ g fg fS )a–  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a two-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        r  )Úsql_alter_column_typerR   rn   )r6   r    r'   r)   rü   r   r   r   r  »  s    
þÿú÷z/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s0   | j |  |j¡||r"d|  |¡ nddœ g fS )NrZ   rE   )rn   r‘   r~   )Úsql_alter_column_collaterR   rn   r�   )r6   r    r)   rü   r  r   r   r   r
  Ñ  s    
ÿûÿ÷z4BaseDatabaseSchemaEditor._alter_column_collation_sqlc                 C   s¢   |j jjj|j jjjkr:|  |j j|j jjj|j jjj¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ dS )z*Alter M2Ms to repoint their to= endpoints.N)	r,   r¢   r   rl   rÙ   rý   rT   Zm2m_reverse_field_nameZm2m_field_name)r6   r    r'   r)   rø   r   r   r   rö   Þ  s.    

ÿÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrE   c           	      C   sâ   t |ƒ\}}dt|g|¢R ddiŽ|f }| jj ¡ p8d}d|d |¡|f }t|ƒ|kr^|S t|ƒ|d kr~|d|d … }|t|ƒ d	 d
 }d|d|… d |¡d|… |f }|d dksÎ|d  ¡ rÞd|dd…  }|S )z½
        Generate a unique name for an index/unique constraint.

        The name is divided into 3 parts: the table name, the column names,
        and a unique digest and suffix.
        z%s%sÚlengthé   éÈ   z%s_%s_%srë   é   Né   rË   r   zD%séÿÿÿÿ)r   r
   r0   rQ   Zmax_name_lengthrv   rÏ   Úisdigit)	r6   Z
table_nameÚcolumn_namesrÃ   rë   Zhash_suffix_partÚ
max_lengthr  Zother_lengthr   r   r   r  þ  s(    þ
ýz+BaseDatabaseSchemaEditor._create_index_namec                 C   sf   |d u rHt |ƒdkr*|d jr*|d j}ntjr8tj}n|jjrH|jj}|d urbd| jj |¡ S dS )NrË   r   rZ   rE   )rÏ   rw   r   ZDEFAULT_INDEX_TABLESPACEr   r0   rQ   rx   )r6   r    rz   rw   r   r   r   Ú_get_index_tablespace_sql  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rE   r   )r6   Ú	conditionr   r   r   Ú_index_condition_sql*  s    z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjsdS tdt|jj|| jƒd�S )NrE   z INCLUDE (%(columns)s))rÔ   )r0   r3   Úsupports_covering_indexesr   r   r   rl   rR   )r6   r    rÔ   r   r   r   Ú_index_include_sql/  s    þz+BaseDatabaseSchemaEditor._index_include_sql)rz   r   rÃ   Úusingrw   Úcol_suffixesrA   Ú	opclassesr-  ÚincludeÚexpressionsc                   s¼   |pg }|pg }t |dd�jˆjd�}ˆj|||d�}dd„ |D ƒ}|pLˆj}|jj}‡ ‡fdd„}t|t|ˆj	ƒt
||||ƒ||r”ˆ ||||	¡nt|||ˆjƒ|ˆ |
¡ˆ ||¡d	�S )
zË
        Return the SQL statement to create the index for one or several fields
        or expressions. `sql` can be specified if the syntax differs from the
        standard (GIS indexes, ...).
        F©Z
alias_colsrX   )rw   c                 S   s   g | ]
}|j ‘qS r   ©rn   rU   r   r   r   rV   T  rW   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r"   )r  rR   ©ÚargsÚkwargs©r   r6   r   r   Úcreate_index_nameX  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rb   r   r1  rÔ   rC   r-  r4  )r   Úget_compilerr0   r,  Úsql_create_indexr   rl   r   r	   rR   r   Ú_index_columnsr   rN   r.  r0  )r6   r    rz   r   rÃ   r1  rw   r2  rA   r3  r-  r4  r5  Úcompilerrx   rÔ   r>  rb   r<  r   r;  r   rÅ   7  s0    ÿÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p
| jt|jj| jƒ|  |¡d�S ©N)rb   r   )r   rÄ   r	   r   rl   rR   )r6   r    r   rA   r   r   r   r  m  s
    ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s*   t | jt|jj| jƒ|  |¡|  |¡d�S )N)rb   Úold_nameÚnew_name)r   Úsql_rename_indexr	   r   rl   rR   )r6   r    rB  rC  r   r   r   r³   t  s    üz*BaseDatabaseSchemaEditor._rename_index_sqlc                 C   s   t ||| j|d�S )N)r2  )r   rR   )r6   rb   rÔ   r2  r3  r   r   r   r?  |  s    z'BaseDatabaseSchemaEditor._index_columnsc                    sª   ˆ j jrˆ j jsˆ j jrg S g }ˆ j jD ]}| |  ˆ |¡¡ q(ˆ j jD ],}‡ fdd„|D ƒ}| | j	ˆ |dd�¡ qHˆ j j
D ]&}|jr’| jjjr~| | ˆ | ¡¡ q~|S )zŠ
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                    s   g | ]}ˆ j  |¡‘qS r   rS   rU   r   r   r   rV   ‹  rW   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>rÁ   rÂ   )r   ZmanagedÚproxyZswappedre   rj   rè   Zindex_togetherrK   rÅ   rÌ   r«   r0   r3   r¬   r­   )r6   r    Úoutputr   ry   rz   r¯   r   r   r   r      s    ÿþz+BaseDatabaseSchemaEditor._model_indexes_sqlc                 C   s*   g }|   ||¡r&| | j||gd�¡ |S )zT
        Return a list of all index SQL statements for the specified field.
        rÿ   )Ú_field_should_be_indexedrK   rÅ   )r6   r    r   rF  r   r   r   rè   –  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s|   |  ¡ \}}}}|  ¡ \}}}}	|jD ]}
| |
d ¡ q&|jD ]}
|	 |
d ¡ q>|  |j¡|  |j¡kpz|||f|||	fkS r"   )ZdeconstructZnon_db_attrsÚpoprR   rn   )r6   r'   r)   rë   Úold_pathZold_argsZ
old_kwargsÚnew_pathÚnew_argsZ
new_kwargsÚattrr   r   r   rõ   Ÿ  s    

ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r"   )r  r‹   ©r6   r    r   r   r   r   rG  ®  s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r"   ©r   ©r6   r'   r)   r   r   r   r  ±  s    z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s   |j  o|jo|j p|j S r"   )r   r‹   rO  r   r   r   r  ´  s
    ÿýz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rb   Z
old_columnZ
new_columnr‘   )Úsql_rename_columnrR   rn   )r6   rb   r'   r)   rü   r   r   r   r	  »  s    

üz*BaseDatabaseSchemaEditor._rename_field_sqlc           
   	   C   sˆ   t |jj| jƒ}|  |||¡}t|jj|jg| jƒ}t |jjjj| jƒ}t|jjjj|jjg| jƒ}| j	j
 ¡ }	t| j||||||	d�S )N)rb   r   rn   r[   r\   rÝ   )r	   r   rl   rR   rã   r   rn   Útarget_fieldr    r0   rQ   rä   r   Úsql_create_fk)
r6   r    r   rÃ   rb   r   rn   r[   r\   rÝ   r   r   r   rq   Ã  s&    
ýùz'BaseDatabaseSchemaEditor._create_fk_sqlc                    s<   ‡ fdd„}t |jj|jgt|jjjjƒd |jjg||ƒS )Nc                     s   ˆ   ˆ j| i |¤Ž¡S r"   ©rR   r  r8  r;   r   r   Úcreate_fk_nameÙ  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namerË   )r   r   rl   rn   r   rQ  r    )r6   r    r   rÃ   rT  r   r;   r   rã   Ø  s    úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   s   |   | j||¡S r"   )rÑ   Úsql_delete_fk©r6   r    r   r   r   r   rð   å  s    z'BaseDatabaseSchemaEditor._delete_fk_sqlc                 C   s,   |d u rdS |t jkrdS |t jkr(dS d S )NrE   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ZDEFERREDZ	IMMEDIATE)r6   rÝ   r   r   r   Ú_deferrable_constraint_sqlè  s    

z3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc	              	      sŽ   |rˆ j jjsd S |s"|s"|s"|rNˆ j|||||||d�}	|	rJˆ j |	¡ d S ˆ jd ‡ fdd„|D ƒ¡ˆ  |¡dœ }
ˆ j	ˆ  
|¡|
dœ S )N)r   r-  r4  r3  r5  ra   c                    s   g | ]}ˆ   |j¡‘qS r   )rR   rn   rU   r;   r   r   rV     rW   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)rÔ   rÝ   ©r   r_   )r0   r3   Ú&supports_deferrable_unique_constraintsrd   r8   rK   Úsql_unique_constraintrv   rW  Úsql_constraintrR   )r6   r    rz   r   r-  rÝ   r4  r3  r5  rA   r_   r   r;   r   Ú_unique_sqlð  s4    ÿþù	þþz$BaseDatabaseSchemaEditor._unique_sqlc	                 C   s  |r| j jjr8|r| j jjr8|r*| j jjr8|r<| j jjs<d S t|dd�j| j d�}	|jj	}
dd„ |D ƒ}|d u r‚| j
|
|dd�}n
|  |¡}|sœ|sœ|sœ|r¤| j}n| j}|rÂ| j|
|d|d	�}nt|
||	| jƒ}t|t|
| jƒ|||  |¡|  |¡|  ||¡d
�S )NFr6  rX   c                 S   s   g | ]
}|j ‘qS r   r7  rU   r   r   r   rV   4  rW   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>TrÉ   r   )r2  r3  )rb   r   rÔ   r-  rÝ   r4  )r0   r3   rY  Úsupports_partial_indexesr/  r¬   r   r=  r   rl   rÎ   rR   Úsql_create_unique_indexÚsql_create_uniquer?  r   rN   r   r	   r.  rW  r0  )r6   r    rz   r   r-  rÝ   r4  r3  r5  r@  rb   rÔ   rA   r   r   r   rd     sT    þýûûúúøøÿ
ÿ

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc                    s&   |r‡ fdd„}nˆ j }t||d|ƒS )Nc                     s   ˆ   ˆ j| i |¤Ž¡S r"   rS  r8  r;   r   r   Úcreate_unique_nameP  s    zLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameÚ_uniq)r  r   )r6   rb   rÔ   rÊ   r`  r   r;   r   rÎ   M  s    z0BaseDatabaseSchemaEditor._unique_constraint_namec           	      C   sh   |r| j jjr8|r| j jjr8|r*| j jjr8|r<| j jjs<d S |sL|sL|sL|rT| j}n| j}|  |||¡S r"   )	r0   r3   rY  r]  r/  r¬   rÄ   r½   rÑ   )	r6   r    r   r-  rÝ   r4  r3  r5  rA   r   r   r   r  X  s*    þýûûúúøøz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )NrY   rX  )r[  rR   rh   )r6   r   rY   r   r   r   Ú
_check_sqlt  s    þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)rb   r   rY   )r   Úsql_create_checkr	   r   rl   rR   )r6   r    r   rY   r   r   r   r  z  s    üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   |   | j||¡S r"   )rÑ   Úsql_delete_checkrV  r   r   r   r  ‚  s    z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S rA  )r   r	   r   rl   rR   )r6   Útemplater    r   r   r   r   rÑ   …  s
    ýz/BaseDatabaseSchemaEditor._delete_constraint_sqlc
                    s"  |dur‡ fdd„|D ƒ}ˆ j  ¡ �$}
ˆ j j |
|jj¡}W d  ƒ n1 sN0    Y  g }| ¡ D ]¸\}}|du s€||d krd|dur–|d |kr–qd|dur¬|d |kr¬qd|durÂ|d |krÂqd|durØ|d |krØqd|durê|d	 sêqd|du�r|d
 |k�rqd|	�r||	vrd| |¡ qd|S )z@Return all constraint names matching the columns and conditions.Nc                    s   g | ]}ˆ j j |¡‘qS r   )r0   ÚintrospectionZidentifier_converter)r%   r   r;   r   r   rV   š  s   ÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rÔ   r‹   r   r¯   rY   rï   r‘   )r0   rO   rf  Zget_constraintsr   rl   ÚitemsrK   )r6   r    r*  r‹   r   r¯   rï   rY   rþ   rÈ   rO   rt   Úresultr   Zinfodictr   r;   r   rÍ   Œ  s4    
þÿ"z*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|r6t|ƒdkr6tdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ q:d S )NTrN  rË   z0Found wrong number (%s) of PK constraints for %s)rÍ   rÏ   rÐ   r   rl   r<   Ú_delete_primary_key_sql)r6   r    rø   rÕ   r  r   r   r   r  µ  s    þÿÿz,BaseDatabaseSchemaEditor._delete_primary_keyc              
   C   sJ   t | jt|jj| jƒ|  | j|jj|jgdd�¡t|jj|jg| jƒd�S )NZ_pkr  )rb   r   rÔ   )	r   Úsql_create_pkr	   r   rl   rR   r  rn   r   rM  r   r   r   r  Â  s    ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   s   |   | j||¡S r"   )rÑ   Úsql_delete_pkrV  r   r   r   ri  Î  s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   d|   |¡ S )NzCOLLATE )rR   )r6   r~   r   r   r   r�   Ñ  s    z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurerR   rv   r<   )r6   Zprocedure_namerm  rA   r   r   r   Úremove_procedureÔ  s
    þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)rE   )N)N)NNNNN)NNNNNN)T)NNNNN)NNNNNNNN)F)r   )mÚ__name__Ú
__module__Ú__qualname__Ú__doc__ru   rØ   rÚ   r¦   rå   rç   r!  r  r  r   r  r  r"  rñ   rP  r  rZ  rh   Zsql_delete_constraintr[  rc  rd  r_  r½   rR  ro   râ   rU  r>  r^  rD  rÄ   rj  rk  rn  r7   r:   r=   r<   rR   r}   r�   rf   rƒ   r„   rˆ   r†   ÚstaticmethodrŸ   r…   rN   r¤   r¥   r°   r²   r´   r¶   r·   rÀ   rÆ   r¼   rÙ   rÛ   rí   rô   rý   r÷   r  ræ   r  r
  rö   r  r,  r.  r0  rÅ   r  r³   r?  r    rè   rõ   rG  r  r  r	  rq   rã   rð   rW  r\  rd   rÎ   r  rb  r  r  rÑ   rÍ   r  r  ri  r�   ro  r   r   r   r   r/   K   s.  ÿÿÿÿÿÿÿ
		
S7
	
	
"J 
I ÷
  [
& 
 
ò6
	     ÷
,      ÷
5
     ø

        ö
)
r/   )Úloggingr   r   Zdjango.confr   Z!django.db.backends.ddl_referencesr   r   r   r   r   r	   Zdjango.db.backends.utilsr
   r   Zdjango.db.modelsr   r   Zdjango.db.models.sqlr   Zdjango.db.transactionr   r   Zdjango.utilsr   Ú	getLoggerrG   r   r!   r+   r/   r   r   r   r   Ú<module>   s    
