Edgewall Software

Opened 16 years ago

Closed 15 years ago

Last modified 15 years ago

#6808 closed defect (fixed)

Exception: column name is not unique

Reported by: geert@… Owned by: Eli Carter
Priority: high Milestone: 0.11
Component: admin/web Version: devel
Severity: normal Keywords: exception column name not unique
Cc: Branch:
Release Notes:
API Changes:
Internal Changes:

Description (last modified by Christian Boos)

In the admin section, add a version that already exists.

Python Traceback

Traceback (most recent call last):
  File "/usr/local/lib/python2.4/site-packages/trac/web/main.py", line 406, in dispatch_request
  File "/usr/local/lib/python2.4/site-packages/trac/web/main.py", line 237, in dispatch
    resp = chosen_handler.process_request(req)
  File "/usr/local/lib/python2.4/site-packages/TracWebAdmin-0.1.2-py2.4.egg/webadmin/web_ui.py", line 109, in process_request
  File "/usr/local/lib/python2.4/site-packages/TracWebAdmin-0.1.2-py2.4.egg/webadmin/ticket.py", line 244, in process_admin_request
  File "/usr/local/lib/python2.4/site-packages/trac/ticket/model.py", line 723, in insert
    (self.name, self.time, self.description))
  File "/usr/local/lib/python2.4/site-packages/trac/db/util.py", line 50, in execute
    return self.cursor.execute(sql_escape_percent(sql), args)
  File "/usr/local/lib/python2.4/site-packages/trac/db/sqlite_backend.py", line 56, in execute
    args or [])
  File "/usr/local/lib/python2.4/site-packages/trac/db/sqlite_backend.py", line 48, in _rollback_on_error
    return function(self, *args, **kwargs)
IntegrityError: column name is not unique

Attachments (0)

Change History (8)

comment:1 by osimons, 16 years ago

Version: 0.10.4devel

It exists in trunk as well, and is the same for other enums as well. It also happens from both webadmin and trac-admin.

2 alternatives:

  1. Close it as duplicate of #6348 to handle these exceptions better in a generic manner, as done for #6095.
  2. Look for errors in the code, as it seems like it should support checking for existing names.

Regarding 2, here is what I see in the current trunk trac.ticket.model code (class Version is identical in implementation):

class AbstractEnum(object):
    def __init__(self, env, name=None, db=None):
    exists = property(fget=lambda self: self._old_value is not None)
    def insert(self, db=None):
        assert not self.exists, 'Cannot insert existing %s' % self.type

Just did a quick check in trac.ticket.admin.py code for adding versions, and the reason why this does not trigger is that we do not instantiate by passing the name to __init__() - so self._old_value will not get set:

  • trac/ticket/admin.py

    232232            if req.method == 'POST':
    233233                # Add Version
    234234                if req.args.get('add') and req.args.get('name'):
    235                     ver = model.Version(self.env)
    236                     ver.name = req.args.get('name')
     235                    ver = model.Version(self.env, name=req.args.get('name'))
    237236                    if req.args.get('time'):
    238237                        ver.time = parse_date(req.args.get('time'))
    239238                    ver.insert()

However, doing that it seems that __init__() does not have a fallback of None if it does not exist (no row fetched from datababase), so trying to add a new valid version gives Trac Error:

Version 3.0 does not exist.

Catch-22 it seems… I think we should:

  • Use the pattern of model.Version(self.env, name=req.args.get('name')) in all trac-admin and webadmin code.
  • Modifying __init__() in the various model classes to have a fallback if there is no actual existing instance of that name. Why would we want to raise a TracError in the __init__() code?
  • The code that needs to check for existence should use the the_version.exists property after object creation.

in reply to:  1 comment:2 by Christian Boos, 16 years ago

Replying to osimons:

trying to add a new valid version gives Trac Error:

Version 3.0 does not exist.

That's the usual Trac approach for handling the data model objects: when the constructor gets an identifier, it expects to be able to fetch an existing instance for that identifier. If not, it will raise a TracError. Some have already pointed out the trouble with this approach, see #4130.

comment:3 by Christian Boos, 16 years ago

Priority: lowhigh

#6952 closed as duplicate, as the same consideration applies for all enumerations.

I think we should do #6348 to handle this issue for 0.11.1 and solve the "Catch-22" for 0.22 ;-)

comment:4 by Christian Boos, 16 years ago

Description: modified (diff)

#6855 and #6983 were closed as duplicates.

comment:5 by Eli Carter, 16 years ago

The reported error is now fixed in trunk [6772], with testcases in sandbox/testing [6773] [6775]. There may be a better implementation, but I suggest we close this one.

in reply to:  5 comment:6 by osimons, 16 years ago

Replying to ecarter:

The reported error is now fixed in trunk [6772], with testcases in sandbox/testing [6773] [6775]. There may be a better implementation, but I suggest we close this one.

+1. Let's use #6348 to note the various duplicates and variations of this error - and to hopefully solve it for all.

comment:7 by Christian Boos, 15 years ago

Milestone: 0.130.11
Resolution: fixed
Status: newclosed

Closing, as the specific error with enums was fixed in r6772 and the more general fix will be addressed in #6348.

comment:8 by Christian Boos, 15 years ago

Owner: changed from Christopher Lenz to Eli Carter

Modify Ticket

Change Properties
Set your email in Preferences
as closed The owner will remain Eli Carter.
The resolution will be deleted. Next status will be 'reopened'.
to The owner will be changed from Eli Carter to the specified user.

Add Comment

E-mail address and name can be saved in the Preferences .
Note: See TracTickets for help on using tickets.