diff options
author | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-03-14 20:37:03 +0000 |
---|---|---|
committer | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-03-14 20:37:03 +0000 |
commit | e1d2422cfd2dc36ab92db7c63342e856fc6b9e10 (patch) | |
tree | e124366a1e2e5fc5d9ae29845ef51da0a460197e /django | |
parent | 09005281ac54effa58befb9fe8aba2327f2a8136 (diff) | |
download | django-e1d2422cfd2dc36ab92db7c63342e856fc6b9e10.tar.gz |
boulder-oracle-sprint: Fixed #3053. Zoltan Arokszallasi contributed several
important patches. Thanks!
Also made Oracle test DB more generous, since we were
hitting INTIAL EXTENT errors trying to run the whole test suite.
git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@4726 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r-- | django/core/management.py | 9 | ||||
-rw-r--r-- | django/db/backends/oracle/base.py | 49 | ||||
-rw-r--r-- | django/db/backends/oracle/creation.py | 6 | ||||
-rw-r--r-- | django/db/models/query.py | 6 | ||||
-rw-r--r-- | django/utils/tzinfo.py | 2 |
5 files changed, 45 insertions, 27 deletions
diff --git a/django/core/management.py b/django/core/management.py index 6b965b1724..01169fa48f 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -296,6 +296,7 @@ def _get_many_to_many_sql_for_model(model): def get_sql_delete(app): "Returns a list of the DROP TABLE SQL statements for the given app." from django.db import backend, connection, models, get_introspection_module + from django.db.backends.util import truncate_name introspection = get_introspection_module() # This should work even if a connecton isn't available @@ -342,12 +343,15 @@ def get_sql_delete(app): col = f.column r_table = model._meta.db_table r_col = model._meta.get_field(f.rel.field_name).column + r_name = '%s_refs_%s_%s_%s' % (col, r_col, table, r_table) output.append('%s %s %s %s;' % \ (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(backend.quote_name(table)), style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()), - style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table)))))))) + style.SQL_FIELD(truncate_name(r_name, backend.get_max_name_length())))) del references_to_delete[model] + if hasattr(backend, 'get_drop_sequence'): + output.append(backend.get_drop_sequence(model._meta.db_table)) # Output DROP TABLE statements for many-to-many tables. for model in app_models: @@ -356,6 +360,9 @@ def get_sql_delete(app): if cursor and table_name_converter(f.m2m_db_table()) in table_names: output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'), style.SQL_TABLE(backend.quote_name(f.m2m_db_table())))) + if hasattr(backend, 'get_drop_sequence'): + output.append(backend.get_drop_sequence("%s_%s" % (model._meta.db_table, f.column))) + app_label = app_models[0]._meta.app_label diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 1353406e66..b323af809c 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -152,7 +152,7 @@ def get_fulltext_search_sql(field_name): raise NotImplementedError def get_drop_foreignkey_sql(): - return "DROP FOREIGN KEY" + return "DROP CONSTRAINT" def get_pk_default_value(): return "DEFAULT" @@ -184,41 +184,46 @@ def get_sql_flush(style, tables, sequences): # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', # 'TRUNCATE z;'... style SQL statements if tables: + # Oracle does support TRUNCATE, but it seems to get us into + # FK referential trouble, whereas DELETE FROM table works. sql = ['%s %s %s;' % \ - (style.SQL_KEYWORD('TRUNCATE'), style.SQL_KEYWORD('TABLE'), + (style.SQL_KEYWORD('DELETE'), + style.SQL_KEYWORD('FROM'), style.SQL_FIELD(quote_name(table)) - ) for table in tables] - # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements - # to reset sequence indices + ) for table in tables] + # You can't ALTER SEQUENCE back to 1 in Oracle. You must DROP and + # CREATE the sequence. + # What? You got something better to do than marching up and + # down the square? for sequence_info in sequences: table_name = sequence_info['table'] column_name = sequence_info['column'] if column_name and len(column_name): # sequence name in this case will be <table>_<column>_seq - sql.append("%s %s %s %s %s %s;" % \ - (style.SQL_KEYWORD('ALTER'), - style.SQL_KEYWORD('SEQUENCE'), - style.SQL_FIELD('%s_%s_seq' % (table_name, column_name)), - style.SQL_KEYWORD('RESTART'), - style.SQL_KEYWORD('WITH'), - style.SQL_FIELD('1') - ) - ) + seq_name = '%s_%s_seq' % (table_name, column_name) else: # sequence name in this case will be <table>_id_seq - sql.append("%s %s %s %s %s %s;" % \ - (style.SQL_KEYWORD('ALTER'), - style.SQL_KEYWORD('SEQUENCE'), - style.SQL_FIELD('%s_id_seq' % table_name), - style.SQL_KEYWORD('RESTART'), - style.SQL_KEYWORD('WITH'), - style.SQL_FIELD('1') - ) + seq_name = '%s_id_seq' % table_name + sql.append('%s %s %s;' % \ + (style.SQL_KEYWORD('DROP'), + style.SQL_KEYWORD('SEQUENCE'), + style.SQL_FIELD(seq_name)) + ) + sql.append('%s %s %s;' % \ + (style.SQL_KEYWORD('CREATE'), + style.SQL_KEYWORD('SEQUENCE'), + style.SQL_FIELD(seq_name)) ) return sql else: return [] +def get_drop_sequence(table): + name_length = get_max_name_length() - 3 + sq_name = '%s_sq' % util.truncate_name(table, name_length) + drop_sequence_sql = 'DROP SEQUENCE %s;' % sq_name + return drop_sequence_sql + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': "LIKE %s ESCAPE '\\'", diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index 982689523e..a76df6ae17 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -158,10 +158,12 @@ def _create_test_db(cursor, parameters, verbosity): print "_create_test_db(): dbname = %s" % parameters['dbname'] statements = [ """CREATE TABLESPACE %(tblspace)s - DATAFILE '%(tblspace)s.dbf' SIZE 10M AUTOEXTEND ON NEXT 10M MAXSIZE 20M + DATAFILE '%(tblspace)s.dbf' SIZE 20M + REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M """, """CREATE TEMPORARY TABLESPACE %(tblspace_temp)s - TEMPFILE '%(tblspace_temp)s.dbf' SIZE 10M AUTOEXTEND ON NEXT 10M MAXSIZE 20M + TEMPFILE '%(tblspace_temp)s.dbf' SIZE 20M + REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M """, ] _execute_statements(cursor, statements, parameters, verbosity) diff --git a/django/db/models/query.py b/django/db/models/query.py index a707bc3996..0be2280125 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -742,7 +742,11 @@ def get_where_clause(lookup_type, table_prefix, field_name, value): if lookup_type == 'in': in_string = ','.join(['%s' for id in value]) if in_string: - return '%s%s IN (%s)' % (table_prefix, field_name, in_string) + if value: + value_set = ','.join(['%s' for v in value]) + else: + value_set = 'NULL' + return '%s%s IN (%s)' % (table_prefix, field_name, value_set) else: raise EmptyResultSet elif lookup_type in ('range', 'year'): diff --git a/django/utils/tzinfo.py b/django/utils/tzinfo.py index cc9f028e91..abfe86cc7c 100644 --- a/django/utils/tzinfo.py +++ b/django/utils/tzinfo.py @@ -46,7 +46,7 @@ class LocalTimezone(tzinfo): return time.tzname[self._isdst(dt)] def _isdst(self, dt): - tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) + tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, -1) stamp = time.mktime(tt) tt = time.localtime(stamp) return tt.tm_isdst > 0 |