2015-12-25 3 views
1

Какой крючок нужно подключить, чтобы определить, когда добавляется новый комментарий к ошибке?В расширении Bugzilla, как можно добавить новый комментарий?

Мой прецедент заключается в том, что всякий раз, когда добавляется комментарий, мне нужно обработать все комментарии и выполнить какое-то действие на основе этого. Однако это действие «дорого», поэтому я не хочу выполнять действие, если комментарий не был добавлен.

Единственный способ, который я нашел до сих пор, чтобы определить это крюк в object_end_of_update с кодом:

sub object_end_of_update { 
    my ($self, $args) = @_; 

    my ($object, $old_object, $changes) = @$args{qw(object old_object changes)}; 
    print STDERR "--- Object Type: " . ref $object; 
    if ($object->isa('Bugzilla::Bug')) { 
    # Load comments on the old object here, otherwise by the time we get 
    # to bug_end_of_update it is too late, and we cannot determine if a 
    # new comment has been added or not. 
    $old_object->comments({order=>'oldest_to_newest'}); 
    } 
} 

, а затем крючок в bug_end_of_update, после чего я могу сделать что-то вроде:

sub bug_end_of_update { 
    my ($self, $args) = @_; 

    my ($bug, $old_bug, $timestamp, $changes) = @$args{qw(bug old_bug timestamp changes)}; 
    # Note that this will only work if the old comments have already been 
    # loaded in object_end_of_update, otherwise when we get the old comments 
    # here, it just goes to the DB, and gets all of the comments, including 
    # the new one, if there is one. 
    my $oldComments = $old_bug->comments({order=>'oldest_to_newest'}); 
    my $newComments = $bug->comments({order=>'oldest_to_newest'}); 
    if (scalar(@$newComments) > scalar(@$oldComments)) { 
    # If we added a new comment, then perform processing. 
    do_slow_action($bug); 
    } 
} 

Однако это чувствует себя хрупким, и даже если это не так, это определенно непонятный код.

Каков правильный способ определить, что комментарий добавлен в ошибку bugzilla?

ответ

0

Вместо добавления к исходному коду Bugzilla. Вы можете добавить триггер базы данных, который запускается всякий раз, когда обновление появлялось в комментариях к полю.

Преимущество в том, что до тех пор, пока схема базы данных не изменится слишком сильно с более новыми версиями, триггер будет продолжать работать. (дополнительная информация: Database triggers).

Вот пример:

use bugs; 

create TRIGGER new_comment 
AFTER UPDATE ON bugs_fulltext 
FOR EACH ROW BEGIN 

IF NEW.comments <> OLD.comments 
THEN 

.... //execute your script 

END IF 
END; 
+0

Хотя я знаю, что это можно назвать веб-службы из базы данных, этот конец будет до распространения логики в большем количестве мест, чем хотелось бы. –

Смежные вопросы