
^Q\3                 @   s~   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
 Gd d   d e  Z d S)    N)Decimal)Apps)BaseDatabaseSchemaEditor)sixc                   s   e  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 d d  Z
 d   f d d  Z d d   Z d d   Z d d d  Z d d   Z   S)DatabaseSchemaEditorzDROP TABLE %(table)sz'REFERENCES %(to_table)s (%(to_column)s)z7CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)zDROP INDEX %(name)sc          	      sX   |  j  j   4 } | j d  | j   d |  _ | j d  Wd  QXt t |   j   S)NzPRAGMA foreign_keysr   zPRAGMA foreign_keys = 0)
connectioncursorexecuteZfetchone_initial_pragma_fksuperr   	__enter__)selfc)	__class__ G/var/www/dbchiro/venv/build/Django/django/db/backends/sqlite3/schema.pyr      s
    zDatabaseSchemaEditor.__enter__c                sR   t  t |   j | | |  |  j j   ! } | j d t |  j   Wd  QXd  S)NzPRAGMA foreign_keys = %s)r   r   __exit__r   r   r	   intr
   )r   exc_type	exc_value	tracebackr   )r   r   r   r      s    zDatabaseSchemaEditor.__exit__c             C   s`  y d d  l  } | j |  } Wn& t k
 r3 Yn | j k
 rG Yn Xt | t d   rm t t |   St | t t	 f  r t |  St | t
 j  r t |  St | t
 j  r d t
 j |  j d d  S| d  k r d St | t t t
 j f  r@t |  } t j d  } | |  \ } } d | j d	  St d
 | t |  f   d  S)Nr   Tz'%s''z''ZNULL	hex_codeczX'%s'asciiz*Cannot quote parameter value %r of type %s)sqlite3ZadaptImportErrorZProgrammingError
isinstancetypestrr   r   floatr   integer_typesstring_types	text_typereplacebytes	bytearray
memoryviewcodecs
getencoderdecode
ValueError)r   valuer   Zhex_encoderZ	value_hex_lengthr   r   r   quote_value#   s.    

z DatabaseSchemaEditor.quote_valueNc                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 | j    D]D \ } }	 |	 j r d |	 _ |	 } |	 j r | | =| |	 j =q q q Wn  | r3| | | j <| j	 r3| j
 r3 j  j |   | | j <q3n  | r| \ }
 } | j |
 j d  | j |
 j d  | | | j <|
 j r| j rd
 i  j |
 j  d 6 j  j |   d 6} | | | j <n  j |
 j  | | j <| j  |
 j <n    rH|   j =|   j =  j	 rH  j j j  j rH j   j j  Sn  t   } t j |  }  f d d    j  j D }  f d d    j  j D }  j  j }   r  f d d   | D } n  i  j  j d 6 j  j d 6| d 6| d 6| d 6| d 6} t d t   |  } | | d < j | d <t  j  j  j |   t  j! d d    } |   j  j d    j"   j  j  j  j   f d d    j# D  _#  j$   t | j    }  j% d  j  j  j  d j&  f d d    | D  d j& d! d    | D   j  j  j  f   j  d" d Wd QXx  j# D] }  j% |  qkWg   _# | rd# | _ n  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_fieldmodel)f)r/   r   r   is_self_referentialS   s    z?DatabaseSchemaEditor._remake_table.<locals>.is_self_referentialc                s4   i  |  ]* }   |  r$ | j    n | | j  q Sr   )clonename).0r0   )r1   r   r   
<dictcomp>W   s   	z6DatabaseSchemaEditor._remake_table.<locals>.<dictcomp>c                s(   i  |  ] }   j  | j  | j  q Sr   )
quote_namecolumn)r4   r0   )r   r   r   r5   \   s   	 Nprimary_keyF   zcoalesce(%(col)s, %(default)s)coldefaultc                s)   g  |  ] }   f d  d   | D  q S)c                s"   g  |  ] }   j  | |   q Sr   )get)r4   n)rename_mappingr   r   
<listcomp>   s   	 zADatabaseSchemaEditor._remake_table.<locals>.<listcomp>.<listcomp>r   )r4   unique)r>   r   r   r?      s   	z6DatabaseSchemaEditor._remake_table.<locals>.<listcomp>c                s)   g  |  ] }   f d  d   | D  q S)c                s"   g  |  ] }   j  | |   q Sr   )r<   )r4   r=   )r>   r   r   r?      s   	 zADatabaseSchemaEditor._remake_table.<locals>.<listcomp>.<listcomp>r   )r4   index)r>   r   r   r?      s   	c                s(   g  |  ] }   j  | j k r |  q Sr   )r3   fields)r4   rA   )delete_fieldr   r   r?      s   	 	app_labeldb_tableunique_togetherindex_togetherindexesappsZMeta
__module__c             s   s-   |  j  j } | |  j  _ d  V| |  j  _ d  S)N)_metarE   )r/   Ztemporary_table_nameZoriginal_table_namer   r   r   altered_table_name   s    z>DatabaseSchemaEditor._remake_table.<locals>.altered_table_nameZ__oldc                s(   g  |  ] }   j  j | k r |  q Sr   )rK   rE   )r4   x)
temp_modelr   r   r?      s   	 z%INSERT INTO %s (%s) SELECT %s FROM %sz, c             3   s$   |  ] \ } }   j  |  Vq d  S)N)r6   )r4   rM   y)r   r   r   	<genexpr>   s    z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>c             s   s   |  ] \ } } | Vq d  S)Nr   )r4   rM   rO   r   r   r   rP      s    handle_autom2mT)'rK   Zlocal_concrete_fieldsgetattrlistitemsr8   auto_createdr7   r3   many_to_manyZconcreter-   Zeffective_defaultpopnullr6   r.   throughdelete_modelr   copydeepcopyrF   rG   rH   rD   rE   r   tuplerJ   Zobject_name	__bases__
contextlibcontextmanagerZalter_db_tableZdeferred_sqlcreate_modelr	   join)r   r/   create_fieldrC   alter_fieldbodymappingZrestore_pk_fieldr3   field	old_field	new_fieldZcase_sqlrI   rF   rG   rH   Zmeta_contentsmetarL   Z
field_mapsZsqlr   )rC   r1   r/   r>   r   rN   r   _remake_tableF   s    			

	

		z"DatabaseSchemaEditor._remake_tableTc                sM   | r t  t |   j |  n* |  j |  j i |  j | j j  d 6 d  S)Ntable)r   r   rZ   r	   sql_delete_tabler6   rK   rE   )r   r/   rQ   )r   r   r   rZ      s    z!DatabaseSchemaEditor.delete_modelc             C   sE   | j  r. | j j j j r. |  j | j j  S|  j | d | d S)z
        Creates a field on a model.
        Usually involves adding a column, but may involve adding a
        table instead (for M2M fields)
        rc   N)rV   r.   rY   rK   rU   ra   rk   )r   r/   rg   r   r   r   	add_field   s    zDatabaseSchemaEditor.add_fieldc             C   sn   | j  r4 | j j j j rj |  j | j j  qj n6 | j d |  j  d d k rW d S|  j | d | d S)z
        Removes a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        r   r   NrC   )	rV   r.   rY   rK   rU   rZ   Zdb_parametersr   rk   )r   r/   rg   r   r   r   remove_field   s    	z!DatabaseSchemaEditor.remove_fieldFc	       	      C   s   |  j  | d | | f d S)z<Actually perform a "physical" (non-ManyToMany) field update.rd   N)rk   )	r   r/   rh   ri   Zold_typeZnew_typeZold_db_paramsZnew_db_paramsstrictr   r   r   _alter_field  s    z!DatabaseSchemaEditor._alter_fieldc             C   s$  | j  j j j | j  j j j k rw |  j | j  j d | j  j j j | j    | j  j j j | j    f d S|  j | j  j  |  j d |  j	 | j  j j j  d j
 d | j   | j   g  d j
 d | j   | j   g  |  j	 | j  j j j  f  |  j | j  j  d S)z=
        Alters M2Ms to repoint their to= endpoints.
        rd   Nz%INSERT INTO %s (%s) SELECT %s FROM %sz, id)r.   rY   rK   rE   rk   	get_fieldZm2m_reverse_field_namera   r	   r6   rb   Zm2m_column_nameZm2m_reverse_namerZ   )r   r/   rh   ri   rp   r   r   r   _alter_many_to_many  s&    $"			 z(DatabaseSchemaEditor._alter_many_to_many)__name__rJ   __qualname__rm   Zsql_create_inline_fkZsql_create_uniqueZsql_delete_uniquer   r   r-   rk   rZ   rn   ro   rq   rt   r   r   )r   r   r      s   #	r   )r'   r_   r[   decimalr   Zdjango.apps.registryr   Zdjango.db.backends.base.schemar   Zdjango.utilsr   r   r   r   r   r   <module>   s   