Django

Code

Changeset 4022

Show
Ignore:
Timestamp:
11/06/06 01:38:57 (2 years ago)
Author:
bouldersprinters
Message:

[boulder-oracle-sprint] Oracle passes most of runtests.py now.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/boulder-oracle-sprint/django/db/backends/oracle/query.py

    r4021 r4022  
    11from django.db import backend, connection 
    2 from django.db.models.query import handle_legacy_orderlist 
     2# TODO: Why the frack can't I just import get_cached_row? 
     3#from django.db.models.query import get_cached_row 
     4from django.db.models.query import handle_legacy_orderlist, orderfield2column 
    35from django.utils.datastructures import SortedDict 
    46import cx_Oracle as Database 
    57 
    68 
     9def get_cached_row(klass, row, index_start): 
     10    "Helper function that recursively returns an object with cache filled" 
     11    index_end = index_start + len(klass._meta.fields) 
     12    obj = klass(*row[index_start:index_end]) 
     13    for f in klass._meta.fields: 
     14        if f.rel and not f.null: 
     15            rel_obj, index_end = get_cached_row(f.rel.to, row, index_end) 
     16            setattr(obj, f.get_cache_name(), rel_obj) 
     17    return obj, index_end 
     18 
     19 
     20def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen): 
     21    """ 
     22    Helper function that recursively populates the select, tables and where (in 
     23    place) for select_related queries. 
     24    """ 
     25    from django.db.models.fields import AutoField  
     26    qn = backend.quote_name 
     27    for f in opts.fields: 
     28        if f.rel and not f.null: 
     29            db_table = f.rel.to._meta.db_table 
     30            if db_table not in cache_tables_seen: 
     31                tables.append(qn(db_table)) 
     32            else: # The table was already seen, so give it a table alias. 
     33                new_prefix = '%s%s' % (db_table, len(cache_tables_seen)) 
     34                tables.append('%s %s' % (qn(db_table), qn(new_prefix))) 
     35                db_table = new_prefix 
     36            cache_tables_seen.append(db_table) 
     37            where.append('%s.%s = %s.%s' % \ 
     38                (qn(old_prefix), qn(f.column), qn(db_table), qn(f.rel.get_related_field().column))) 
     39            select.extend(['%s.%s' % (backend.quote_name(db_table), backend.quote_name(f2.column)) for f2 in f.rel.to._meta.fields if not isinstance(f2, AutoField)])  
     40            fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen) 
     41 
     42 
    743def get_query_set_class(DefaultQuerySet): 
    8     """ 
    9     Create a custom QuerySet class for Oracle. 
    10     """ 
     44    "Create a custom QuerySet class for Oracle." 
    1145     
    1246    class OracleQuerySet(DefaultQuerySet): 
     47         
    1348        def iterator(self): 
    1449            "Performs the SELECT database lookup of this QuerySet." 
     
    6196            where = self._where[:] 
    6297            params = self._params[:] 
    63      
     98         
    6499            # Convert self._filters into SQL. 
    65100            joins2, where2, params2 = self._filters.get_sql(opts) 
     
    157192              
    158193            return select, " ".join(sql), params, full_query 
    159      
    160          
     194             
    161195    return OracleQuerySet 
  • django/branches/boulder-oracle-sprint/django/db/models/query.py

    r4021 r4022  
    66from django.utils.datastructures import SortedDict 
    77from django.conf import settings 
    8 import operator 
    9 import re 
     8import datetime, operator, re 
    109 
    1110# For Python 2.3 
     
    198197        counter._limit = None 
    199198        counter._select_related = False 
    200         if settings.DATABASE_ENGINE == 'oracle': 
    201             select, sql, params, full_query = counter._get_sql_clause()  
    202         else: 
    203             select, sql, params = counter._get_sql_clause()  
     199        select, sql, params = counter._get_sql_clause()[:3] 
    204200        cursor = connection.cursor() 
    205201        if self._distinct: 
     
    540536 
    541537        cursor = connection.cursor() 
    542         if settings.DATABASE_ENGINE == 'oracle': 
    543             select, sql, params, full_query = self._get_sql_clause()  
    544         else: 
    545             select, sql, params = self._get_sql_clause()  
     538        select, sql, params = self._get_sql_clause()[:3] 
    546539        select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 
    547540        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) 
     
    656649        table_prefix = backend.quote_name(table_prefix[:-1])+'.' 
    657650    field_name = backend.quote_name(field_name) 
    658     # Put some oracle exceptions here 
    659     if lookup_type == "icontains" and settings.DATABASE_ENGINE == 'oracle':  
    660         return 'lower(%s%s) %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s'))  
     651    # TODO: move this into django.db.backends.oracle somehow 
     652    if settings.DATABASE_ENGINE == 'oracle': 
     653        if lookup_type == 'icontains': 
     654            return 'lower(%s%s) %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s'))              
     655        elif type(value) == datetime.datetime: 
     656            return "%s%s %s" % (table_prefix, field_name, 
     657                 (backend.OPERATOR_MAPPING[lookup_type] % "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS')"))        
    661658    try: 
    662659        return '%s%s %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s')) 
     
    704701            where.append('%s.%s = %s.%s' % \ 
    705702                (qn(old_prefix), qn(f.column), qn(db_table), qn(f.rel.get_related_field().column))) 
    706             if settings.DATABASE_ENGINE == 'oracle': 
    707                 select.extend(['%s.%s' % (backend.quote_name(db_table), backend.quote_name(f2.column)) for f2 in f.rel.to._meta.fields if not isinstance(f2, AutoField)])  
    708             else: 
    709                 select.extend(['%s.%s' % (backend.quote_name(db_table), backend.quote_name(f2.column)) for f2 in f.rel.to._meta.fields])  
     703            select.extend(['%s.%s' % (backend.quote_name(db_table), backend.quote_name(f2.column)) for f2 in f.rel.to._meta.fields])  
    710704            fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen) 
    711705