ThreadItemStore: Add details to row insertion exceptions

Bug: T343859
Change-Id: Ic0d741c192f42a3bd54276259820f25edcb0705b
This commit is contained in:
Bartosz Dziewoński 2023-09-14 20:41:34 +02:00 committed by Bartosz Dziewoński
parent d315c901f2
commit 6b633803c8
2 changed files with 22 additions and 9 deletions

View file

@ -26,9 +26,10 @@ $cfg['exclude_analysis_directory_list'] = array_merge(
$cfg['warn_about_undocumented_throw_statements'] = true; $cfg['warn_about_undocumented_throw_statements'] = true;
$cfg['exception_classes_with_optional_throws_phpdoc'] = [ $cfg['exception_classes_with_optional_throws_phpdoc'] = [
'LogicException', LogicException::class,
'RuntimeException', RuntimeException::class,
'DOMException', DOMException::class,
Wikimedia\NormalizedException\NormalizedException::class,
]; ];
$cfg['warn_about_undocumented_exceptions_thrown_by_invoked_functions'] = true; $cfg['warn_about_undocumented_exceptions_thrown_by_invoked_functions'] = true;

View file

@ -5,7 +5,6 @@ namespace MediaWiki\Extension\DiscussionTools;
use Config; use Config;
use ConfigFactory; use ConfigFactory;
use Exception; use Exception;
use LogicException;
use MediaWiki\Extension\DiscussionTools\ThreadItem\CommentItem; use MediaWiki\Extension\DiscussionTools\ThreadItem\CommentItem;
use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseCommentItem; use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseCommentItem;
use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseHeadingItem; use MediaWiki\Extension\DiscussionTools\ThreadItem\DatabaseHeadingItem;
@ -19,6 +18,7 @@ use MWTimestamp;
use ReadOnlyMode; use ReadOnlyMode;
use stdClass; use stdClass;
use TitleFormatter; use TitleFormatter;
use Wikimedia\NormalizedException\NormalizedException;
use Wikimedia\Rdbms\DBError; use Wikimedia\Rdbms\DBError;
use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\ILBFactory; use Wikimedia\Rdbms\ILBFactory;
@ -346,9 +346,12 @@ class ThreadItemStore {
* @param callable $find Function that does a SELECT and returns primary key field * @param callable $find Function that does a SELECT and returns primary key field
* @param callable $insert Function that does an INSERT IGNORE and returns last insert ID * @param callable $insert Function that does an INSERT IGNORE and returns last insert ID
* @param bool &$didInsert Set to true if the insert succeeds * @param bool &$didInsert Set to true if the insert succeeds
* @param RevisionRecord $rev For error logging
* @return int Return value of whichever function succeeded * @return int Return value of whichever function succeeded
*/ */
private function findOrInsertIdButTryHarder( callable $find, callable $insert, bool &$didInsert ) { private function findOrInsertIdButTryHarder(
callable $find, callable $insert, bool &$didInsert, RevisionRecord $rev
) {
$dbw = $this->dbProvider->getPrimaryDatabase(); $dbw = $this->dbProvider->getPrimaryDatabase();
$id = $find( $dbw ); $id = $find( $dbw );
@ -363,7 +366,13 @@ class ThreadItemStore {
->getConnection( DB_PRIMARY, [], false, ILoadBalancer::CONN_TRX_AUTOCOMMIT ); ->getConnection( DB_PRIMARY, [], false, ILoadBalancer::CONN_TRX_AUTOCOMMIT );
$id = $find( $dbwAnother ); $id = $find( $dbwAnother );
if ( !$id ) { if ( !$id ) {
throw new LogicException( "Database can't find our row and won't let us insert it" ); throw new NormalizedException(
"Database can't find our row and won't let us insert it on page {page} revision {revision}",
[
'page' => $rev->getPageId(),
'revision' => $rev->getId(),
]
);
} }
} }
} }
@ -418,7 +427,8 @@ class ThreadItemStore {
->execute(); ->execute();
return $dbw->affectedRows() ? $dbw->insertId() : null; return $dbw->affectedRows() ? $dbw->insertId() : null;
}, },
$didInsert $didInsert,
$rev
); );
$itemIdsIds[ $item->getId() ] = $itemIdsId; $itemIdsIds[ $item->getId() ] = $itemIdsId;
} }
@ -455,7 +465,8 @@ class ThreadItemStore {
->execute(); ->execute();
return $dbw->affectedRows() ? $dbw->insertId() : null; return $dbw->affectedRows() ? $dbw->insertId() : null;
}, },
$didInsert $didInsert,
$rev
); );
$itemsIds[ $item->getId() ] = $itemsId; $itemsIds[ $item->getId() ] = $itemsId;
} }
@ -615,7 +626,8 @@ class ThreadItemStore {
->execute(); ->execute();
return $dbw->affectedRows() ? $dbw->insertId() : null; return $dbw->affectedRows() ? $dbw->insertId() : null;
}, },
$didInsert $didInsert,
$rev
); );
} }
} }