
 X	K                 @   s8  d  Z  d d l m Z d d l Z 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 m Z d d	 l m Z m Z m Z m Z d d
 l m Z d d l m Z d d l m Z y d d l Z Wn e  k
 r(d Z Yn Xy= y d d l! m" Z# Wn" e  k
 rdd d l$ m" Z# Yn XWnE e  k
 rZ% z% d d l& m' Z' e' d e%   WYd d Z% [% Xn Xd d l( m) Z) d d l* m+ Z+ d d l, m- Z- d d l. m/ Z/ d d l0 m1 Z1 d d l2 m3 Z3 e# j4 Z4 e# j5 Z5 d d   Z6 d d   Z7 e# j8 e9 d  e7 d d     e# j8 e9 d  e7 e   e# j8 e9 d  e7 e   e# j8 e9 d   e7 e   e# j8 e9 d!  e7 e   e# j8 e9 d"  e7 e   e# j8 e9 d#  e7 e j:   e# j; e j e6  e# j; e j< e j=  e j> rfe# j; e9 d$ d    e# j; e d% d    n  Gd& d'   d' e  Z? e j@ d(  ZA Gd) d*   d* e# jB  ZC d+ d,   ZD d- d.   ZE d/ d0   ZF d1 d2   ZG d3 d4   ZH d5 d6   ZI d7 d8   ZJ d9 d:   ZK d; d<   ZL d= d>   ZM d? d@   ZN dA dB   ZO d S)Czt
SQLite3 backend for django.

Works with either the pysqlite2 module or the sqlite3 module in the
standard library.
    )unicode_literalsN)settings)utils)BaseDatabaseWrapper)BaseDatabaseValidation)sixtimezone)
parse_dateparse_datetimeparse_duration
parse_time)RemovedInDjango20Warning)
force_text)	SafeBytes)dbapi2)ImproperlyConfiguredzKError loading either pysqlite2 or sqlite3 modules (tried in that order): %s   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditorc             C   s\   t  j rI t j |   rI t j d t  |  j t j  j	 d d   }  n  |  j
 t d   S)NzThe SQLite database adapter received an aware datetime (%s), probably from cursor.execute(). Update your code to pass a naive datetime in the database connection's time zone (UTC by default).tzinfo )r   ZUSE_TZr   Zis_awarewarningswarnr   
astimezoneutcreplace	isoformatstr)value r#   M/home/ubuntu/projects/ifolica/build/django/django/db/backends/sqlite3/base.py%adapt_datetime_warn_on_aware_datetime5   s    !r%   c                s     f d d   S)z The Python sqlite3 interface returns always byte strings.
        This function converts the received value to a regular string before
        passing it to the receiver function.
    c                s     |  j  d   S)Nzutf-8)decode)s)	conv_funcr#   r$   <lambda>H   s    zdecoder.<locals>.<lambda>r#   )r(   r#   )r(   r$   decoderC   s    r*   boolc             C   s
   |  d k S)N1r#   )r'   r#   r#   r$   r)   J   s    r)   timedatedatetime	timestampZ	TIMESTAMPdecimalc             C   s   |  j  d  S)Nzutf-8)r&   )r'   r#   r#   r$   r)   U   s    c             C   s   |  j  d  S)Nzutf-8)r&   )r'   r#   r#   r$   r)   V   s    c                   s)  e  Z d  Z d Z i d d 6d d 6d d 6d d 6d	 d
 6d	 d 6d d 6d d 6d d 6d d 6d	 d 6d	 d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d  d! 6d" d# 6d	 d$ 6d% d& 6d' d( 6d) d* 6d+ d, 6Z i d- d 6d- d 6Z i d. d/ 6d0 d1 6d0 d2 6d0 d3 6d4 d5 6d6 d7 6d8 d9 6d: d; 6d< d= 6d> d? 6d0 d@ 6d0 dA 6d0 dB 6d0 dC 6Z dD Z i dE d2 6dF d3 6dG d@ 6dH dB 6dI dA 6dJ dC 6Z e	 Z	 e
 Z   f dK dL   Z dM dN   Z dO dP   Z dQ dR   Z dS dT   Z dU dV   Z dW dX   Z dY dZ   Z d[ d\ d]  Z d^ d_   Z d` da   Z db dc   Z   S)dDatabaseWrapperZsqliteintegerZ	AutoFieldZBigAutoFieldZBLOBZBinaryFieldr+   ZBooleanFieldzvarchar(%(max_length)s)Z	CharFieldZCommaSeparatedIntegerFieldr.   Z	DateFieldr/   ZDateTimeFieldr1   ZDecimalFieldZbigintZDurationFieldZ	FileFieldZFilePathFieldrealZ
FloatFieldZIntegerFieldZBigIntegerFieldzchar(15)ZIPAddressFieldzchar(39)ZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldzinteger unsignedZPositiveIntegerFieldzsmallint unsignedZPositiveSmallIntegerFieldZ	SlugFieldZsmallintZSmallIntegerFieldtextZ	TextFieldr-   Z	TimeFieldzchar(32)Z	UUIDFieldZAUTOINCREMENTz= %sexactzLIKE %s ESCAPE '\'ZiexactcontainsZ	icontainsz	REGEXP %sregexzREGEXP '(?i)' || %sZiregexz> %sgtz>= %sZgtez< %sltz<= %sZlte
startswithendswithZistartswithZ	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z"LIKE '%%' || {} || '%%' ESCAPE '\'z)LIKE '%%' || UPPER({}) || '%%' ESCAPE '\'zLIKE {} || '%%' ESCAPE '\'z!LIKE UPPER({}) || '%%' ESCAPE '\'zLIKE '%%' || {} ESCAPE '\'z!LIKE '%%' || UPPER({}) ESCAPE '\'c                sw   t  t |   j | |   t |   |  _ t |   |  _ t |   |  _ t	 |   |  _
 t |   |  _ t |   |  _ d  S)N)superr2   __init__r   featuresr   opsr   clientr   creationr   introspectionr   Z
validation)selfargskwargs)	__class__r#   r$   r>      s    zDatabaseWrapper.__init__c             C   s   |  j  } | d s2 d d l m } | d   n  i | d d 6t j t j Bd 6} | j | d  d | k r | d r t j d	 t	  n  | j i d
 d 6 |  j
 j r | j i d d 6 n  | S)NNAMEr   )r   zJsettings.DATABASES is improperly configured. Please supply the NAME value.ZdatabaseZdetect_typesOPTIONSZcheck_same_threadzThe `check_same_thread` option was provided and set to True. It will be overridden with False. Use the `DatabaseWrapper.allow_thread_sharing` property instead for controlling thread shareability.FTuri)settings_dictdjango.core.exceptionsr   DatabaseZPARSE_DECLTYPESZPARSE_COLNAMESupdater   r   RuntimeWarningr?   Zcan_share_in_memory_db)rD   rK   r   rF   r#   r#   r$   get_connection_params   s"    	

z%DatabaseWrapper.get_connection_paramsc             C   s   t  j |   } | j d d t  | j d d t  | j d d t  | j d d t  | j d d t  | j d d t  | j d	 d t	  | j d
 d t
  | j d d t  | j d d t  | j d d t  | S)NZdjango_date_extract   Zdjango_date_truncZdjango_datetime_cast_dateZdjango_datetime_extract   Zdjango_datetime_truncZdjango_time_extractZdjango_time_diffZdjango_timestamp_diffregexpZdjango_format_dtdeltaZdjango_power)rM   connectZcreate_function_sqlite_date_extract_sqlite_date_trunc_sqlite_datetime_cast_date_sqlite_datetime_extract_sqlite_datetime_trunc_sqlite_time_extract_sqlite_time_diff_sqlite_timestamp_diff_sqlite_regexp_sqlite_format_dtdelta_sqlite_power)rD   Zconn_paramsconnr#   r#   r$   get_new_connection   s    z"DatabaseWrapper.get_new_connectionc             C   s   d  S)Nr#   )rD   r#   r#   r$   init_connection_state   s    z%DatabaseWrapper.init_connection_statec             C   s   |  j  j d t  S)Nfactory)
connectioncursorSQLiteCursorWrapper)rD   r#   r#   r$   create_cursor   s    zDatabaseWrapper.create_cursorc             C   s4   |  j    |  j |  j d  s0 t j |   n  d  S)NrH   )Zvalidate_thread_sharingis_in_memory_dbrK   r   close)rD   r#   r#   r$   ri      s    
zDatabaseWrapper.closec             C   s   |  j  j o |  j S)N)r?   Zuses_savepointsZin_atomic_block)rD   r#   r#   r$   _savepoint_allowed   s    
z"DatabaseWrapper._savepoint_allowedc          	   C   s5   | r d  } n d } |  j   | |  j _ Wd  QXd  S)N )Zwrap_database_errorsrd   Zisolation_level)rD   Z
autocommitlevelr#   r#   r$   _set_autocommit   s
    	
zDatabaseWrapper._set_autocommitNc       
      C   s  |  j    } | d k r- |  j j |  } n  x | D] } |  j j | |  } | s[ q4 n  |  j j | |  } x | D] \ } } } | j d | | | | | | | | f  xD | j   D]6 }	 t j d | |	 d | | |	 d | | f   q Wqw Wq4 Wd S)a  
        Checks each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.

        Raises an IntegrityError on the first invalid foreign key reference
        encountered (if any) and provides detailed information about the
        invalid reference in the error message.

        Backends can override this method if they can more directly apply
        constraint checking (e.g. via "SET CONSTRAINTS ALL IMMEDIATE")
        Na  
                    SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING
                    LEFT JOIN `%s` as REFERRED
                    ON (REFERRING.`%s` = REFERRED.`%s`)
                    WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL
                    zThe row in table '%s' with primary key '%s' has an invalid foreign key: %s.%s contains a value '%s' that does not have a corresponding value in %s.%s.r   r   )	re   rC   table_namesZget_primary_key_columnZget_key_columnsexecuteZfetchallr   IntegrityError)
rD   rn   re   Z
table_nameZprimary_key_column_nameZkey_columnsZcolumn_nameZreferenced_table_nameZreferenced_column_nameZbad_rowr#   r#   r$   check_constraints  s&    		z!DatabaseWrapper.check_constraintsc             C   s   d S)NTr#   )rD   r#   r#   r$   	is_usable4  s    zDatabaseWrapper.is_usablec             C   s   |  j    j d  d S)z
        Start a transaction explicitly in autocommit mode.

        Staying in autocommit mode works around a bug of sqlite3 that breaks
        savepoints when autocommit is disabled.
        ZBEGINN)re   ro   )rD   r#   r#   r$   #_start_transaction_under_autocommit7  s    z3DatabaseWrapper._start_transaction_under_autocommitc             C   s   | d k p d t  |  k S)Nz:memory:zmode=memory)r   )rD   namer#   r#   r$   rh   @  s    zDatabaseWrapper.is_in_memory_db)__name__
__module____qualname__vendorZ
data_typesZdata_types_suffixZ	operatorsZpattern_escZpattern_opsrM   r   ZSchemaEditorClassr>   rP   ra   rb   rg   ri   rj   rm   rq   rr   rs   rh   r#   r#   )rG   r$   r2   Y   s   




/	r2   z(?<!%)%sc               @   s=   e  Z d  Z d Z d d d  Z d d   Z d d   Z d S)	rf   z
    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style.
    This fixes it -- but note that if you want to use a literal "%s" in a query,
    you'll need to use "%%s".
    Nc             C   sD   | d  k r t  j j |  |  S|  j |  } t  j j |  | |  S)N)rM   Cursorro   convert_query)rD   queryparamsr#   r#   r$   ro   M  s    zSQLiteCursorWrapper.executec             C   s%   |  j  |  } t j j |  | |  S)N)rz   rM   ry   executemany)rD   r{   Z
param_listr#   r#   r$   r}   S  s    zSQLiteCursorWrapper.executemanyc             C   s   t  j d |  j d d  S)N?z%%%)FORMAT_QMARK_REGEXsubr   )rD   r{   r#   r#   r$   rz   W  s    z!SQLiteCursorWrapper.convert_query)ru   rv   rw   __doc__ro   r}   rz   r#   r#   r#   r$   rf   G  s   rf   c             C   sq   | d  k r d  Sy t  j |  } Wn t t f k
 rA d  SYn X|  d k r` | j   d d St | |   Sd  S)Nweek_day   r   )backend_utilstypecast_timestamp
ValueError	TypeError
isoweekdaygetattr)lookup_typedtr#   r#   r$   rU   [  s    	rU   c             C   s   y t  j |  } Wn t t f k
 r1 d  SYn X|  d k rI d | j S|  d k ri d | j | j f S|  d k r d | j | j | j f Sd  S)Nyearz%i-01-01monthz
%i-%02i-01dayz%i-%02i-%02i)r   r   r   r   r   r   r   )r   r   r#   r#   r$   rV   h  s    	rV   c             C   sp   |  d  k r d  Sy t  j |   }  Wn t t f k
 rA d  SYn X| d  k	 rl t j |  t j |   }  n  |  S)N)r   r   r   r   r   	localtimepytz)r   tznamer#   r#   r$   _sqlite_datetime_parseu  s    	r   c             C   s/   t  |  |  }  |  d  k r d  S|  j   j   S)N)r   r.   r    )r   r   r#   r#   r$   rW     s    rW   c             C   sN   t  | |  } | d  k r d  S|  d k r= | j   d d St | |   Sd  S)Nr   r   r   )r   r   r   )r   r   r   r#   r#   r$   rX     s    rX   c             C   s  t  | |  } | d  k r d  S|  d k r6 d | j S|  d k rV d | j | j f S|  d k r| d | j | j | j f S|  d k r d | j | j | j | j f S|  d	 k r d
 | j | j | j | j | j f S|  d k rd | j | j | j | j | j | j f Sd  S)Nr   z%i-01-01 00:00:00r   z%i-%02i-01 00:00:00r   z%i-%02i-%02i 00:00:00hourz%i-%02i-%02i %02i:00:00minutez%i-%02i-%02i %02i:%02i:00secondz%i-%02i-%02i %02i:%02i:%02i)r   r   r   r   r   r   r   )r   r   r   r#   r#   r$   rY     s     &rY   c             C   sO   | d  k r d  Sy t  j |  } Wn t t f k
 rA d  SYn Xt | |   S)N)r   typecast_timer   r   r   )r   r   r#   r#   r$   rZ     s    	rZ   c             C   s  y t  | t j  r: t t j |  t j d   } n  t |  } | d k rd t j |  } n  t  | t j  r t t j |  t j d   } n  t |  } | d k r t j |  } n  |  j	   d k r | | } n
 | | } Wn t
 t f k
 rd SYn Xt |  S)z
    LHS and RHS can be either:
        - An integer number of microseconds
        - A string representing a timedelta object
        - A string representing a datetime
    i@B N+)
isinstancer   integer_typesr!   r1   Decimalr   r   r   stripr   r   )r`   lhsrhsZreal_lhsZreal_rhsoutr#   r#   r$   r^     s"    %%	r^   c             C   s   t  j |   } t  j |  } | j d d d | j d d | j d | j | j d d d | j d d | j d | j S)N<   i@B )r   r   r   r   r   microsecond)r   r   leftrightr#   r#   r$   r[     s    `r[   c             C   s0   t  j |   } t  j |  } | | j   d S)Ni@B )r   r   total_seconds)r   r   r   r   r#   r#   r$   r\     s    r\   c             C   s,   | d  k	 r( t  t j |  t |    Sd S)NF)r+   researchr   )Z
re_patternZ	re_stringr#   r#   r$   r]     s    r]   c             C   s   |  | S)Nr#   )xyr#   r#   r$   r_     s    r_   )Pr   
__future__r   r/   r1   r   r   Zdjango.confr   Z	django.dbr   Zdjango.db.backendsr   Zdjango.db.backends.base.baser   Z"django.db.backends.base.validationr   Zdjango.utilsr   r   Zdjango.utils.dateparser	   r
   r   r   Zdjango.utils.deprecationr   Zdjango.utils.encodingr   Zdjango.utils.safestringr   r   ImportErrorZ	pysqlite2r   rM   Zsqlite3excrL   r   rA   r   rB   r   r?   r   rC   r   Z
operationsr   Zschemar   ZDatabaseErrorrp   r%   r*   Zregister_converterr!   Ztypecast_decimalZregister_adapterr   Zrev_typecast_decimalPY2r2   compiler   ry   rf   rU   rV   r   rW   rX   rY   rZ   r^   r[   r\   r]   r_   r#   r#   r#   r$   <module>   s   "#		"	

