B
    ©0H[ŒD  ã               @   st   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 d dlmZ G dd	„ d	eƒZdS )
é    N)ÚDecimal)ÚApps)ÚBaseDatabaseSchemaEditor)Ú	Statement)Úatomic)ÚNotSupportedErrorc                   s¤   e Zd ZdZdZdZdZdZ‡ fdd„Z‡ fdd	„Z	d
d„ Z
d dd„Zd!‡ fdd„	Zd"‡ fdd„	Zd#dd„Zd$‡ fdd„	Zdd„ Zdd„ Zd%dd„Zdd„ Z‡  ZS )&ÚDatabaseSchemaEditorzDROP TABLE %(table)sNzEREFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERREDz7CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)zDROP INDEX %(name)sc                s   | j  ¡  tƒ  ¡ S )N)Ú
connectionÚdisable_constraint_checkingÚsuperÚ	__enter__)Úself)Ú	__class__© úeC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\db\backends\sqlite3\schema.pyr      s    
zDatabaseSchemaEditor.__enter__c                s   t ƒ  |||¡ | j ¡  d S )N)r   Ú__exit__r	   Úenable_constraint_checking)r   Úexc_typeÚ	exc_valueÚ	traceback)r   r   r   r      s    zDatabaseSchemaEditor.__exit__c             C   sì   ydd l }| |¡}W n( tk
r*   Y n |jk
r>   Y nX t|tdƒƒrZtt|ƒƒS t|tt	tfƒrrt|ƒS t|tƒrŒd| 
dd¡ S |d kr˜dS t|tttfƒrÔt|ƒ}t d¡}||ƒ\}}d| d	¡ S td
|t|ƒf ƒ‚d S )Nr   Tz'%s'ú'z''ÚNULLÚ	hex_codeczX'%s'Úasciiz*Cannot quote parameter value %r of type %s)Úsqlite3ZadaptÚImportErrorZProgrammingErrorÚ
isinstanceÚtypeÚstrÚintr   ÚfloatÚreplaceÚbytesÚ	bytearrayÚ
memoryviewÚcodecsÚ
getencoderÚdecodeÚ
ValueError)r   Úvaluer   Zhex_encoderZ	value_hexÚ_lengthr   r   r   Úquote_value   s*    

z DatabaseSchemaEditor.quote_valueFc       
   	   C   sŽ   | j  ¡ �z}xr| j j |¡D ]`}|r0|j|kr0q| j j ||j¡}x8| ¡ D ],}|d \}}	||krL|dkst|	|krLdS qLW qW W dQ R X dS )a  
        Return whether or not the provided table name is referenced by another
        one. If `column_name` is specified, only references pointing to that
        column are considered. If `ignore_self` is True, self-referential
        constraints are ignored.
        Zforeign_keyNTF)r	   ÚcursorZintrospectionZget_table_listÚnameZ_get_foreign_key_constraintsÚvalues)
r   Ú
table_nameZcolumn_nameÚignore_selfr,   Zother_tableÚconstraintsÚ
constraintZconstraint_tableZconstraint_columnr   r   r   Ú_is_referenced_by_fk_constraint@   s    z4DatabaseSchemaEditor._is_referenced_by_fk_constraintTc                s\   |rH|   |¡rH| jjr"td| ƒ‚| j ¡  tƒ  |||¡ | j ¡  ntƒ  |||¡ d S )Nz©Renaming the %r table while in a transaction is not supported on SQLite because it would break referential integrity. Try adding `atomic = False` to the Migration class.)r3   r	   Úin_atomic_blockr   r   r   Úalter_db_tabler
   )r   ÚmodelZold_db_tableZnew_db_tableÚdisable_constraints)r   r   r   r5   S   s    
z#DatabaseSchemaEditor.alter_db_tablec          
      sF  |j }|jj}| ¡ \}}|j |k�r.| j||dd��r.| jjrTtd|jj|f ƒ‚t| jj	ƒ�¦ t
ƒ j||||d� | j ¡ �|}	|	 d¡ ¡ d }
|	 d¡ d| }| ¡ d	 }|| }|| }|	 d
||f¡ |	 d|
d	  ¡ |	 d¡ |	 d¡ W d Q R X W d Q R X | j ¡ �}	|	 d¡ W d Q R X nt
ƒ j||||d� d S )NT)r0   z­Renaming the %r.%r column while in a transaction is not supported on SQLite because it would break referential integrity. Try adding `atomic = False` to the Migration class.)ÚstrictzPRAGMA schema_versionr   zPRAGMA writable_schema = 1z REFERENCES "%s" ("%%s") é   z3UPDATE sqlite_master SET sql = replace(sql, %s, %s)zPRAGMA schema_version = %dzPRAGMA writable_schema = 0zPRAGMA integrity_checkZVACUUM)r-   Ú_metaÚdb_tableZget_attname_columnr3   r	   r4   r   r   Úaliasr   Úalter_fieldr,   ÚexecuteZfetchone)r   r6   Ú	old_fieldÚ	new_fieldr8   Zold_field_namer/   Ú_Zold_column_namer,   Zschema_versionZreferences_templateZnew_column_nameÚsearchÚreplacement)r   r   r   r=   a   s2    

z DatabaseSchemaEditor.alter_fieldc          
      s(  ‡fdd„‰‡fdd„ˆj jD ƒ}‡fdd„ˆj jD ƒ}i ‰d}t|ddƒs`|ržt|d	 ddƒržx<t| ¡ ƒD ],\}}	|	jrnd|	_|	}|	jrn||= ||	j= qnW |rÎ|||j< |j	sÎ|j
rÎˆ ˆ |¡¡||j< |�r^|\}
}| |
jd¡ | |
jd¡ |||j< |
j�r@|j�s@d
ˆ |
j¡ˆ ˆ |¡¡dœ }|||j< nˆ |
j¡||j< |jˆ|
j< ˆ �r˜|ˆ j= |ˆ j= ˆ j	�r˜ˆ jjj j�r˜ˆ ˆ jj¡S tƒ }t |¡}‡fdd„ˆj jD ƒ}‡fdd„ˆj jD ƒ}ˆj j}ˆ �rô‡ fdd„|D ƒ}ˆj jˆj j||||dœ}tdd|ƒ}||d< ˆj|d< tˆj jˆj|ƒ}tj dd„ ƒ}|ˆˆj jd ƒ�’ ˆj!ˆ|j jˆj jdd� ˆ "|¡ t| ¡ ƒ}ˆ #dˆ |j j¡d $‡fdd„|D ƒ¡d $dd„ |D ƒ¡ˆ ˆj j¡f ¡ ˆjˆdd� W dQ R X xˆj%D ]}ˆ #|¡ �qþW g ˆ_%|�r$d|_dS )a…  
        Shortcut to transform a model from old_model into new_model

        The essential steps are:
          1. rename the model's existing table, e.g. "app_model" to "app_model__old"
          2. create a table with the updated definition called "app_model"
          3. copy the data from the old renamed table to the new table
          4. delete the "app_model__old" table
        c                s   | j o| jjˆ kS )N)Zis_relationÚremote_fieldr6   )Úf)r6   r   r   Úis_self_referential”   s    z?DatabaseSchemaEditor._remake_table.<locals>.is_self_referentialc                s$   i | ]}ˆ |ƒr|  ¡ n||j“qS r   )Úcloner-   )Ú.0rE   )rF   r   r   ú
<dictcomp>—   s   z6DatabaseSchemaEditor._remake_table.<locals>.<dictcomp>c                s   i | ]}ˆ   |j¡|j“qS r   )Ú
quote_nameÚcolumn)rH   rE   )r   r   r   rI   �   s    NÚprimary_keyFr9   zcoalesce(%(col)s, %(default)s))ÚcolÚdefaultc                s   g | ]}‡ fd d„|D ƒ‘qS )c                s   g | ]}ˆ   ||¡‘qS r   )Úget)rH   Ún)Úrename_mappingr   r   ú
<listcomp>Õ   s    zADatabaseSchemaEditor._remake_table.<locals>.<listcomp>.<listcomp>r   )rH   Úunique)rQ   r   r   rR   Õ   s   z6DatabaseSchemaEditor._remake_table.<locals>.<listcomp>c                s   g | ]}‡ fd d„|D ƒ‘qS )c                s   g | ]}ˆ   ||¡‘qS r   )rO   )rH   rP   )rQ   r   r   rR   Ü   s    zADatabaseSchemaEditor._remake_table.<locals>.<listcomp>.<listcomp>r   )rH   Úindex)rQ   r   r   rR   Ü   s   c                s   g | ]}ˆ j |jkr|‘qS r   )r-   Úfields)rH   rT   )Údelete_fieldr   r   rR   ã   s    )Ú	app_labelr;   Úunique_togetherÚindex_togetherÚindexesÚappsZMetar   Ú
__module__c             s   s"   | j j}|| j _d V  || j _d S )N)r:   r;   )r6   Ztemporary_table_nameZoriginal_table_namer   r   r   Úaltered_table_nameù   s    z>DatabaseSchemaEditor._remake_table.<locals>.altered_table_nameZ__old)r7   z%INSERT INTO %s (%s) SELECT %s FROM %sz, c             3   s   | ]\}}ˆ   |¡V  qd S )N)rJ   )rH   ÚxÚy)r   r   r   ú	<genexpr>  s    z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>c             s   s   | ]\}}|V  qd S )Nr   )rH   r^   r_   r   r   r   r`     s    )Úhandle_autom2mT)&r:   Zlocal_concrete_fieldsÚgetattrÚlistÚitemsrL   Úauto_createdrK   r-   Úmany_to_manyZconcreter+   Zeffective_defaultÚpopÚnullrJ   rD   ÚthroughÚdelete_modelr   ÚcopyÚdeepcopyrX   rY   rZ   rW   r;   r   r\   Zobject_nameÚ	__bases__Ú
contextlibÚcontextmanagerr5   Úcreate_modelr>   ÚjoinÚdeferred_sql)r   r6   Úcreate_fieldrV   r=   ÚbodyÚmappingZrestore_pk_fieldr-   Úfieldr?   r@   Zcase_sqlr[   rX   rY   rZ   Zmeta_contentsÚmetaZ
temp_modelr]   Z
field_mapsÚsqlr   )rV   rF   r6   rQ   r   r   Ú_remake_table‡   s”    








z"DatabaseSchemaEditor._remake_tablec                sl   |rt ƒ  |¡ nV|  | jd|  |jj¡i ¡ x6t| jƒD ](}t	|t
ƒr<| |jj¡r<| j |¡ q<W d S )NÚtable)r   rj   r>   Úsql_delete_tablerJ   r:   r;   rc   rr   r   r   Zreferences_tableÚremove)r   r6   ra   rx   )r   r   r   rj     s    z!DatabaseSchemaEditor.delete_modelc             C   s2   |j r |jjjjr |  |jj¡S | j||d� dS )z�
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        )rs   N)rf   rD   ri   r:   re   rp   ry   )r   r6   rv   r   r   r   Ú	add_field*  s    zDatabaseSchemaEditor.add_fieldc             C   sN   |j r"|jjjjrJ|  |jj¡ n(|j| jd�d dkr<dS | j||d� dS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r	   r   N)rV   )	rf   rD   ri   r:   re   rj   Zdb_parametersr	   ry   )r   r6   rv   r   r   r   Úremove_field4  s    z!DatabaseSchemaEditor.remove_fieldc	       
      C   sP   | j |||fd� |jrL|jrL||krLx$|jjjD ]}	|	js2|   |	j¡ q2W dS )z3Perform a "physical" (non-ManyToMany) field update.)r=   N)ry   rL   r6   r:   Zrelated_objectsrf   Zrelated_model)
r   r6   r?   r@   Zold_typeZnew_typeZold_db_paramsZnew_db_paramsr8   Úrelr   r   r   Ú_alter_fieldF  s
    z!DatabaseSchemaEditor._alter_fieldc             C   sÌ   |j jjj|j jjjkrR| j|j j|j jj | ¡ ¡|j jj | ¡ ¡fd� dS |  |j j¡ |  d|  	|j jjj¡d 
d| ¡ | ¡ g¡d 
d| ¡ | ¡ g¡|  	|j jjj¡f ¡ |  |j j¡ dS )z*Alter M2Ms to repoint their to= endpoints.)r=   Nz%INSERT INTO %s (%s) SELECT %s FROM %sz, Úid)rD   ri   r:   r;   ry   Ú	get_fieldZm2m_reverse_field_namerp   r>   rJ   rq   Zm2m_column_nameZm2m_reverse_namerj   )r   r6   r?   r@   r8   r   r   r   Ú_alter_many_to_manyQ  s&    

z(DatabaseSchemaEditor._alter_many_to_many)NF)T)F)NNN)T)F)Ú__name__r\   Ú__qualname__r{   Zsql_create_fkZsql_create_inline_fkZsql_create_uniqueZsql_delete_uniquer   r   r+   r3   r5   r=   ry   rj   r}   r~   r€   rƒ   Ú__classcell__r   r   )r   r   r      s$   !
&
 


r   )r%   rn   rk   Údecimalr   Zdjango.apps.registryr   Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   Zdjango.db.transactionr   Zdjango.db.utilsr   r   r   r   r   r   Ú<module>   s   