ó
®â0_c           @   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
 d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   Decimal(   t   Apps(   t   BaseDatabaseSchemaEditor(   t   sixt   DatabaseSchemaEditorc           B   s€   e  Z d  Z d Z d Z d Z d „  Z d „  Z d „  Z d d d d „ Z
 e d „ Z d	 „  Z d
 „  Z e d „ Z d „  Z RS(   s   DROP TABLE %(table)ss'   REFERENCES %(to_table)s (%(to_column)s)s7   CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)s   DROP INDEX %(name)sc         C   sX   |  j  j ƒ  4 } | j d ƒ | j ƒ  d |  _ | j d ƒ Wd  QXt t |  ƒ j ƒ  S(   Ns   PRAGMA foreign_keysi    s   PRAGMA foreign_keys = 0(   t
   connectiont   cursort   executet   fetchonet   _initial_pragma_fkt   superR   t	   __enter__(   t   selft   c(    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyR      s
    c         C   sR   t  t |  ƒ j | | | ƒ |  j j ƒ  ! } | j d t |  j ƒ ƒ Wd  QXd  S(   Ns   PRAGMA foreign_keys = %s(   R
   R   t   __exit__R   R   R   t   intR	   (   R   t   exc_typet	   exc_valuet	   tracebackR   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyR      s    c         C   s^  y d d  l  } | j | ƒ } Wn$ t k
 r2 n | j k
 rE n Xt | t t ƒ ƒ rk 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(
   Niÿÿÿÿs   '%s's   's   ''t   NULLt	   hex_codecs   X'%s't   asciis*   Cannot quote parameter value %r of type %s(   t   sqlite3t   adaptt   ImportErrort   ProgrammingErrort
   isinstancet   typet   Truet   strR   R    t   floatR   t   integer_typest   string_typest	   text_typet   replacet   Nonet   bytest	   bytearrayt
   memoryviewt   codecst
   getencodert   decodet
   ValueError(   R   t   valueR   t   hex_encodert	   value_hext   _length(    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   quote_value#   s.    

c            sñ  ‡ f d †  ‰  ‡  f d †  ˆ j  j Dƒ } ‡ f d †  ˆ j  j Dƒ } i  } d } t | d t ƒ s | rß t | d d t ƒ rß x[ t | j ƒ  ƒ D]D \ }	 }
 |
 j r” t |
 _ |
 } |
 j rØ | |	 =| |
 j	 =qØ q” q” Wn  | r*| | | j
 <| j r*| j r*ˆ j ˆ j | ƒ ƒ | | j	 <q*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  | r?| | j
 =| | j	 =| j r?| j j j  j r?ˆ j | j j ƒ Sn  t ƒ  } t j | ƒ } g  ˆ j  j D]+ } g  | D] } | j | | ƒ ^ qq^ qd} g  ˆ j  j D]+ } g  | D] } | j | | ƒ ^ q¯^ q¢} ˆ j  j } | rg  | D] } | j
 | j k rì| ^ qì} 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 „  ƒ } | ˆ ˆ j  j d ƒ î ˆ j& ˆ | j  j ˆ j  j ƒ g  ˆ j' D] } | j  j | k rë| ^ qëˆ _' ˆ j( | ƒ t | j ƒ  ƒ } ˆ j) d ˆ j | j  j ƒ d j* ‡ f d †  | Dƒ ƒ d j* d „  | Dƒ ƒ ˆ j ˆ j  j ƒ f ƒ ˆ j ˆ d t ƒWd QXx ˆ j' D] } ˆ j) | ƒ q»Wg  ˆ _' | rít+ | _ n  d S(   s…  
        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(   t   is_relationt   remote_fieldt   model(   t   f(   R2   (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   is_self_referentialS   s    c            s4   i  |  ]* } ˆ  | ƒ r$ | j  ƒ  n | | j “ q S(    (   t   clonet   name(   t   .0R3   (   R4   (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pys
   <dictcomp>W   s   	c            s(   i  |  ] } ˆ  j  | j ƒ | j “ q S(    (   t
   quote_namet   column(   R7   R3   (   R   (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pys
   <dictcomp>\   s   	 t   primary_keyi   s   coalesce(%(col)s, %(default)s)t   colt   defaultt	   app_labelt   db_tablet   unique_togethert   index_togethert   indexest   appst   Metat
   __module__c         s   s-   |  j  j } | |  j  _ d  V| |  j  _ d  S(   N(   t   _metaR>   (   R2   t   temporary_table_namet   original_table_name(    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   altered_table_name¸   s    t   __olds%   INSERT INTO %s (%s) SELECT %s FROM %ss   , c         3   s$   |  ] \ } } ˆ  j  | ƒ Vq d  S(   N(   R8   (   R7   t   xt   y(   R   (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pys	   <genexpr>Ì   s    c         s   s   |  ] \ } } | Vq d  S(   N(    (   R7   RJ   RK   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pys	   <genexpr>Í   s    t   handle_autom2mN(,   RE   t   local_concrete_fieldsR#   t   getattrt   Falset   listt   itemsR:   t   auto_createdR9   R6   t   many_to_manyt   concreteR/   t   effective_defaultt   popt   nullR8   R1   t   throught   delete_modelR   t   copyt   deepcopyR?   t   getR@   RA   t   fieldsR=   R>   R   t   tupleRD   t   object_namet	   __bases__t
   contextlibt   contextmanagert   alter_db_tablet   deferred_sqlt   create_modelR   t   joinR   (   R   R2   t   create_fieldt   delete_fieldt   alter_fieldt   bodyt   mappingt   rename_mappingt   restore_pk_fieldR6   t   fieldt	   old_fieldt	   new_fieldt   case_sqlRB   t   uniquet   nR?   t   indexR@   RA   t   meta_contentst   metat
   temp_modelRH   RJ   t
   field_mapst   sql(    (   R4   R2   R   sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   _remake_tableF   s–    			

	;;!

1		c         C   sM   | r t  t |  ƒ j | ƒ n* |  j |  j i |  j | j j ƒ d 6ƒ d  S(   Nt   table(   R
   R   RY   R   t   sql_delete_tableR8   RE   R>   (   R   R2   RL   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyRY   Ü   s    c         C   sE   | j  r. | j j j j r. |  j | j j ƒ S|  j | d | ƒd S(   s—   
        Creates a field on a model.
        Usually involves adding a column, but may involve adding a
        table instead (for M2M fields)
        Rg   N(   RS   R1   RX   RE   RR   Re   Rz   (   R   R2   Rn   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt	   add_fieldå   s    c         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(   s†   
        Removes a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        R   R   NRh   (
   RS   R1   RX   RE   RR   RY   t   db_parametersR   R#   Rz   (   R   R2   Rn   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   remove_fieldð   s    	c	   	      C   s   |  j  | d | | f ƒd S(   s<   Actually perform a "physical" (non-ManyToMany) field update.Ri   N(   Rz   (	   R   R2   Ro   Rp   t   old_typet   new_typet   old_db_paramst   new_db_paramst   strict(    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   _alter_field  s    c         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(   s=   
        Alters M2Ms to repoint their to= endpoints.
        Ri   Ns%   INSERT INTO %s (%s) SELECT %s FROM %ss   , t   id(   R1   RX   RE   R>   Rz   t	   get_fieldt   m2m_reverse_field_nameRe   R   R8   Rf   t   m2m_column_namet   m2m_reverse_nameRY   (   R   R2   Ro   Rp   R„   (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   _alter_many_to_many  s&    $"			 N(   t   __name__RD   R|   t   sql_create_inline_fkt   sql_create_uniquet   sql_delete_uniqueR   R   R/   R#   Rz   R   RY   R}   R   RO   R…   R‹   (    (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyR      s   			#–			(   R'   Ra   RZ   t   decimalR    t   django.apps.registryR   t   django.db.backends.base.schemaR   t   django.utilsR   R   (    (    (    sC   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/sqlite3/schema.pyt   <module>   s   