
 Xa                 @   s  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 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 m Z d d	 l m Z d d
 l m Z d d l m Z m Z d d l m Z d d   Z e d- d. g  y d d l Z WnE e  k
 rm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 l, m- Z- d d l. m/ Z/ d d l m0 Z0 m1 Z1 e j2 Z2 e j3 Z3 Gd d   d e4  Z5 Gd d    d  e  Z6 Gd! d"   d" e4  Z7 Gd# d$   d$ e4  Z8 Gd% d&   d& e4  Z9 Gd' d(   d( e j:  Z; d) d*   Z< d+ d,   Z= d S)/z\
Oracle database backend for Django.

Requires cx_Oracle: http://cx-oracle.sourceforge.net/
    )unicode_literalsN)settings)utils)BaseDatabaseWrapper)BaseDatabaseValidation)sixtimezone)RemovedInDjango20Warning)duration_string)force_bytes
force_text)cached_propertyc             C   s   t  j   j   j d  r y d d  l } WnE t k
 rr } z% d d l m } | d |   WYd  d  } ~ Xn X| j d  } x7 |  D] \ } } | j	 | |  q Wn t
 j j |   d  S)NZCYGWINr   )ImproperlyConfiguredz_Error loading ctypes: %s; the Oracle backend requires ctypes to operate correctly under Cygwin.kernel32)platformsystemupper
startswithctypesImportErrordjango.core.exceptionsr   CDLLZSetEnvironmentVariableAosenvironupdate)r   r   er   r   namevalue r   L/home/ubuntu/projects/ifolica/build/django/django/db/backends/oracle/base.py_setup_environment   s    r    NLS_LANG.UTF8ORA_NCHAR_LITERAL_REPLACETRUE)r   z"Error loading cx_Oracle module: %s   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)Oracle_datetimeconvert_unicodec               @   s   e  Z d  Z d d d  Z d S)!_UninitializedOperatorsDescriptorNc             C   s6   | d  k r t  d   n  | j   j   | j d S)Nz*operators not available as class attribute	operators)AttributeErrorcursorclose__dict__)selfinstanceclsr   r   r   __get__I   s    z)_UninitializedOperatorsDescriptor.__get__)__name__
__module____qualname__r7   r   r   r   r   r.   G   s   r.   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) 6d* d+ 6Z i d, d	 6d- d  6d. d" 6d. d# 6Z e   Z i d/ d0 6d1 d2 6d3 d4 6d5 d6 6d7 d8 6d9 d: 6d; d< 6d= d> 6d3 d? 6d3 d@ 6d5 dA 6d5 dB 6Z e j	   Z
 e
 j i dC d4 6dD d6 6dC d? 6dC d@ 6dD dA 6dD dB 6 dE Z i dF d4 6dG d6 6dH d? 6dI dA 6dJ d@ 6dK dB 6Z dL dM   e j   D Z dN dM   e j   D Z e Z e Z   f dO dP   Z dQ dR   Z dS dT   Z dU dV   Z dW dX   Z dY dZ   Z d[ d\   Z d] d^   Z d_ d`   Z da db dc  Z dd de   Z e df dg    Z  e dh di    Z!   S)jDatabaseWrapperZoraclez
NUMBER(11)Z	AutoFieldz
NUMBER(19)ZBigAutoFieldZBLOBZBinaryFieldz	NUMBER(1)ZBooleanFieldzNVARCHAR2(%(max_length)s)Z	CharFieldzVARCHAR2(%(max_length)s)ZCommaSeparatedIntegerFieldZDATEZ	DateFieldZ	TIMESTAMPZDateTimeFieldz*NUMBER(%(max_digits)s, %(decimal_places)s)ZDecimalFieldzINTERVAL DAY(9) TO SECOND(6)ZDurationFieldZ	FileFieldZFilePathFieldzDOUBLE PRECISIONZ
FloatFieldZIntegerFieldZBigIntegerFieldzVARCHAR2(15)ZIPAddressFieldzVARCHAR2(39)ZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldZ	SlugFieldZSmallIntegerFieldZNCLOBZ	TextFieldZ	TimeFieldZURLFieldzVARCHAR2(32)Z	UUIDFieldz%(qn_column)s IN (0,1)z3(%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL)z%(qn_column)s >= 0z= %sexactz= UPPER(%s)ZiexactzFLIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)containszMLIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) ESCAPE TRANSLATE('\' USING NCHAR_CS)Z	icontainsz> %sgtz>= %sZgtez< %sltz<= %sZlter   endswithZistartswithZ	iendswithzLIKEC %s ESCAPE '\'zLIKEC UPPER(%s) ESCAPE '\'z@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z'%%' || {} || '%%'z'%%' || UPPER({}) || '%%'z
{} || '%%'zUPPER({}) || '%%'z
'%%' || {}z'%%' || UPPER({})c             C   s'   i  |  ] \ } } d  | d |  q S)zLIKE TRANSLATE( z5 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)r   ).0kvr   r   r   
<dictcomp>   s   	zDatabaseWrapper.<dictcomp>c             C   s'   i  |  ] \ } } d  | d |  q S)zLIKEC z ESCAPE '\'r   )rA   rB   rC   r   r   r   rD      s   	c                s   t  t |   j | |   t |   |  _ |  j d j d d  } | |  j _ t |   |  _	 t
 |   |  _ t |   |  _ t |   |  _ t |   |  _ d  S)NOPTIONSuse_returning_intoT)superr;   __init__r(   featuressettings_dictgetZcan_return_id_from_insertr*   opsr&   clientr'   creationr)   introspectionr   Z
validation)r4   argskwargsrF   )	__class__r   r   rH      s    zDatabaseWrapper.__init__c             C   s   |  j  } | d j   s& d | d <n  | d j   r` t j | d t | d  | d  } n
 | d } d | d | d | f S)NZHOST	localhostZPORTNAMEz%s/%s@%sUSERZPASSWORD)rJ   stripDatabaseZmakedsnint)r4   rJ   Zdsnr   r   r   _connect_string   s    	

zDatabaseWrapper._connect_stringc             C   s-   |  j  d j   } d | k r) | d =n  | S)NrE   rF   )rJ   copy)r4   conn_paramsr   r   r   get_connection_params   s    
z%DatabaseWrapper.get_connection_paramsc             C   s"   t  |  j    } t j | |  S)N)r-   rY   rW   connect)r4   r[   Zconn_stringr   r   r   get_new_connection   s    z"DatabaseWrapper.get_new_connectionc             C   s  |  j    } | j d  | j d t j r1 d n d  | j   d |  j k r |  j    } y" | j d |  j d d g  Wn* t k
 r |  j |  _	 |  j
 |  _ Yn X|  j |  _	 |  j |  _ | j   n  y d	 |  j _ Wn t k
 r Yn X|  j   s|  j   n  d  S)
Nz+ALTER SESSION SET NLS_TERRITORY = 'AMERICA'zmALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'z TIME_ZONE = 'UTC' r/   z!SELECT 1 FROM DUAL WHERE DUMMY %sr=   X   )create_cursorexecuter   USE_TZr2   r3   _standard_operatorsDatabaseError_likec_operatorsr/   _likec_pattern_opsZpattern_ops_standard_pattern_ops
connectionZstmtcachesizer0   Zget_autocommitcommit)r4   r1   r   r   r   init_connection_state   s0    
	z%DatabaseWrapper.init_connection_statec             C   s   t  |  j  S)N)FormatStylePlaceholderCursorrj   )r4   r   r   r   rb     s    zDatabaseWrapper.create_cursorc             C   s   |  j  d  k	 r y |  j  j   SWq t j k
 r } z | j d } t | d  r t | d  r | j d k r d | j k r t j	 t
 j t
 j t | j    t j   d  n    WYd  d  } ~ Xq Xn  d  S)Nr   codemessagei+  z	ORA-02291   )rj   rk   rW   rf   rP   hasattrrn   ro   r   reraiser   IntegrityErrortuplesysexc_info)r4   r   xr   r   r   _commit  s    5zDatabaseWrapper._commitc             C   s>   |  j  r: |  j j i d |  j j |  d 6d d 6 n  d  S)Nz-- RELEASE SAVEPOINT %s (faked)Zsqlz0.000time)Zqueries_loggedZqueries_logappendrL   Z
quote_name)r4   Zsidr   r   r   _savepoint_commit  s    	z!DatabaseWrapper._savepoint_commitc          	   C   s    |  j   | |  j _ Wd  QXd  S)N)Zwrap_database_errorsrj   
autocommit)r4   r|   r   r   r   _set_autocommit&  s    
zDatabaseWrapper._set_autocommitNc             C   s*   |  j    j d  |  j    j d  d S)z
        To check constraints, we set constraints to immediate. Then, when, we're done we must ensure they
        are returned to deferred.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r1   rc   )r4   Ztable_namesr   r   r   check_constraints*  s    z!DatabaseWrapper.check_constraintsc             C   s5   y |  j  j   Wn t j k
 r, d SYn Xd Sd  S)NFT)rj   ZpingrW   Error)r4   r   r   r   	is_usable2  s
    	zDatabaseWrapper.is_usablec             C   s!   |  j     |  j j SWd  QXd  S)N)Ztemporary_connectionrj   version)r4   r   r   r   oracle_full_version:  s    z#DatabaseWrapper.oracle_full_versionc             C   s;   y t  |  j j d  d  SWn t k
 r6 d  SYn Xd  S)N.r   )rX   r   split
ValueError)r4   r   r   r   oracle_version?  s    zDatabaseWrapper.oracle_version)"r8   r9   r:   vendorZ
data_typesZdata_type_check_constraintsr.   r/   re   rZ   rg   r   Zpattern_escZ_pattern_opsitemsri   rh   rW   r+   ZSchemaEditorClassrH   rY   r\   r^   rl   rb   rx   r{   r}   r~   r   r   r   r   r   r   )rR   r   r;   T   s   

	
	
		.r;   c               @   s%   e  Z d  Z d Z d d d  Z d S)OracleParama  
    Wrapper object for formatting parameters for Oracle. If the string
    representation of the value is large enough (greater than 4000 characters)
    the input size needs to be set as CLOB. Alternatively, if the parameter
    has an `input_size` attribute, then the value of the `input_size` attribute
    will be used instead. Otherwise, no input size will be set for the
    parameter when executing the query.
    Fc             C   s  t  j r} t | t j  r} t | t  r} t j |  rk t j d t	  | j
 t j  j d d   } n  t j |  } n  t | t j  r t |  } d | k r d | } q n  d } | d k r d } n | d k r d } n  t | d	  r| j |  |  _ ni t | t j  r)| |  _ nK t | | j |  |  _ t |  j t j  rtt t | | j |   } n  t | d
  r| j |  _ n$ | d k rt j |  _ n	 d  |  _ d  S)NzThe Oracle 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 z0 r   Tr%   Fbind_parameter
input_sizei  )r   rd   
isinstancedatetimer,   r   Zis_awarewarningswarnr	   
astimezoneutcreplaceZfrom_datetime	timedeltar
   rq   r   r   rW   Binaryr-   charsetr   string_typeslenr   ZCLOB)r4   paramr1   Zstrings_onlyZstring_sizer   r   r   rH   Q  s:    !		zOracleParam.__init__N)r8   r9   r:   __doc__rH   r   r   r   r   r   G  s   r   c               @   sF   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 S)VariableWrappera	  
    An adapter class for cursor variables that prevents the wrapped object
    from being converted into a string when used to instantiate an OracleParam.
    This can be used generally for any other object that should be passed into
    Cursor.execute as-is.
    c             C   s   | |  _  d  S)N)var)r4   r   r   r   r   rH     s    zVariableWrapper.__init__c             C   s   |  j  S)N)r   )r4   r1   r   r   r   r     s    zVariableWrapper.bind_parameterc             C   s   t  |  j |  S)N)getattrr   )r4   keyr   r   r   __getattr__  s    zVariableWrapper.__getattr__c             C   s3   | d k r | |  j  | <n t |  j | |  d  S)Nr   )r3   setattrr   )r4   r   r   r   r   r   __setattr__  s    zVariableWrapper.__setattr__N)r8   r9   r:   r   rH   r   r   r   r   r   r   r   r     s
   r   c               @   s   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z	 d d d  Z
 d d d  Z d d   Z d d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d S)"rm   aF  
    Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var"
    style. This fixes it -- but note that if you want to use a literal "%s" in
    a query, you'll need to use "%%s".

    We also do automatic conversion between Unicode on the Python side and
    UTF-8 -- for talking to Oracle -- in here.
    zutf-8c             C   s+   | j    |  _  d |  j  _ d |  j  _ d  S)NTd   )r1   ZnumbersAsStrings	arraysize)r4   rj   r   r   r   rH     s    z%FormatStylePlaceholderCursor.__init__c                sW   y!   f d d   | j    D SWn/ t k
 rR t   f d d   | D  SYn Xd  S)Nc                s+   i  |  ]! \ } } t  |   d   |  q S)T)r   )rA   rB   rC   )r4   r   r   rD     s   	 z?FormatStylePlaceholderCursor._format_params.<locals>.<dictcomp>c             3   s!   |  ] } t  |   d   Vq d S)TN)r   )rA   p)r4   r   r   	<genexpr>  s    z>FormatStylePlaceholderCursor._format_params.<locals>.<genexpr>)r   r0   rt   )r4   paramsr   )r4   r   _format_params  s    !z+FormatStylePlaceholderCursor._format_paramsc             C   s   t  | d d  rp i  } xD | D]< } x3 | j   D]% \ } } | j r3 | j | | <q3 q3 Wq  W|  j |   nk d  g t | d  } xD | D]< } x3 t |  D]% \ } } | j r | j | | <q q Wq W|  j |   d  S)Nr   keys)rq   r   r   Zsetinputsizesr   	enumerate)r4   Zparams_listZsizesr   rB   r   ir   r   r   _guess_input_sizes  s    		z/FormatStylePlaceholderCursor._guess_input_sizesc             C   s;   t  | d  r& d d   | j   D Sd d   | D Sd  S)Nr   c             S   s"   i  |  ] \ } } | j  |  q Sr   )r   )rA   rB   rC   r   r   r   rD     s   	 zAFormatStylePlaceholderCursor._param_generator.<locals>.<dictcomp>c             S   s   g  |  ] } | j   q Sr   )r   )rA   r   r   r   r   
<listcomp>  s   	 zAFormatStylePlaceholderCursor._param_generator.<locals>.<listcomp>)rq   r   )r4   r   r   r   r   _param_generator  s    z-FormatStylePlaceholderCursor._param_generatorc             C   s   | j  d  s | j  d  r1 | d  d	  } n  | d  k rX g  } t | |  j  } n| t | d  r d d   | j   D } t | | |  j  } n; d d   t t |   D } t | t |  |  j  } | |  j |  f S)
N;/r%   r   c             S   s   i  |  ] } d  | |  q S)z:%sr   )rA   rB   r   r   r   rD     s   	 z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>c             S   s   g  |  ] } d  |  q S)z:arg%dr   )rA   r   r   r   r   r     s   	 z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>)	r@   r-   r   rq   r   ranger   rt   r   )r4   queryr   rP   r   r   r   _fix_for_params  s    z,FormatStylePlaceholderCursor._fix_for_paramsNc             C   s   |  j  | |  \ } } |  j | g  y  |  j j | |  j |   SWn t j k
 r } zy t | j d d  r | j d j	 d k r t
 | t  r t j t j t j t | j    t j   d  n    WYd  d  } ~ Xn Xd  S)Nr   rn   ix  rp   )r   r   r1   rc   r   rW   rf   rq   rP   rn   r   rs   r   rr   r   rt   ru   rv   )r4   r   r   r   r   r   r   rc     s     <5z$FormatStylePlaceholderCursor.executec                s.  | s
 d  St  |  }   j | t |   \ } } | g   f d d   | D }   j |  y*   j j |   f d d   | D  SWn t j k
 r)} zy t | j	 d d  r| j	 d j
 d k rt | t  rt j t j t j t | j	    t j   d  n    WYd  d  } ~ Xn Xd  S)Nc                s   g  |  ] }   j  |   q Sr   )r   )rA   r   )r4   r   r   r     s   	 z<FormatStylePlaceholderCursor.executemany.<locals>.<listcomp>c                s   g  |  ] }   j  |   q Sr   )r   )rA   r   )r4   r   r   r     s   	 r   rn   ix  rp   )iterr   nextr   r1   executemanyrW   rf   rq   rP   rn   r   rs   r   rr   r   rt   ru   rv   )r4   r   r   Zparams_iterZfirstparams	formattedr   r   )r4   r   r     s     *<5z(FormatStylePlaceholderCursor.executemanyc             C   s/   |  j  j   } | d  k r | St | |  j   S)N)r1   fetchone_rowfactory)r4   rowr   r   r   r     s    z%FormatStylePlaceholderCursor.fetchonec                sA   | d  k r   j  } n  t   f d d     j j |  D  S)Nc             3   s!   |  ] } t  |   j  Vq d  S)N)r   r1   )rA   r)r4   r   r   r     s    z9FormatStylePlaceholderCursor.fetchmany.<locals>.<genexpr>)r   rt   r1   	fetchmany)r4   sizer   )r4   r   r     s    z&FormatStylePlaceholderCursor.fetchmanyc                s&   t    f d d     j j   D  S)Nc             3   s!   |  ] } t  |   j  Vq d  S)N)r   r1   )rA   r   )r4   r   r   r     s    z8FormatStylePlaceholderCursor.fetchall.<locals>.<genexpr>)rt   r1   fetchall)r4   r   )r4   r   r     s    z%FormatStylePlaceholderCursor.fetchallc             C   s-   y |  j  j   Wn t j k
 r( Yn Xd  S)N)r1   r2   rW   ZInterfaceError)r4   r   r   r   r2   	  s    z"FormatStylePlaceholderCursor.closec             G   s   t  |  j j |    S)N)r   r1   r   )r4   rP   r   r   r   r     s    z FormatStylePlaceholderCursor.varc             G   s   t  |  j j |    S)N)r   r1   arrayvar)r4   rP   r   r   r   r     s    z%FormatStylePlaceholderCursor.arrayvarc             C   s.   | |  j  k r |  j  | St |  j |  Sd  S)N)r3   r   r1   )r4   attrr   r   r   r     s    z(FormatStylePlaceholderCursor.__getattr__c             C   s   t  |  j  S)N)CursorIteratorr1   )r4   r   r   r   __iter__  s    z%FormatStylePlaceholderCursor.__iter__)r8   r9   r:   r   r   rH   r   r   r   r   rc   r   r   r   r   r2   r   r   r   r   r   r   r   r   rm     s"   rm   c               @   s:   e  Z d  Z d Z d d   Z d d   Z d d   Z d S)	r   zF
    Cursor iterator wrapper that invokes our custom row factory.
    c             C   s   | |  _  t |  |  _ d  S)N)r1   r   )r4   r1   r   r   r   rH   %  s    	zCursorIterator.__init__c             C   s   |  S)Nr   )r4   r   r   r   r   )  s    zCursorIterator.__iter__c             C   s   t  t |  j  |  j  S)N)r   r   r   r1   )r4   r   r   r   __next__,  s    zCursorIterator.__next__N)r8   r9   r:   r   rH   r   r   r   r   r   r   r      s   r   c             C   s`  g  } xMt  |  | j  D]9\ } } | d  k	 r| d t j k r| d d  \ } } | d k r | d k r d | k r t j |  } q t |  } qt |  } qE| d k r | d k r t |  } qt j |  } qEd | k rt j |  } qEt |  } n1 | d t j t j	 t j
 f k rEt |  } n  | j |  q Wt |  S)Nr%            r   r   i)zipdescriptionrW   NUMBERdecimalZDecimalrX   floatSTRINGZ
FIXED_CHARZLONG_STRING
to_unicoderz   rt   )r   r1   Zcastedr   descZ	precisionZscaler   r   r   r   0  s,    r   c             C   s    t  |  t j  r t |   S|  S)z]
    Convert strings to Unicode objects (and return all other data types
    unchanged).
    )r   r   r   r   )sr   r   r   r   Y  s    
r   )r!   r"   )r#   zTRUE)>r   
__future__r   r   r   r   r   ru   r   Zdjango.confr   Z	django.dbr   Zdjango.db.backends.base.baser   Z"django.db.backends.base.validationr   Zdjango.utilsr   r   Zdjango.utils.deprecationr	   Zdjango.utils.durationr
   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   r    Z	cx_OraclerW   r   r   r   r   rM   r&   rN   r'   rI   r(   rO   r)   Z
operationsr*   Zschemar+   r,   r-   rf   rs   objectr.   r;   r   r   rm   Iteratorr   r   r   r   r   r   r   <module>   sT   
#		9)