
^Q\`X                 @   s   d  d l  m 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
 m Z d  d l m Z m Z d  d l m Z m Z d d	 l m Z d d
 l m Z m Z Gd d   d e  Z d S)    )unicode_literalsN)settings)BaseDatabaseOperations)strip_quotestruncate_name)sixtimezone)force_bytes
force_text   )Database)InsertIdVarOracle_datetimec                   s  e  Z d  Z d Z i dw d 6dy d 6d{ d 6d| d 6d} d	 6Z d
 Z   f d d   Z d d   Z d d   Z d d   Z	 d d   Z
 d d   Z e j d  Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z   f d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z d8 d9   Z d: d;   Z    f d< d=   Z! d> d?   Z" d@ dA dB  Z# dC dD   Z$ dE dF   Z% dG dH   Z& dI dJ   Z' dK dL   Z( dM dN   Z) dO dP   Z* dQ dR   Z+ dS dT   Z, dU dV   Z- dW dX   Z. dY dZ d[  Z/ dY d\ d]  Z0 d^ d_   Z1 d` da   Z2 db dc   Z3 dY dd de  Z4 df dg   Z5 dh di   Z6 dj dk   Z7   f dl dm   Z8 dn do   Z9 dp dq   Z: dr ds   Z;   f dt du   Z<   S)~DatabaseOperationsz"django.db.backends.oracle.compiler   g] ZSmallIntegerFieldZIntegerField   9V ZBigIntegerFieldr   ZPositiveSmallIntegerFieldZPositiveIntegerFielda~  
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;
/c                s*   t  t |   j | |   d |  j d <d  S)NMINUS
difference)superr   __init__Zset_operators)selfargskwargs)	__class__ J/var/www/dbchiro/venv/build/Django/django/db/backends/oracle/operations.pyr   ,   s    zDatabaseOperations.__init__c             C   sd   i |  j  |  d 6|  j |  d 6|  j |  d 6|  j |  d 6} d | } d | } | | f S)Nsq_nameZtr_nameZtbl_nameZcol_namez
DECLARE
    i INTEGER;
BEGIN
    SELECT COUNT(1) INTO i FROM USER_SEQUENCES
        WHERE SEQUENCE_NAME = '%(sq_name)s';
    IF i = 0 THEN
        EXECUTE IMMEDIATE 'CREATE SEQUENCE "%(sq_name)s"';
    END IF;
END;
/z
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;
/)_get_sequence_name_get_trigger_name
quote_name)r   tablecolumnr   Zsequence_sqlZtrigger_sqlr   r   r   autoinc_sql0   s    


zDatabaseOperations.autoinc_sqlc             C   s   d S)Nz
            SELECT cache_key
              FROM (SELECT cache_key, rank() OVER (ORDER BY cache_key) AS rank FROM %s)
             WHERE rank = %%s + 1
        r   )r   r   r   r   cache_key_culling_sqlP   s    z(DatabaseOperations.cache_key_culling_sqlc             C   s@   | d k r d | S| d k r( d | Sd | j    | f Sd  S)NZweek_dayzTO_CHAR(%s, 'D')weekzTO_CHAR(%s, 'IW')zEXTRACT(%s FROM %s))upper)r   lookup_type
field_namer   r   r   date_extract_sqlW   s
    z#DatabaseOperations.date_extract_sqlc             C   s   d | j    g  f S)zT
        NUMTODSINTERVAL converts number to INTERVAL DAY TO SECOND literal.
        zNUMTODSINTERVAL(%06f, 'SECOND'))total_seconds)r   	timedeltar   r   r   date_interval_sqlb   s    z$DatabaseOperations.date_interval_sqlc             C   s,   | d k r  d | | j    f Sd | Sd  S)NyearmonthzTRUNC(%s, '%s')z	TRUNC(%s))zyearzmonth)r%   )r   r&   r'   r   r   r   date_trunc_sqlh   s    z!DatabaseOperations.date_trunc_sqlz^[\w/:+-]+$c             C   s@   t  j s | S|  j j |  s2 t d |   n  d | | f S)NzInvalid time zone name: %sz:CAST((FROM_TZ(%s, '0:00') AT TIME ZONE '%s') AS TIMESTAMP))r   USE_TZ
_tzname_rematch
ValueError)r   r'   tznamer   r   r   _convert_field_to_tzu   s
    	z'DatabaseOperations._convert_field_to_tzc             C   s&   |  j  | |  } d | } | g  f S)Nz	TRUNC(%s))r4   )r   r'   r3   sqlr   r   r   datetime_cast_date_sql~   s    
z)DatabaseOperations.datetime_cast_date_sqlc             C   s   |  j  | |  } | g  f S)N)r4   )r   r'   r3   r   r   r   datetime_cast_time_sql   s    z)DatabaseOperations.datetime_cast_time_sqlc             C   s.   |  j  | |  } |  j | |  } | g  f S)N)r4   r(   )r   r&   r'   r3   r5   r   r   r   datetime_extract_sql   s    z'DatabaseOperations.datetime_extract_sqlc             C   s   |  j  | |  } | d k r7 d | | j   f } nU | d k rP d | } n< | d k ri d | } n# | d k r d	 | } n
 d
 | } | g  f S)Nr,   r-   zTRUNC(%s, '%s')dayz	TRUNC(%s)hourzTRUNC(%s, 'HH24')minutezTRUNC(%s, 'MI')zCAST(%s AS DATE))zyearzmonth)r4   r%   )r   r&   r'   r3   r5   r   r   r   datetime_trunc_sql   s    
z%DatabaseOperations.datetime_trunc_sqlc             C   sO   | d k r d | } n2 | d k r2 d | } n | d k rK d | } n  | S)Nr:   zTRUNC(%s, 'HH24')r;   zTRUNC(%s, 'MI')secondzCAST(%s AS DATE)r   )r   r&   r'   r5   r   r   r   time_trunc_sql   s    z!DatabaseOperations.time_trunc_sqlc                s  t  t |   j |  } | j j   } | d k rF | j |  j  n | d k re | j |  j  n | d	 k r | j |  j  n| | d k r | j |  j	  n] | d k r | j |  j
  n> | d k r | j |  j  n | d k r | j |  j  n  | j |  j  | S)
NZ	TextFieldBinaryFieldBooleanFieldNullBooleanFieldZDateTimeField	DateFieldZ	TimeFieldZ	UUIDField)r@   rA   )r   r   get_db_convertersoutput_fieldget_internal_typeappendconvert_textfield_valueconvert_binaryfield_valueconvert_booleanfield_valueconvert_datetimefield_valueconvert_datefield_valueconvert_timefield_valueconvert_uuidfield_valueconvert_empty_values)r   
expressionZ
convertersinternal_type)r   r   r   rC      s$    z$DatabaseOperations.get_db_convertersc             C   s+   t  | t j  r' t | j    } n  | S)N)
isinstancer   LOBr
   read)r   valuerO   
connectioncontextr   r   r   rG      s    z*DatabaseOperations.convert_textfield_valuec             C   s+   t  | t j  r' t | j    } n  | S)N)rQ   r   rR   r	   rS   )r   rT   rO   rU   rV   r   r   r   rH      s    z,DatabaseOperations.convert_binaryfield_valuec             C   s   | d k r t  |  } n  | S)Nr   r   )r   r   )bool)r   rT   rO   rU   rV   r   r   r   rI      s    z-DatabaseOperations.convert_booleanfield_valuec             C   s7   | d  k	 r3 t  j r3 t j | |  j j  } q3 n  | S)N)r   r/   r   Z
make_awarerU   )r   rT   rO   rU   rV   r   r   r   rJ      s    	z.DatabaseOperations.convert_datetimefield_valuec             C   s%   t  | t j  r! | j   } n  | S)N)rQ   r   	Timestampdate)r   rT   rO   rU   rV   r   r   r   rK      s    z*DatabaseOperations.convert_datefield_valuec             C   s%   t  | t j  r! | j   } n  | S)N)rQ   r   rX   time)r   rT   rO   rU   rV   r   r   r   rL      s    z*DatabaseOperations.convert_timefield_valuec             C   s"   | d  k	 r t  j |  } n  | S)N)uuidUUID)r   rT   rO   rU   rV   r   r   r   rM      s    z*DatabaseOperations.convert_uuidfield_valuec             C   sF   | j  } | d  k rB | j rB d } | j   d k rB d } qB n  | S)N r?       )rD   Zempty_strings_allowedrE   )r   rT   rO   rU   rV   fieldr   r   r   rN      s    	z'DatabaseOperations.convert_empty_valuesc             C   s   d S)Nz DEFERRABLE INITIALLY DEFERREDr   )r   r   r   r   deferrable_sql   s    z!DatabaseOperations.deferrable_sqlc             C   s   t  | j j    S)N)intZ_insert_id_vargetvalue)r   cursorr   r   r   fetch_returned_insert_id   s    z+DatabaseOperations.fetch_returned_insert_idc             C   s!   | r | j  d  r d Sd Sd  S)NrR   zDBMS_LOB.SUBSTR(%s)z%s)endswith)r   Zdb_typerP   r   r   r   field_cast_sql   s    z!DatabaseOperations.field_cast_sqlc                sV   | j  } | r: t j r: t | t  r: | j d  } n  t t |   j | | |  S)Nzutf-8)		statementr   PY2rQ   unicodedecoder   r   last_executed_query)r   rc   r5   paramsrg   )r   r   r   rk      s    	z&DatabaseOperations.last_executed_queryc             C   s.   |  j  |  } | j d |  | j   d S)NzSELECT "%s".currval FROM dualr   )r   executeZfetchone)r   rc   
table_nameZpk_namer   r   r   r   last_insert_id  s    z!DatabaseOperations.last_insert_idNc             C   s   | d k r d Sd S)Niexact	icontainsistartswith	iendswithz	UPPER(%s)z%s)rp   rq   rr   rs   r   )r   r&   rP   r   r   r   lookup_cast  s    zDatabaseOperations.lookup_castc             C   s   d S)Ni  r   )r   r   r   r   max_in_list_size  s    z#DatabaseOperations.max_in_list_sizec             C   s   d S)N   r   )r   r   r   r   max_name_length  s    z"DatabaseOperations.max_name_lengthc             C   s   d S)NZNULLr   )r   r   r   r   pk_default_value  s    z#DatabaseOperations.pk_default_valuec             C   s   | S)Nr   )r   xr   r   r   prep_for_iexact_query  s    z(DatabaseOperations.prep_for_iexact_queryc             C   s    | d  k r d St  | j    S)Nr]   )r
   rS   )r   rT   r   r   r   process_clob  s    zDatabaseOperations.process_clobc             C   s^   | j  d  rB | j d  rB d t | j   |  j    } n  | j d d  } | j   S)N"z"%s"%z%%)
startswithre   r   r%   rw   replace)r   namer   r   r   r   "  s     "zDatabaseOperations.quote_namec             C   s   d S)NzDBMS_RANDOM.RANDOMr   )r   r   r   r   random_function_sql/  s    z&DatabaseOperations.random_function_sqlc             C   s#   | d k r d } n d } d | S)Nregexz'c'z'i'zREGEXP_LIKE(%%s, %%s, %s)r   )r   r&   Zmatch_optionr   r   r   regex_lookup2  s    	zDatabaseOperations.regex_lookupc             C   s   d t    f f S)NzRETURNING %s INTO %%s)r   )r   r   r   r   return_insert_id9  s    z#DatabaseOperations.return_insert_idc             C   s   d |  j  |  S)Nz
SAVEPOINT )r   )r   sidr   r   r   savepoint_create_sql<  s    z'DatabaseOperations.savepoint_create_sqlc             C   s   d |  j  |  S)NzROLLBACK TO SAVEPOINT )r   )r   r   r   r   r   savepoint_rollback_sql?  s    z)DatabaseOperations.savepoint_rollback_sqlFc             C   se   |  j  j   P } | r1 | j d | | f  n | j d | f  d d   | j   D SWd  QXd  S)Na  
                    SELECT
                        user_tables.table_name, rcons.constraint_name, MAX(level)
                    FROM
                        user_tables
                    JOIN
                        user_constraints cons
                        ON (user_tables.table_name = cons.table_name AND cons.constraint_type = ANY('P', 'U'))
                    LEFT JOIN
                        user_constraints rcons
                        ON (user_tables.table_name = rcons.table_name AND rcons.constraint_type = 'R')
                    START WITH user_tables.table_name = UPPER(%s)
                    CONNECT BY NOCYCLE PRIOR cons.constraint_name = rcons.r_constraint_name
                    GROUP BY
                        user_tables.table_name, rcons.constraint_name
                    HAVING user_tables.table_name != UPPER(%s)
                    ORDER BY MAX(level) DESC
                a9  
                    SELECT
                        cons.table_name, cons.constraint_name, 1
                    FROM
                        user_constraints cons
                    WHERE
                        cons.constraint_type = 'R'
                        AND cons.table_name = UPPER(%s)
                c             S   s%   g  |  ] \ } } } | | f  q Sr   r   ).0foreign_table
constraint_r   r   r   
<listcomp>b  s   	 z?DatabaseOperations._foreign_key_constraints.<locals>.<listcomp>)rU   rc   rm   Zfetchall)r   rn   	recursiverc   r   r   r   _foreign_key_constraintsB  s    z+DatabaseOperations._foreign_key_constraintsc                s   | r d d   | D } t    } x] | D]U } xL   j | d | D]5 \ } }	 | rg | j |  n  | j | |	 f  qE Wq) W   f d d   | D    f d d   | D    f d d   | D }
 |
 j   j  |   |
 Sg  Sd  S)Nc             S   s   h  |  ] } | j     q Sr   )r%   )r   r    r   r   r   	<setcomp>g  s   	 z/DatabaseOperations.sql_flush.<locals>.<setcomp>r   c                s   g  |  ] \ } } d   j  d   j  d   j   j |    j  d   j  d   j   j |    j  d   j  d  f  q S)z%s %s %s %s %s %s %s %s;ALTERTABLEZDISABLE
CONSTRAINTZKEEPZINDEX)SQL_KEYWORD	SQL_FIELDr   )r   r    r   )r   styler   r   r   t  s   		z0DatabaseOperations.sql_flush.<locals>.<listcomp>c                sG   g  |  ]= } d   j  d   j  d   j   j |   f  q S)z	%s %s %s;ZTRUNCATEr   )r   r   r   )r   r    )r   r   r   r   r     s   	c                sz   g  |  ]p \ } } d   j  d   j  d   j   j |    j  d   j  d   j   j |   f  q S)z%s %s %s %s %s %s;r   r   ZENABLEr   )r   r   r   )r   r    r   )r   r   r   r   r     s   	)setr   addextendsequence_reset_by_name_sql)r   r   Ztables	sequencesZallow_cascadeZtruncated_tablesconstraintsr    r   r   r5   r   )r   r   r   	sql_flushe  s    	"3zDatabaseOperations.sql_flushc       	      C   s   g  } x| | D]t } |  j  | d  } |  j | d  } |  j | d pL d  } |  j i | d 6| d 6| d 6} | j |  q W| S)Nr    r!   idsequence)r   r   _sequence_reset_sqlrF   )	r   r   r   r5   Zsequence_infosequence_namern   column_namequeryr   r   r   r     s    	z-DatabaseOperations.sequence_reset_by_name_sqlc             C   sH  d d l  m } g  } |  j } 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)Nr   )modelsr   r    r!   r   )Z	django.dbr   r   Z_metaZlocal_fieldsrQ   Z	AutoFieldr   Zdb_tabler   r!   rF   Zmany_to_manyZremote_fieldZthroughZm2m_db_table)r   r   Z
model_listr   outputr   modelfrn   r   r   r   r   r   sequence_reset_sql  s,    	z%DatabaseOperations.sequence_reset_sqlc             C   s   d S)Nr]   r   )r   r   r   r   start_transaction_sql  s    z(DatabaseOperations.start_transaction_sqlc             C   s,   | r d |  j  |  Sd |  j  |  Sd  S)NzUSING INDEX TABLESPACE %szTABLESPACE %s)r   )r   Z
tablespaceinliner   r   r   tablespace_sql  s    z!DatabaseOperations.tablespace_sqlc             C   s   | S)z
        Transform a date value to an object compatible with what is expected
        by the backend driver for date columns.
        The default implementation transforms the date to text, but that is not
        necessary for Oracle.
        r   )r   rT   r   r   r   adapt_datefield_value  s    z(DatabaseOperations.adapt_datefield_valuec             C   sr   | d k r d St  | d  r# | St j |  re t j rV t j | |  j j  } qe t d   n  t j	 |  S)aE  
        Transform a datetime value to an object compatible with what is expected
        by the backend driver for datetime columns.

        If naive datetime is passed assumes that is in UTC. Normally Django
        models.DateTimeField makes sure that if USE_TZ is True passed datetime
        is timezone aware.
        Nresolve_expressionzNOracle backend does not support timezone-aware datetimes when USE_TZ is False.)
hasattrr   is_awarer   r/   Z
make_naiverU   r2   r   Zfrom_datetime)r   rT   r   r   r   adapt_datetimefield_value  s    
	z,DatabaseOperations.adapt_datetimefield_valuec             C   s   | d  k r d  St  | d  r# | St | t j  rH t j j | d  St j |  rf t d   n  t	 d d d | j
 | j | j | j  S)Nr   z%H:%M:%Sz5Oracle backend does not support timezone-aware times.il  r   )r   rQ   r   string_typesdatetimestrptimer   r   r2   r   r:   r;   r=   microsecond)r   rT   r   r   r   adapt_timefield_value  s    z(DatabaseOperations.adapt_timefield_valuec                s   | \ } } | d k r) d d j  |  S| d k rF d d j  |  S| d k rh d i | d 6| d	 6S| d
 k r d i | d 6| d	 6S| d k r d i | d 6| d	 6S| d k r d d j  |  St t |   j | |  S)Nz%%zMOD(%s),&z
BITAND(%s)|z"BITAND(-%(lhs)s-1,%(rhs)s)+%(lhs)slhsrhsz<<z(%(lhs)s * POWER(2, %(rhs)s))z>>z"FLOOR(%(lhs)s / POWER(2, %(rhs)s))^z	POWER(%s))joinr   r   combine_expression)r   Z	connectorZsub_expressionsr   r   )r   r   r   r     s    z%DatabaseOperations.combine_expressionc             C   s-   |  j    d } d t t |  |  j   S)N   z%s_SQ)rw   r   r   r%   )r   r    name_lengthr   r   r   r     s    z%DatabaseOperations._get_sequence_namec             C   s-   |  j    d } d t t |  |  j   S)Nr   z%s_TR)rw   r   r   r%   )r   r    r   r   r   r   r     s    z$DatabaseOperations._get_trigger_namec             C   s   d j  d d   | D  S)Nz UNION ALL c             s   s"   |  ] } d  d j  |  Vq d S)zSELECT %s FROM DUALz, N)r   )r   rowr   r   r   	<genexpr>  s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>)r   )r   fieldsZplaceholder_rowsr   r   r   bulk_insert_sql  s    	z"DatabaseOperations.bulk_insert_sqlc                sX   | d k r< | \ } } | \ } } d | | f | | f St  t |   j | | |  S)NrB   zNUMTODSINTERVAL(%s - %s, 'DAY'))r   r   subtract_temporals)r   rP   r   r   Zlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_params)r   r   r   r     s
    z%DatabaseOperations.subtract_temporalsg] )r   r   g] )r   r   9V )r   r   )r   r   )r   r   )=__name__
__module____qualname__Zcompiler_moduleZinteger_field_rangesr   r   r"   r#   r(   r+   r.   recompiler0   r4   r6   r7   r8   r<   r>   rC   rG   rH   rI   rJ   rK   rL   rM   rN   r`   rd   rf   rk   ro   rt   ru   rw   rx   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r      sz   
 		
#0	r   )
__future__r   r   r   r[   Zdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.db.backends.utilsr   r   Zdjango.utilsr   r   Zdjango.utils.encodingr	   r
   baser   utilsr   r   r   r   r   r   r   <module>   s   