Modify

Opened 5 years ago

Closed 4 years ago

#6421 closed defect (duplicate)

[PATCH] Postgres: Saving changes to tickets blocking/blockedby violates an integrity constraint.

Reported by: theyranos@… Owned by: coderanger
Priority: normal Component: MasterTicketsPlugin
Severity: normal Keywords:
Cc: Trac Release: 0.11

Description

The web browser just shows Postgres's unhelpful "transaction aborted" error message with a traceback.

Here's the originating error, a traceback from trac.log:

2010-01-12 18:16:32,878 Trac[main] ERROR: duplicate key value violates unique constraint "ticket_change_pkey"
Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/trac/web/main.py", line 423, in _dispatch_request
    dispatcher.dispatch(req)
  File "/usr/lib/python2.6/dist-packages/trac/web/main.py", line 197, in dispatch
    resp = chosen_handler.process_request(req)
  File "/usr/lib/python2.6/dist-packages/trac/ticket/web_ui.py", line 170, in process_request
    return self._process_ticket_request(req)
  File "/usr/lib/python2.6/dist-packages/trac/ticket/web_ui.py", line 494, in _process_ticket_request
    self._do_save(req, ticket, action)
  File "/usr/lib/python2.6/dist-packages/trac/ticket/web_ui.py", line 989, in _do_save
    cnum=internal_cnum):
  File "/usr/lib/python2.6/dist-packages/trac/ticket/model.py", line 282, in save_changes
    listener.ticket_changed(self, comment, author, old_values)
  File "build/bdist.macosx-10.6-universal/egg/mastertickets/api.py", line 105, in ticket_changed
    links.save(author, comment, tkt.time_changed, db)
  File "build/bdist.macosx-10.6-universal/egg/mastertickets/model.py", line 69, in save
    (n, when_ts, author, field, old_value, new_value))
  File "/usr/lib/python2.6/dist-packages/trac/db/util.py", line 50, in execute
    return self.cursor.execute(sql_escape_percent(sql), args)
  File "/usr/lib/python2.6/dist-packages/trac/db/util.py", line 50, in execute
    return self.cursor.execute(sql_escape_percent(sql), args)
IntegrityError: duplicate key value violates unique constraint "ticket_change_pkey"

Here's my patch, made against [7387]:

Index: 0.11/mastertickets/model.py
===================================================================
--- 0.11/mastertickets/model.py	(revision 7387)
+++ 0.11/mastertickets/model.py	(working copy)
@@ -27,7 +27,7 @@
         self.blocked_by = set([num for num, in cursor])
         self._old_blocked_by = copy.copy(self.blocked_by)
         
-    def save(self, author, comment='', when=None, db=None):
+    def save(self, author, comment=None, when=None, db=None):
         """Save new links."""
         if when is None:
             when = datetime.now(utc)
@@ -69,8 +69,14 @@
                                    (n, when_ts, author, field, old_value, new_value))
                                    
                     if comment:
-                        cursor.execute('INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue) VALUES (%s, %s, %s, %s, %s, %s)', 
-                                       (n, when_ts, author, 'comment', '', '(In #%s) %s'%(self.tkt.id, comment)))
+                        comment_text = '(In #%s) %s' % (self.tkt.id, comment)
+                        cursor.execute('SELECT newvalue FROM ticket_change WHERE ticket=%s AND time=%s AND author=%s AND field=%s', (n, when_ts, author, 'comment'))
+                        if cursor.rowcount:
+                            new_value = cursor.fetchone()[0] + '\n\n' + comment_text
+                            cursor.execute('UPDATE ticket_change SET newvalue=%s WHERE ticket=%s AND time=%s AND author=%s AND field=%s', (comment_text, n, when_ts, author, 'comment'))
+                        else:
+                            cursor.execute('INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue) VALUES (%s, %s, %s, %s, %s, %s)', 
+                                       (n, when_ts, author, 'comment', '', comment_text))
                                    
                            
                     cursor.execute('UPDATE ticket_custom SET value=%s WHERE ticket=%s AND name=%s',

This fixes the problem for the postgres backend, but I have not tested whether it breaks sqlite.

Attachments (0)

Change History (2)

comment:1 Changed 4 years ago by boonekamp

Isn't this a duplicate of #2658?

Fixed in MasterTickets 3.0 for Trac 0.12. See:

http://github.com/nielx/trac-mastertickets/commit/ae03a927c629cc1df790b261202e2efea1da1805

comment:2 Changed 4 years ago by boonekamp

  • Resolution set to duplicate
  • Status changed from new to closed

Add Comment

Modify Ticket

Action
as closed The owner will remain coderanger.
The resolution will be deleted. Next status will be 'reopened'.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.