diff options
| author | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-04-10 23:41:54 +0000 |
|---|---|---|
| committer | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-04-10 23:41:54 +0000 |
| commit | f44429224a874dac9028f56d6803d1f1dc1b382f (patch) | |
| tree | 6cca60af97088e877e23d1b3f1286638295a6a5f | |
| parent | 0b57189aa27862f2b0a09f7e62e9a3a70ddcb328 (diff) | |
boulder-oracle-sprint: Fixed fixtures_regress test case by implementing
get_sql_sequence_reset() in the Oracle backend. Thanks, Ian Kelly.
git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@4995 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/db/backends/oracle/base.py | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index e95fffcf76..4387991337 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -225,8 +225,34 @@ def get_sequence_name(table): def get_sql_sequence_reset(style, model_list): "Returns a list of the SQL statements to reset sequences for the given models." - # TODO: Run ALTER statements to reset Oracle sequence w/out dropping it. - return [] + from django.db import models + output = [] + query = """ + DECLARE + startvalue integer; + cval integer; + BEGIN + SELECT NVL(MAX(id), 0) INTO startvalue FROM %(table)s; + SELECT %(sequence)s.nextval INTO cval FROM dual; + cval := startvalue - cval; + IF cval != 0 THEN + EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s MINVALUE 0 INCREMENT BY '||cval; + SELECT %(sequence)s.nextval INTO cval FROM dual; + EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s INCREMENT BY 1'; + END IF; + END; """ + for model in model_list: + for f in model._meta.fields: + if isinstance(f, models.AutoField): + sequence_name = get_sequence_name(model._meta.db_table) + query1 = query % {'sequence':sequence_name, 'table':model._meta.db_table} + output.append(query1) + break # Only one AutoField is allowed per model, so don't bother continuing. + for f in model._meta.many_to_many: + sequence_name = get_sequence_name(f.m2m_db_table()) + query2 = query % {'sequence':sequence_name, 'table':f.m2m_db_table()} + output.append(query2) + return output def get_trigger_name(table): name_length = get_max_name_length() - 3 |
