Ńň
şl°Mc           @   sH   d  d k  Z  d  d k Z d  d k l Z d Z d e f d     YZ d S(   i˙˙˙˙N(   t   settingst   test_t   BaseDatabaseCreationc           B   sŕ   e  Z d  Z h  Z d   Z d   Z e   d  Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d e d  Z d   Z d   Z d d  Z d   Z d   Z d   Z d   Z RS(   s  
    This class encapsulates all backend-specific differences that pertain to
    database *creation*, such as the column types to use for particular Django
    Fields, the SQL used to create and destroy tables, and the creation and
    destruction of test databases.
    c         C   s   | |  _  d  S(   N(   t
   connection(   t   selfR   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   __init__   s    c         G   s   d t  t |   d S(   sx   
        Generates a 32-bit digest of a set of arguments that can be used to
        shorten identifying names.
        s   %xl        (   t   abst   hash(   R   t   args(    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   _digest   s    c         C   s§  | i  } | i p
 | i o g  h  f Sg  } g  } h  } |  i i i } x| i D]}	 |	 i d |  i  }
 |	 i p | i } |
 d j o qT n | i
 | |	 i   | i |
  g } |	 i p | i | i d   n |	 i o | i | i d   n% |	 i o | i | i d   n | o0 |	 i o& | i |  i i i | d t  n |	 i o^ |  i |	 | |  \ } } | o+ | i |	 i i g   i | |	 f  } qČ| i |  n | i d i |   qT Wxn | i D]c } | i | i d  d d i g  } | D]( }	 | | i
 | | i |	  i   q~   qěW| i d	  d | i | | i   d
 g } xO t |  D]A \ } } | i d | | t |  d j  o d p d f  qW| i d  | i o# | i |  i i i | i   n | i d  | i d i |   | i  oa | i! i" p
 | i! i# } |  i i i$ | i |  } | o" x | D] } | i |  q~Wqn | | f S(   s   
        Returns the SQL required to create a single model, as a tuple of:
            (list_of_sql, pending_references_dict)
        R   s   NOT NULLs   PRIMARY KEYt   UNIQUEt   inlinet    s    (%s)s   , s   CREATE TABLEs    (s       %s%si   t   ,t    t   )t   ;s   
N(%   t   _metat   managedt   proxyR   t   opst
   quote_namet   local_fieldst   db_typet   db_tablespacet   Nonet	   SQL_FIELDt   columnt   SQL_COLTYPEt   nullt   appendt   SQL_KEYWORDt   primary_keyt   uniquet   tablespace_sqlt   Truet   relt%   sql_for_inline_foreign_key_referencest
   setdefaultt   tot   extendt   joint   unique_togethert	   get_fieldt	   SQL_TABLEt   db_tablet	   enumeratet   lent   has_auto_fieldt
   auto_fieldt	   db_columnt   namet   autoinc_sql(   R   t   modelt   stylet   known_modelst   optst   final_outputt   table_outputt   pending_referencest   qnt   ft   col_typet
   tablespacet   field_outputt
   ref_outputt   pendingt   prt   field_constraintst   _[1]t   full_statementt   it   linet   auto_columnR4   t   stmt(    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_create_model   sd    	
 


&
+
 L0 9
#
 c         C   s˝   |  i  i i } | i i | j o | i d  d | i | | i i i i   d | i	 | | i i i i
 | i i  i   d |  i  i i   g } t } n g  } t } | | f S(   sE   Return the SQL snippet defining the foreign key reference for a fieldt
   REFERENCESR   s    (R   (   R   R   R   R$   R'   R   R,   R   R-   R   R+   t
   field_nameR   t   deferrable_sqlt   FalseR#   (   R   t   fieldR7   R6   R<   t   outputRB   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR%   [   s    e
c         C   sO  d d k  l } | i i p | i i o g  S|  i i i } g  } | i } | | j ođ xâ | | D]Ö \ } }	 | i }
 |
 i } |	 i	 } | i } | i
 |	 i i  i	 } d | | |  i | |  f } | i | i d  d | |  | | | |  i i i     | |  | |  | |  |  i i i   f  qf W| | =n | S(   sE   Returns any ALTER TABLE statements to add constraints after the fact.i˙˙˙˙(   t   truncate_names   %s_refs_%s_%ss   ALTER TABLEs<    %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;(   t   django.db.backends.utilRR   R   R   R   R   R   R   R-   R   R+   R$   RM   R	   R   R   t   max_name_lengthRN   (   R   R5   R6   R;   RR   R<   R9   R8   t	   rel_classR=   t   rel_optst   r_tablet   r_colt   tablet   colt   r_name(    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_for_pending_referencesm   s*    	 				'c         C   s}   d d k  } | i d t  g  } xT | i i D]F } | i i p | i i i i o  | i |  i	 | | |   q/ q/ W| S(   sT   Return the CREATE TABLE statments for all the many-to-many tables defined on a modeli˙˙˙˙Nsd   Database creation API for m2m tables has been deprecated. M2M models are now automatically generated(
   t   warningst   warnt   DeprecationWarningR   t   local_many_to_manyR   R$   R'   R(   t   sql_for_many_to_many_field(   R   R5   R6   R]   RQ   R=   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_for_many_to_many   s      $c         C   s  d d k  } | i d t  d d k l } d d k l } g  } | i oĎ| i } |  i	 i
 i }	 | i p | i }
 |
 o: |  i	 i
 i |
 d t } | o d | } qž d } n d } | i d	  d | i |	 | i     d
 g } | i d | i |	 d   | i | i d t  i d |  i	   | i d  | f  g  } |  i | | |  \ } } | i |  | i d | i d  | i |	 | i     | i |	 | i     | f  | i d  | i o# | i |  i	 i
 i | i   n | i d  | i d i |   x¨ | D]  \ } } } } d | | |  i | |  f } | i | i d  d |	 |  |	 | | |  i	 i
 i     |	 |  |	 |  |	 |  |  i	 i
 i   f  q,W|  i	 i
 i | i   d  } | o" x | D] } | i |  qüWqn | S(   s9   Return the CREATE TABLE statements for a single m2m fieldi˙˙˙˙Nsd   Database creation API for m2m tables has been deprecated. M2M models are now automatically generated(   t   models(   RR   R   R   R   s   CREATE TABLEs    (s       %s %s %s%s,t   idR    R   s   NOT NULL PRIMARY KEYs       %s (%s, %s)%sR
   R   R   s   
s   %s_refs_%s_%ss   ALTER TABLEs<    %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;(    R]   R^   R_   t	   django.dbRc   RS   RR   t   auto_createdR   R   R   R   R   R"   R#   R   R,   t   m2m_db_tableR   R   R   t	   AutoFieldR   t&   sql_for_inline_many_to_many_referencesR(   t   m2m_column_namet   m2m_reverse_nameR)   R	   RT   RN   R4   (   R   R5   R=   R6   R]   Rc   RR   RQ   R8   R<   R?   t   sqlR"   R:   t   deferredt   inline_outputRW   RX   RY   RZ   R[   R4   RJ   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyRa      sd    
	
3	'	
# 	 c   
      C   s  d d k  } | i d t  d d k l } | i } |  i i i } d | i	 | | i
     | i | i |  i d |  i   | i d  | i | | i   | i	 | | i i   |  i i i   f d | i	 | | i     | i | i | i i  i d |  i   | i d  | i | | i i i i   | i	 | | i i i i i   |  i i i   f g } g  }	 | |	 f S(   sF   Create the references to other tables required by a many-to-many tablei˙˙˙˙Nsd   Database creation API for m2m tables has been deprecated. M2M models are now automatically generated(   Rc   s       %s %s %s %s (%s)%s,R   s   NOT NULL REFERENCES(   R]   R^   R_   Re   Rc   R   R   R   R   R   Rj   R   t
   ForeignKeyR   R   R,   R-   t   pkR   RN   Rk   R$   R'   (
   R   R5   RP   R6   R]   Rc   R8   R<   R:   Rm   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyRi   Ô   s.    	$*!c         C   s]   | i  i p | i  i o g  Sg  } x0 | i  i D]" } | i |  i | | |   q3 W| S(   s:   Returns the CREATE INDEX SQL statements for a single model(   R   R   R   R   R(   t   sql_indexes_for_field(   R   R5   R6   RQ   R=   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_indexes_for_modelô   s      c         C   sM  d d k  l } | i o)| i o|  i i i } | i p
 | i i } | o4 |  i i i	 |  } | o d | } q d } n d } d | i i
 |  i | i  f }	 | i d  d | i | | |	 |  i i i      d | i d  d | i | | i i
   d d | i | | i   d	 | g }
 n g  }
 |
 S(
   s?   Return the CREATE INDEX SQL statements for a single model fieldi˙˙˙˙(   RR   R   R   s   %s_%ss   CREATE INDEXt   ONs   (%s)s   %s;(   RS   RR   t   db_indexR!   R   R   R   R   R   R"   R-   R	   R   R   R,   RT   R   (   R   R5   R=   R6   RR   R<   R?   Rl   R"   t   i_nameRQ   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyRq   ý   s    
"c         C   sŐ   | i  i p | i  i o g  S|  i i i } d | i d  | i | | i  i   f g } | | j o  | i	 |  i
 | | |   n | i  i o7 |  i i i | i  i  } | o | i |  qŃ n | S(   sJ   Return the DROP TABLE and restraint dropping statements for a single models   %s %s;s
   DROP TABLE(   R   R   R   R   R   R   R   R,   R-   R(   t   sql_remove_table_constraintsR0   t   drop_sequence_sqlR   (   R   R5   t   references_to_deleteR6   R<   RQ   t   ds(    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_destroy_model  s    " c         C   s4  d d k  l } | i i p | i i o g  Sg  } |  i i i } xá | | D]Ő \ } } | i i }	 | i	 }
 | i i } | i i
 | i i  i	 } d |
 | |  i |	 |  f } | i d | i d  | i | |	   | i |  i i i    | i | | | |  i i i      f  qP W| | =| S(   Ni˙˙˙˙(   RR   s   %s_refs_%s_%ss   %s %s %s %s;s   ALTER TABLE(   RS   RR   R   R   R   R   R   R   R-   R   R+   R$   RM   R	   R   R   R,   t   drop_foreignkey_sqlR   RT   (   R   R5   Rx   R6   RR   RQ   R<   RU   R=   RY   RZ   RW   RX   R[   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyRv   (  s&     		3c         C   s¸   d d k  } | i d t  |  i i i } g  } | i oy | i d | i d  | i	 | | i
     f  |  i i i d | i i | i f  } | o | i |  q´ n | S(   s8   Returns the DROP TABLE statements for a single m2m fieldi˙˙˙˙Nsd   Database creation API for m2m tables has been deprecated. M2M models are now automatically generateds   %s %s;s
   DROP TABLEs   %s_%s(   R]   R^   R_   R   R   R   Rf   R   R   R,   Rg   Rw   R   R-   R   (   R   R5   R=   R6   R]   R<   RQ   Ry   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   sql_destroy_many_to_many=  s    
 (i   c         C   sE  d d k  l } |  i   } | d j o: d } | d j o d | } n d |  i i | f GHn |  i | |  |  i i   | |  i i d <|  i i i	   | d	 d
 t
 | d d  d t d |  i i d t | d d
 t
 | d d  d t d |  i i d d k l } d t i j on | d d  } | d j	 oN | i i |  i i  i   d j o) | i i |  i i  i d t i  qn d d k l } d d k l }	 x} t i D]r }
 | |
  } t | |	  oP d d k l } | i |  i i | i  o  | d | i  d |  i i q.qźqźW|  i i!   } | S(   sĽ   
        Creates a test database, prompting the user for confirmation if the
        database already exists. Returns the name of the test database created.
        i˙˙˙˙(   t   call_commandi   R   i   s    ('%s')s*   Creating test database for alias '%s'%s...t   NAMEt   syncdbt	   verbosityi    t   interactivet   databaset   load_initial_datat   flush(   t	   get_models   django.contrib.sitest   sitest   SiteRd   (   t	   get_cache(   t   BaseDatabaseCache(   t   routert   createcachetableN("   t   django.core.managementR}   t   _get_test_db_nameR   t   aliast   _create_test_dbt   closet   settings_dictt   featurest   confirmt   maxRO   t   django.db.modelsR   R    t   INSTALLED_APPSR   t   objectst   usingt   countt   updatet   SITE_IDt   django.core.cacheR   t   django.core.cache.backends.dbR   t   CACHESt
   isinstanceRe   R   t   allow_syncdbt   cache_model_classt   _tablet   cursor(   R   R   t   autoclobberR}   t   test_database_namet   test_db_reprR   R   R   R   t   cache_aliast   cacheR   RŁ   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   create_test_dbO  sH    		2-
 (c         C   s2   |  i  i d o |  i  i d St |  i  i d S(   s  
        Internal implementation - returns the name of the test DB that will be
        created. Only useful when called from create_test_db() and
        _create_test_db() and when no external munging is done with the 'NAME'
        or 'TEST_NAME' settings.
        t	   TEST_NAMER~   (   R   R   t   TEST_DATABASE_PREFIX(   R   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR     s    c   	      C   sg  |  i    } |  i   } |  i i i } |  i i   } |  i   y! | i d | |  | f  Wn˙ t j
 oó } t	 i
 i d |  | p t d |  } n | p | d j o yX | d j o d |  i i GHn | i d | |   | i d | |  | f  Wq^t j
 o* } t	 i
 i d |  t	 i d	  q^Xqcd
 GHt	 i d  n X| S(   s5   Internal implementation - creates the test db tables.s   CREATE DATABASE %s %ss,   Got an error creating the test database: %s
sX   Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: t   yesi   s$   Destroying old test database '%s'...s   DROP DATABASE %ss.   Got an error recreating the test database: %s
i   s   Tests cancelled.(   t   sql_table_creation_suffixR   R   R   R   RŁ   t   set_autocommitt   executet	   Exceptiont   syst   stderrt   writet	   raw_inputR   t   exit(	   R   R   R¤   t   suffixRĽ   R<   RŁ   t   eR   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR     s.    
!!c         C   s   |  i  i   |  i  i d } | d j o: d } | d j o d | } n d |  i  i | f GHn | |  i  i d <|  i | |  d S(   sĽ   
        Destroy a test database, prompting the user for confirmation if the
        database already exists. Returns the name of the test database created.
        R~   i   R   i   s    ('%s')s,   Destroying test database for alias '%s'%s...N(   R   R   R   R   t   _destroy_test_db(   R   t   old_database_nameR   RĽ   RŚ   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   destroy_test_dbż  s    c         C   sW   |  i  i   } |  i   t i d  | i d |  i  i i |   |  i  i   d S(   s4   Internal implementation - remove the test db tables.i   s   DROP DATABASE %sN(	   R   RŁ   RŽ   t   timet   sleepRŻ   R   R   R   (   R   RĽ   R   RŁ   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR¸   Ď  s
    
 c         C   s   t  |  i i d  o@ t |  i i i  o |  i i i t  q t |  i i _ n. t  |  i i d  o |  i i i d  n d S(   s-   Make sure a connection is in autocommit mode.t
   autocommitt   set_isolation_leveli    N(   t   hasattrR   t   callableR˝   R#   Rž   (   R   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyRŽ   Ű  s    c         C   s   d S(   s>   SQL to append to the end of the test table creation statementsR   (    (   R   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR­   ĺ  s    c         C   s,   |  i  i } | d | d | d | d f S(   sČ   
        Returns a tuple with elements of self.connection.settings_dict (a
        DATABASES setting value) that uniquely identify a database
        accordingly to the RDBMS particularities.
        t   HOSTt   PORTt   ENGINER~   (   R   R   (   R   R   (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   test_db_signatureé  s
    (   t   __name__t
   __module__t   __doc__t
   data_typesR   R	   t   setRK   R%   R\   Rb   Ra   Ri   Rr   Rq   Rz   Rv   R|   RO   RŠ   R   R   Rş   R¸   RŽ   R­   RÄ   (    (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyR   
   s.   		>				?	 						C		"		
	(   Rą   Rť   t   django.confR    RŤ   t   objectR   (    (    (    sE   /usr/local/lib/python2.6/dist-packages/django/db/backends/creation.pyt   <module>   s   