ó
ø¢TQc           @  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 „  Z e d d f d d f g ƒ y d d l Z	 Wn3 e
 k
 r° Z d d	 l m Z e d
 e ƒ ‚ n Xd d l m Z d d l m Z d d l Td 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  e	 j! Z! e	 j" Z" e# e	 j$ j% d d ƒ d ƒ d k oºe# e	 j$ j% d d ƒ d ƒ d k pºe& e	 d ƒ rÆe Z' n e Z' d e( f d „  ƒ  YZ) d e* f d „  ƒ  YZ+ d e, f d  „  ƒ  YZ- d! e. f d" „  ƒ  YZ/ d# e, f d$ „  ƒ  YZ0 d% e, f d& „  ƒ  YZ1 d' e, f d( „  ƒ  YZ2 d) e, f d* „  ƒ  YZ3 d+ e j4 f d, „  ƒ  YZ5 d- „  Z6 d. „  Z7 d/ „  Z8 d S(0   u\   
Oracle database backend for Django.

Requires cx_Oracle: http://cx-oracle.sourceforge.net/
iÿÿÿÿ(   t   unicode_literalsNc   	      C  sÆ   d d  l  } | j ƒ  j ƒ  j d ƒ r¦ y d d  l } Wn3 t k
 rl } d d l m } | d | ƒ ‚ n X| j d ƒ } xC |  D] \ } } | j	 | | ƒ qƒ Wn d d  l
 } | j j |  ƒ d  S(   Niÿÿÿÿu   CYGWIN(   t   ImproperlyConfiguredu_   Error loading ctypes: %s; the Oracle backend requires ctypes to operate correctly under Cygwin.u   kernel32(   t   platformt   systemt   uppert
   startswitht   ctypest   ImportErrort   django.core.exceptionsR   t   CDLLt   SetEnvironmentVariableAt   ost   environt   update(	   R   R   R   t   eR   t   kernel32t   namet   valueR   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _setup_environment   s    u   NLS_LANGu   .UTF8u   ORA_NCHAR_LITERAL_REPLACEu   TRUE(   R   u"   Error loading cx_Oracle module: %s(   t   settings(   t   utils(   t   *(   t   connection_created(   t   DatabaseClient(   t   DatabaseCreation(   t   DatabaseIntrospection(   t   force_bytest
   force_text(   t   six(   t   timezoneu   .i   i    i   i   u   UNICODEt   DatabaseFeaturesc           B  sn   e  Z d  Z e Z e Z e Z e Z e Z	 e Z
 e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z RS(   (    (   t   __name__t
   __module__t   empty_fetchmany_valuet   Falset   needs_datetime_string_castt   Truet!   interprets_empty_strings_as_nullst   uses_savepointst   has_select_for_updatet   has_select_for_update_nowaitt   can_return_id_from_insertt   allow_sliced_subqueriest   supports_subqueries_in_group_byt   supports_transactionst   supports_timezonest   supports_bitwise_ort   can_defer_constraint_checkst#   ignores_nulls_in_unique_constraintst   has_bulk_insertt   supports_tablespacest   supports_sequence_reset(    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR   G   s"   t   DatabaseOperationsc           B  sg  e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  e! d „ Z" d  „  Z# d! „  Z$ d" „  Z% d# „  Z& d$ „  Z' d% „  Z( d& „  Z) RS('   u"   django.db.backends.oracle.compilerc   	      C  s`   |  j  | ƒ } |  j | ƒ } |  j | ƒ } |  j | ƒ } d t ƒ  } d t ƒ  } | | f S(   Nuð   
DECLARE
    i INTEGER;
BEGIN
    SELECT COUNT(*) INTO i FROM USER_CATALOG
        WHERE TABLE_NAME = '%(sq_name)s' AND TABLE_TYPE = 'SEQUENCE';
    IF i = 0 THEN
        EXECUTE IMMEDIATE 'CREATE SEQUENCE "%(sq_name)s"';
    END IF;
END;
/u×   
CREATE OR REPLACE TRIGGER "%(tr_name)s"
BEFORE INSERT ON %(tbl_name)s
FOR EACH ROW
WHEN (new.%(col_name)s IS NULL)
    BEGIN
        SELECT "%(sq_name)s".nextval
        INTO :new.%(col_name)s FROM dual;
    END;
/(   t   _get_sequence_namet   _get_trigger_namet
   quote_namet   locals(	   t   selft   tablet   columnt   sq_namet   tr_namet   tbl_namet   col_namet   sequence_sqlt   trigger_sql(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   autoinc_sql]   s    
c         C  s   d S(   Nu    
            SELECT cache_key
              FROM (SELECT cache_key, rank() OVER (ORDER BY cache_key) AS rank FROM %s)
             WHERE rank = %%s + 1
        (    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   cache_key_culling_sql{   s    c         C  s&   | d k r d | Sd | | f Sd  S(   Nu   week_dayu   TO_CHAR(%s, 'D')u   EXTRACT(%s FROM %s)(    (   R9   t   lookup_typet
   field_name(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   date_extract_sql‚   s    c   
   	   C  sq   t  | j d ƒ \ } } t  | d ƒ \ } } t | j ƒ } t | ƒ } d }	 |	 | | | | | | | j | f S(   u©   
        Implements the interval functionality for expressions
        format for Oracle:
        (datefield + INTERVAL '3 00:03:20.000000' DAY(1) TO SECOND(6))
        i<   u>   (%s %s INTERVAL '%s %02d:%02d:%02d.%06d' DAY(%d) TO SECOND(6))(   t   divmodt   secondst   strt   dayst   lent   microseconds(
   R9   t   sqlt	   connectort	   timedeltat   minutesRH   t   hoursRJ   t   day_precisiont   fmt(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   date_interval_sqlŠ   s    c         C  s-   | d k r d | } n d | | f } | S(   Nu   dayu	   TRUNC(%s)u   TRUNC(%s, '%s')(    (   R9   RD   RE   RM   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   date_trunc_sql˜   s    c         C  s  t  | t j ƒ rH | j ƒ  } | rH | j ƒ  d k rH t | ƒ } qH n  | d  k rl | rl | j rl d } n¡| d k rŸ | rŸ | j ƒ  d k rŸ t | ƒ } nn| d  k	 rÒ | rÒ | j ƒ  d k rÒ t	 | ƒ } n;| d  k	 r| r| j ƒ  d k rt
 j | j | ƒ ƒ } nü t  | t j ƒ r| r>| j ƒ  d	 k r>q| re| j ƒ  d
 k re| j ƒ  } q| r}| j ƒ  d k s®| j d k r½| j | j k o©d k n r½| j ƒ  } q| j | j k oö| j k oö| j k oöd k n r| j ƒ  } qn  | S(   Nu	   TextFieldu    i   i    u   BooleanFieldu   NullBooleanFieldu
   FloatFieldu   DecimalFieldu   DateTimeFieldu	   DateFieldu	   TimeFieldil  (   i   i    (   u   BooleanFieldu   NullBooleanField(   t
   isinstancet   Databaset   LOBt   readt   get_internal_typeR   t   Nonet   empty_strings_allowedt   boolt   floatt   utilt   typecast_decimalt   format_numbert	   Timestampt   datet   yeart   montht   dayt   timet   hourt   minutet   secondt   microsecond(   R9   R   t   field(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   convert_values¡   s,    	$$$I>c         C  s   d S(   Nu,   TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')(    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   datetime_cast_sqlË   s    c         C  s   d S(   Nu    DEFERRABLE INITIALLY DEFERRED(    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   deferrable_sqlÎ   s    c         C  s   d |  j  |  j | ƒ ƒ S(   Nu   DROP SEQUENCE %s;(   R7   R5   (   R9   R:   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   drop_sequence_sqlÑ   s    c         C  s   t  | j j ƒ  ƒ S(   N(   t   intt   _insert_id_vart   getvalue(   R9   t   cursor(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   fetch_returned_insert_idÔ   s    c         C  s!   | r | j  d ƒ r d Sd Sd  S(   Nu   LOBu   DBMS_LOB.SUBSTR(%s)u   %s(   t   endswith(   R9   t   db_type(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   field_cast_sql×   s    c         C  s=   t  j r | j S| j } t | t ƒ r, | S| j d ƒ Sd  S(   Nu   utf-8(   R   t   PY3t	   statementRV   t   unicodet   decode(   R9   Rt   RM   t   paramst   query(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   last_executed_queryÝ   s    		c         C  s.   |  j  | ƒ } | j d | ƒ | j ƒ  d S(   Nu   SELECT "%s".currval FROM duali    (   R5   t   executet   fetchone(   R9   Rt   t
   table_namet   pk_nameR<   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   last_insert_idæ   s    c         C  s   | d k r d Sd S(   Nu   iexactu	   icontainsu   istartswithu	   iendswithu	   UPPER(%s)u   %s(   u   iexactu	   icontainsu   istartswithu	   iendswith(    (   R9   RD   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   lookup_castë   s    c         C  s   d S(   Niè  (    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   max_in_list_sizeð   s    c         C  s   d S(   Ni   (    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   max_name_lengthó   s    c         C  s   | S(   N(    (   R9   t   x(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   prep_for_iexact_queryö   s    c         C  s    | d  k r d St | j ƒ  ƒ S(   Nu    (   R[   R   RY   (   R9   R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   process_clobù   s    c         C  sa   | j  d ƒ rE | j d ƒ rE d t j | j ƒ  |  j ƒ  ƒ } n  | j d d ƒ } | j ƒ  S(   Nu   "u   "%s"u   %u   %%(   R   Rv   R_   t   truncate_nameR   R‡   t   replace(   R9   R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR7   þ   s
     c         C  s   d S(   Nu   DBMS_RANDOM.RANDOM(    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   random_function_sql  s    c         C  s   t  d ƒ ‚ d  S(   Nu7   Regexes are not supported in Oracle before version 10g.(   t   NotImplementedError(   R9   RD   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   regex_lookup_9  s    c         C  s#   | d k r d } n d } d | S(   Nu   regexu   'c'u   'i'u   REGEXP_LIKE(%%s, %%s, %s)(    (   R9   RD   t   match_option(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   regex_lookup_10  s    	c         C  s    |  j  j ƒ  |  j  j j | ƒ S(   N(   t
   connectionRt   t   opst   regex_lookup(   R9   RD   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR”     s    c         C  s   d t  ƒ  f f S(   Nu   RETURNING %s INTO %%s(   t   InsertIdVar(   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   return_insert_id  s    c         C  s   t  d |  j | ƒ ƒ S(   Nu
   SAVEPOINT (   t   convert_unicodeR7   (   R9   t   sid(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   savepoint_create_sql"  s    c         C  s   t  d |  j | ƒ ƒ S(   Nu   ROLLBACK TO SAVEPOINT (   R—   R7   (   R9   R˜   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   savepoint_rollback_sql%  s    c         C  su   | rm g  | D]= } d | j  d ƒ | j  d ƒ | j |  j | ƒ ƒ f ^ q } | j |  j | | ƒ ƒ | Sg  Sd  S(   Nu	   %s %s %s;u   DELETEu   FROM(   t   SQL_KEYWORDt	   SQL_FIELDR7   t   extendt   sequence_reset_by_name_sql(   R9   t   stylet   tablest	   sequencesR:   RM   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt	   sql_flush(  s    Gc   	      C  s‰   g  } x| | D]t } |  j  | d ƒ } |  j | d ƒ } |  j | d pL d ƒ } t ƒ  i | d 6| d 6| d 6} | j | ƒ q W| S(   Nu   tableu   columnu   idu   sequence(   R5   R7   t   _get_sequence_reset_sqlt   append(	   R9   RŸ   R¡   RM   t   sequence_infot   sequence_nameR‚   t   column_nameR~   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRž   :  s    c         C  sH  d d l  m } g  } t ƒ  } x"| D]} xŒ | j j D]~ } t | | j ƒ r9 |  j | j j ƒ } |  j	 | j j ƒ }	 |  j | j
 ƒ }
 | j | i |	 d 6| d 6|
 d 6ƒ Pq9 q9 Wx‚ | j j D]t } | j j sÈ |  j | j ƒ  ƒ } |  j	 | j ƒ  ƒ }	 |  j d ƒ }
 | j | i |	 d 6| d 6|
 d 6ƒ qÈ qÈ Wq& W| S(   Niÿÿÿÿ(   t   modelsu   sequenceu   tableu   columnu   id(   t	   django.dbR¨   R£   t   _metat   local_fieldsRV   t	   AutoFieldR7   t   db_tableR5   R;   R¤   t   many_to_manyt   relt   throught   m2m_db_table(   R9   RŸ   t
   model_listR¨   t   outputR~   t   modelt   fR‚   R¦   R§   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   sequence_reset_sqlF  s,    	c         C  s   d S(   Nu    (    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   start_transaction_sql`  s    c         C  s,   | r d |  j  | ƒ Sd |  j  | ƒ Sd  S(   Nu   USING INDEX TABLESPACE %su   TABLESPACE %s(   R7   (   R9   t
   tablespacet   inline(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   tablespace_sqlc  s    c         C  se   | d  k r d  St j | ƒ rX t j rI | j t j ƒ j d d  ƒ } qX t d ƒ ‚ n  t	 j
 | ƒ S(   Nt   tzinfouN   Oracle backend does not support timezone-aware datetimes when USE_TZ is False.(   R[   R   t   is_awareR   t   USE_TZt
   astimezonet   utcRŒ   t
   ValueErrorR   t	   text_type(   R9   R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   value_to_db_datetimei  s    	!c         C  s~   | d  k r d  St | t j ƒ r5 t j j | d ƒ St j | ƒ rS t d ƒ ‚ n  t j d d d | j	 | j
 | j | j ƒ S(   Nu   %H:%M:%Su5   Oracle backend does not support timezone-aware times.il  i   (   R[   RV   R   t   string_typest   datetimet   strptimeR   R¼   RÀ   Rh   Ri   Rj   Rk   (   R9   R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   value_to_db_timev  s    c         C  s   d } d } | | | | g S(   Nu   %s-01-01u   %s-12-31(    (   R9   R   t   firstRj   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt!   year_lookup_bounds_for_date_field„  s    c         C  sn   | d k r d d j  | ƒ S| d k r: d d j  | ƒ S| d k rU t d ƒ ‚ n  t t |  ƒ j | | ƒ S(   uI   Oracle requires special cases for %% and & operators in query expressionsu   %%u   MOD(%s)u   ,u   &u
   BITAND(%s)u   |u'   Bit-wise or is not supported in Oracle.(   t   joinRŽ   t   superR4   t   combine_expression(   R9   RN   t   sub_expressions(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRË   ‰  s    c         C  s*   |  j  ƒ  d } d t j | | ƒ j ƒ  S(   Ni   u   %s_SQ(   R‡   R_   R‹   R   (   R9   R:   t   name_length(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR5   “  s    c         C  s*   |  j  ƒ  d } d t j | | ƒ j ƒ  S(   Ni   u   %s_TR(   R‡   R_   R‹   R   (   R9   R:   RÍ   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR6   —  s    c         C  s4   d d j  d g t | ƒ ƒ } d j  | g | ƒ S(   Nu   SELECT %s FROM DUALu   , u   %su    UNION ALL (   RÉ   RK   (   R9   t   fieldst
   num_valuest	   items_sql(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   bulk_insert_sql›  s     (*   R   R    t   compiler_moduleRB   RC   RF   RT   RU   Rm   Rn   Ro   Rp   Ru   Rx   R   R„   R…   R†   R‡   R‰   RŠ   R7   R   R   R‘   R”   R–   R™   Rš   R¢   Rž   R¶   R·   R"   Rº   RÂ   RÆ   RÈ   RË   R5   R6   RÑ   (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR4   Z   sN   							*																													
		t!   _UninitializedOperatorsDescriptorc           B  s   e  Z d  „  Z RS(   c         C  s6   | d  k r t d ƒ ‚ n  | j ƒ  j ƒ  | j d S(   Nu*   operators not available as class attributeu	   operators(   R[   t   AttributeErrorRt   t   closet   __dict__(   R9   t   instancet   owner(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   __get__¢  s    (   R   R    RÙ   (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÓ      s   t   DatabaseWrapperc           B  sö   e  Z d  Z e ƒ  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 6Z e j ƒ  Z e j i d d 6d d 6d d 6d d 6d d 6d d 6ƒ d „  Z	 d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   u   oracleu   = %su   exactu   = UPPER(%s)u   iexactuF   LIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)u   containsuM   LIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) ESCAPE TRANSLATE('\' USING NCHAR_CS)u	   icontainsu   > %su   gtu   >= %su   gteu   < %su   ltu   <= %su   lteu
   startswithu   endswithu   istartswithu	   iendswithu   LIKEC %s ESCAPE '\'u   LIKEC UPPER(%s) ESCAPE '\'c         O  s¥   t  t |  ƒ j | | Ž  d  |  _ t |  ƒ |  _ |  j d j d t	 ƒ } | |  j _
 t |  ƒ |  _ t |  ƒ |  _ t |  ƒ |  _ t |  ƒ |  _ t |  ƒ |  _ d  S(   Nu   OPTIONSu   use_returning_into(   RÊ   RÚ   t   __init__R[   t   oracle_versionR   t   featurest   settings_dictt   getR$   R)   R4   R“   R   t   clientR   t   creationR   t   introspectiont   BaseDatabaseValidationt
   validation(   R9   t   argst   kwargst   use_returning_into(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÛ   Ê  s    	c         C  s*   |  j  ƒ  j d ƒ |  j  ƒ  j d ƒ d S(   u•   
        To check constraints, we set constraints to immediate. Then, when, we're done we must ensure they
        are returned to deferred.
        u   SET CONSTRAINTS ALL IMMEDIATEu   SET CONSTRAINTS ALL DEFERREDN(   Rt   R€   (   R9   t   table_names(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   check_constraints×  s    c         C  s   |  j  d  k	 S(   N(   R’   R[   (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _valid_connectionß  s    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(   Nu   HOSTu	   localhostu   PORTu   NAMEu   %s/%s@%su   USERu   PASSWORD(   RÞ   t   stripRW   t   makedsnRq   (   R9   RÞ   t   dsn(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _connect_stringâ  s    	

c         C  sÃ  d  } |  j ƒ  s§t |  j ƒ  ƒ } |  j d j ƒ  } d | k rM | d =n  t j | |  |  _ t	 |  j ƒ } | j
 d ƒ | j
 d t j r– d n d ƒ d |  j k ry" | j
 d |  j d	 d
 g ƒ Wn  t j k
 rñ |  j |  _ qX|  j |  _ n  y\ t |  j j j d ƒ d ƒ |  _ |  j d k rJ|  j j |  j _ n |  j j |  j _ Wn t k
 rpn Xy d |  j _ Wn n Xt j d |  j d |  ƒ n  | s¿t	 |  j ƒ } n  | S(   Nu   OPTIONSu   use_returning_intou+   ALTER SESSION SET NLS_TERRITORY = 'AMERICA'um   ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'u    TIME_ZONE = 'UTC'u    u	   operatorsu!   SELECT 1 FROM DUAL WHERE DUMMY %su   containsu   Xu   .i    i	   i   t   senderR’   (    R[   Rê   R—   Rî   RÞ   t   copyRW   t   connectR’   t   FormatStylePlaceholderCursorR€   R   R½   RÖ   t   _standard_operatorsR   t   DatabaseErrort   _likec_operatorst	   operatorsRq   t   versiont   splitRÜ   R“   R   R”   R‘   RÀ   t   stmtcachesizeR   t   sendt	   __class__(   R9   Rt   t   conn_stringt   conn_params(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _cursorï  sF    
	"c         C  s   d  S(   N(    (   R9   R˜   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _savepoint_commit-  s    c         C  s7  |  j  d  k	 r3y |  j  j ƒ  SWq3t j k
 rj } t j t j t j t | j	 ƒ Œ  t
 j ƒ  d ƒ q3t j k
 r/} | 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  t j t j t j t | j	 ƒ Œ  t
 j ƒ  d ƒ q3Xn  d  S(   Ni   i    u   codeu   messagei+  u	   ORA-02291(   R’   R[   t   commitRW   t   IntegrityErrorR   t   reraiseR   t   tupleRå   t   syst   exc_infoRô   t   hasattrt   codet   message(   R9   R   Rˆ   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _commit0  s    55N(   R   R    t   vendorRÓ   Rö   Ró   Rð   Rõ   R   RÛ   R[   Ré   Rê   Rî   Rþ   Rÿ   R	  (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÚ   ­  s<   	
					>	t   OracleParamc           B  s   e  Z d  Z e d „ Z RS(   u¦  
    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.
    c         C  sD  t  j r€ t | t j ƒ r€ t j | ƒ r_ t j d | t ƒ t j	 ƒ  } t j
 | | ƒ } n  | j t j ƒ j d d  ƒ } n  | t k r• d } n | t k rª d } n  t | d ƒ rÎ | j | ƒ |  _ n t | | j | ƒ |  _ t | d ƒ r| j |  _ n< t | t j ƒ r7t | ƒ d k r7t j |  _ n	 d  |  _ d  S(   NuH   Oracle received a naive datetime (%s) while time zone support is active.R»   u   1u   0u   bind_parameteru
   input_sizei   (   R   R½   RV   RÄ   R   t   is_naivet   warningst   warnt   RuntimeWarningt   get_default_timezonet
   make_awareR¾   R¿   RŒ   R[   R$   R"   R  t   bind_parameterR   R—   t   charsett
   input_sizeR   RÃ   RK   RW   t   CLOB(   R9   t   paramRt   t   strings_onlyt   default_timezone(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÛ   Q  s*    	!		$(   R   R    t   __doc__R"   RÛ   (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR  G  s   t   VariableWrapperc           B  s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   u	  
    An adapter class for cursor variables that prevents the wrapped object
    from being converted into a string when used to instanciate 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(   t   var(   R9   R  (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÛ   z  s    c         C  s   |  j  S(   N(   R  (   R9   Rt   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR  }  s    c         C  s   t  |  j | ƒ S(   N(   t   getattrR  (   R9   t   key(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   __getattr__€  s    c         C  s3   | d k r | |  j  | <n t |  j | | ƒ d  S(   Nu   var(   RÖ   t   setattrR  (   R9   R  R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   __setattr__ƒ  s    (   R   R    R  RÛ   R  R  R   (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR  r  s
   			R•   c           B  s   e  Z d  Z d „  Z RS(   u«   
    A late-binding cursor variable that can be passed to Cursor.execute
    as a parameter, in order to receive the id of the row created by an
    insert statement.
    c         C  s"   | j  j t j ƒ } | | _ | S(   N(   Rt   R  RW   t   NUMBERRr   (   R9   Rt   R  (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR  ‘  s    	(   R   R    R  R  (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR•   Š  s   Rò   c           B  s’   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z d d „ Z	 d d „ Z
 d „  Z d d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z RS(   uF  
    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.
    u   utf-8c         C  s+   | j  ƒ  |  _  t |  j  _ d |  j  _ d  S(   Nid   (   Rt   R$   t   numbersAsStringst	   arraysize(   R9   R’   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÛ   ¢  s    c         C  s)   t  g  | D] } t | |  t ƒ ^ q
 ƒ S(   N(   R  R  R$   (   R9   R}   t   p(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _format_params©  s    c         C  so   d  g t | d ƒ } xD | D]< } x3 t | ƒ D]% \ } } | j r1 | j | | <q1 q1 Wq W|  j | Œ  d  S(   Ni    (   R[   RK   t	   enumerateR  t   setinputsizes(   R9   t   params_listt   sizesR}   t   iR   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _guess_input_sizes¬  s    	c         C  s   g  | D] } | j  ^ q S(   N(   R   (   R9   R}   R$  (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   _param_generator´  s    c         C  sË  | d  k r g  } n |  j | ƒ } g  t t | ƒ ƒ D] } d | ^ q7 } | j d ƒ sk | j d ƒ rx | d  } n  t | t | ƒ |  j ƒ } |  j | g ƒ y  |  j	 j
 | |  j | ƒ ƒ SWn t j k
 r} t j t j t j t | j ƒ Œ  t j ƒ  d ƒ n¹ t j k
 rÆ} 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  t j t j t j t | j ƒ Œ  t j ƒ  d ƒ n Xd  S(	   Nu   :arg%du   ;u   /iÿÿÿÿi   i    u   codeix  (   R[   R%  t   rangeRK   Rv   R—   R  R  R+  Rt   R€   R,  RW   R  R   R  R   Rå   R  R  Rô   R  R  RV   (   R9   R~   R}   R*  Rå   R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR€   ·  s     	) 5<5c      	   C  s-  | d  k	 r1 t | t t f ƒ r1 t | ƒ } n  y1 g  t t | d ƒ ƒ D] } d | ^ qK } Wn t t f k
 r| d  SX| j d ƒ s› | j d ƒ r¨ | d  } n  t	 | t | ƒ |  j
 ƒ } g  | D] } |  j | ƒ ^ qË } |  j | ƒ y3 |  j j | g  | D] } |  j | ƒ ^ q	ƒ SWn t j k
 rp} t j t j t j t | j ƒ Œ  t j ƒ  d ƒ n¹ t j k
 r(} 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  t j t j t j t | j ƒ Œ  t j ƒ  d ƒ n Xd  S(	   Ni    u   :arg%du   ;u   /iÿÿÿÿi   u   codeix  (   R[   RV   t   listR  R-  RK   t
   IndexErrort	   TypeErrorRv   R—   R  R%  R+  Rt   t   executemanyR,  RW   R  R   R  R   Rå   R  R  Rô   R  R  (   R9   R~   R}   R*  Rå   t	   formattedR$  R   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR1  Ï  s(    "1"'5<5c         C  s/   |  j  j ƒ  } | d  k r | St | |  j  ƒ S(   N(   Rt   R   R[   t   _rowfactory(   R9   t   row(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR   ì  s    c         C  sM   | d  k r |  j } n  t g  |  j j | ƒ D] } t | |  j ƒ ^ q. ƒ S(   N(   R[   R#  R  Rt   t	   fetchmanyR3  (   R9   t   sizet   r(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR5  ò  s    c         C  s2   t  g  |  j j ƒ  D] } t | |  j ƒ ^ q ƒ S(   N(   R  Rt   t   fetchallR3  (   R9   R7  (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR8  ø  s    c         G  s   t  |  j j | Œ  ƒ S(   N(   R  Rt   R  (   R9   Rå   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR  ü  s    c         G  s   t  |  j j | Œ  ƒ S(   N(   R  Rt   t   arrayvar(   R9   Rå   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR9  ÿ  s    c         C  s.   | |  j  k r |  j  | St |  j | ƒ Sd  S(   N(   RÖ   R  Rt   (   R9   t   attr(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR    s    c         C  s   t  |  j ƒ S(   N(   t   CursorIteratorRt   (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   __iter__  s    N(   R   R    R  R  RÛ   R%  R+  R,  R[   R€   R1  R   R5  R8  R  R9  R  R<  (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRò   —  s   									R;  c           B  s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   u<   Cursor iterator wrapper that invokes our custom row factory.c         C  s   | |  _  t | ƒ |  _ d  S(   N(   Rt   t   iter(   R9   Rt   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRÛ     s    	c         C  s   |  S(   N(    (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR<    s    c         C  s   t  t |  j ƒ |  j ƒ S(   N(   R3  t   nextR=  Rt   (   R9   (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   __next__  s    (   R   R    R  RÛ   R<  R?  (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR;    s   		c         C  s¸  g  } x¥t  |  | j ƒ D]‘\ } } | 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 | ƒ } q| d k rä | d k rÒ t | ƒ } qt j | ƒ } qd | k rt j | ƒ } qt | ƒ } nŒ | d t j	 t j
 f k rlt j r| d  k	 rt j | ƒ r| j d t j ƒ } qn1 | d t j t j t j f k rt | ƒ } n  | j | ƒ q Wt | ƒ S(   Ni   i   i   iÿÿÿi    u   .R»   (   t   zipt   descriptionR[   RW   R!  t   decimalt   DecimalRq   R^   t	   TIMESTAMPt   DATETIMER   R½   R   R  RŒ   R¿   t   STRINGt
   FIXED_CHARt   LONG_STRINGt
   to_unicodeR¤   R  (   R4  Rt   t   castedR   t   desct	   precisiont   scale(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR3    s2    $c         C  s    t  |  t j ƒ r t |  ƒ S|  S(   u]   
    Convert strings to Unicode objects (and return all other data types
    unchanged).
    (   RV   R   RÃ   R   (   t   s(    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyRI  J  s    
c           C  s   d S(   Nu~  
DECLARE
    table_value integer;
    seq_value integer;
BEGIN
    SELECT NVL(MAX(%(column)s), 0) INTO table_value FROM %(table)s;
    SELECT NVL(last_number - cache_size, 0) INTO seq_value FROM user_sequences
           WHERE sequence_name = '%(sequence)s';
    WHILE table_value > seq_value LOOP
        SELECT "%(sequence)s".nextval INTO seq_value FROM dual;
    END LOOP;
END;
/(    (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyR£   T  s    (9   R  t
   __future__R    RÄ   RB  R  R  R   t	   cx_OracleRW   R   R   R   R   t   django.confR   R©   R   t   django.db.backendst   django.db.backends.signalsR   t    django.db.backends.oracle.clientR   t"   django.db.backends.oracle.creationR   t'   django.db.backends.oracle.introspectionR   t   django.utils.encodingR   R   t   django.utilsR   R   Rô   R  Rq   R÷   Rø   R  R—   t   BaseDatabaseFeaturesR   t   BaseDatabaseOperationsR4   t   objectRÓ   t   BaseDatabaseWrapperRÚ   R  R  R•   Rò   t   IteratorR;  R3  RI  R£   (    (    (    s7   ../Django//lib/python/django/db/backends/oracle/base.pyt   <module>   sX   		
		%%	ÿ Gš+u	/	
