From 945c4ddf2474c7b1732619c205b074d4ccc0ad95 Mon Sep 17 00:00:00 2001 From: Boulder Sprinters Date: Fri, 16 Mar 2007 04:58:36 +0000 Subject: [PATCH] Fixed sequence naming bug. 93 of 100 tests pass now. git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@4740 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/management.py | 2 +- django/db/backends/oracle/base.py | 38 ++++++++++++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/django/core/management.py b/django/core/management.py index 01169fa48f..01739f6e1f 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -213,7 +213,7 @@ def _get_sql_model_create(model, known_models=set()): full_statement.append(');') final_output.append('\n'.join(full_statement)) - if opts.has_auto_field: + if opts.has_auto_field and hasattr(backend, 'get_autoinc_sql'): # Add any extra SQL needed to support auto-incrementing primary keys autoinc_sql = backend.get_autoinc_sql(opts.db_table) if autoinc_sql: diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 35b053fafb..20aed3feee 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -108,13 +108,14 @@ class FormatStylePlaceholderCursor(Database.Cursor): query, params = self._rewrite_args(query, params) return Database.Cursor.executemany(self, query, params) - def quote_name(name): - # Oracle requires that quoted names be uppercase. - name = name.upper() + # SQL92 requires delimited (quoted) names to be case-sensitive. When + # not quoted, Oracle has case-insensitive behavior for identifiers, but + # always defaults to uppercase. + # We simplify things by making Oracle identifiers always uppercase. if not name.startswith('"') and not name.endswith('"'): name = '"%s"' % util.truncate_name(name.upper(), get_max_name_length()) - return name + return name.upper() dictfetchone = util.dictfetchone dictfetchmany = util.dictfetchmany @@ -169,9 +170,8 @@ def get_max_name_length(): def get_autoinc_sql(table): # To simulate auto-incrementing primary keys in Oracle, we have to # create a sequence and a trigger. - name_length = get_max_name_length() - 3 - sq_name = '%s_sq' % util.truncate_name(table, name_length) - tr_name = '%s_tr' % util.truncate_name(table, name_length) + sq_name = get_sequence_name(table) + tr_name = get_trigger_name(table) sequence_sql = 'CREATE SEQUENCE %s;' % sq_name trigger_sql = """CREATE OR REPLACE TRIGGER %s BEFORE INSERT ON %s @@ -203,13 +203,7 @@ def get_sql_flush(style, tables, sequences): # 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 __seq - seq_name = '%s_%s_seq' % (table_name, column_name) - else: - # sequence name in this case will be
_id_seq - seq_name = '%s_id_seq' % table_name + seq_name = get_sequence_name(table_name) sql.append('%s %s %s;' % \ (style.SQL_KEYWORD('DROP'), style.SQL_KEYWORD('SEQUENCE'), @@ -224,11 +218,19 @@ def get_sql_flush(style, tables, sequences): else: return [] -def get_drop_sequence(table): +def get_sequence_name(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 + return '%s_SQ' % util.truncate_name(table, name_length).upper() + +def get_trigger_name(table): + name_length = get_max_name_length() - 3 + return '%s_TR' % util.truncate_name(table, name_length).upper() + +def get_create_sequence(table): + return 'CREATE SEQUENCE %s;' % get_sequence_name(table) + +def get_drop_sequence(table): + return 'DROP SEQUENCE %s;' % get_sequence_name(table) def get_query_set_class(DefaultQuerySet): "Create a custom QuerySet class for Oracle."