Changeset 4022
- Timestamp:
- 11/06/06 01:38:57 (2 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/boulder-oracle-sprint/django/db/backends/oracle/query.py
r4021 r4022 1 1 from 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 4 from django.db.models.query import handle_legacy_orderlist, orderfield2column 3 5 from django.utils.datastructures import SortedDict 4 6 import cx_Oracle as Database 5 7 6 8 9 def 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 20 def 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 7 43 def get_query_set_class(DefaultQuerySet): 8 """ 9 Create a custom QuerySet class for Oracle. 10 """ 44 "Create a custom QuerySet class for Oracle." 11 45 12 46 class OracleQuerySet(DefaultQuerySet): 47 13 48 def iterator(self): 14 49 "Performs the SELECT database lookup of this QuerySet." … … 61 96 where = self._where[:] 62 97 params = self._params[:] 63 98 64 99 # Convert self._filters into SQL. 65 100 joins2, where2, params2 = self._filters.get_sql(opts) … … 157 192 158 193 return select, " ".join(sql), params, full_query 159 160 194 161 195 return OracleQuerySet django/branches/boulder-oracle-sprint/django/db/models/query.py
r4021 r4022 6 6 from django.utils.datastructures import SortedDict 7 7 from django.conf import settings 8 import operator 9 import re 8 import datetime, operator, re 10 9 11 10 # For Python 2.3 … … 198 197 counter._limit = None 199 198 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] 204 200 cursor = connection.cursor() 205 201 if self._distinct: … … 540 536 541 537 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] 546 539 select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 547 540 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) … … 656 649 table_prefix = backend.quote_name(table_prefix[:-1])+'.' 657 650 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')")) 661 658 try: 662 659 return '%s%s %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s')) … … 704 701 where.append('%s.%s = %s.%s' % \ 705 702 (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]) 710 704 fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen) 711 705
