19 private ?array $index =
null;
20 private IConnectionProvider $dbProvider;
22 public function __construct() {
23 $this->dbProvider = MediaWikiServices::getInstance()->getConnectionProvider();
26 public function retrieve(
bool $readLatest =
false ): array {
27 if ( $this->index !==
null && !$readLatest ) {
31 $dbr = $readLatest ? $this->dbProvider->getPrimaryDatabase() :
32 $this->dbProvider->getReplicaDatabase();
33 $res = $dbr->newSelectQueryBuilder()
35 ->from(
'translate_messageindex' )
36 ->caller( __METHOD__ )
39 foreach ( $res as $row ) {
40 $this->index[$row->tmi_key] = $this->
unserialize( $row->tmi_value );
47 public function get(
string $key ) {
48 $dbr = $this->dbProvider->getReplicaDatabase();
49 $value = $dbr->newSelectQueryBuilder()
50 ->select(
'tmi_value' )
51 ->from(
'translate_messageindex' )
52 ->where( [
'tmi_key' => $key ] )
53 ->caller( __METHOD__ )
56 return is_string( $value ) ? $this->
unserialize( $value ) :
null;
59 public function store( array $array, array $diff ): void {
62 foreach ( [ $diff[
'add'], $diff[
'mod'] ] as $changes ) {
63 foreach ( $changes as $key => $data ) {
72 $deletions = array_keys( $diff[
'del'] );
74 $dbw = $this->dbProvider->getPrimaryDatabase();
75 $dbw->startAtomic( __METHOD__ );
77 if ( $updates !== [] ) {
78 $dbw->newReplaceQueryBuilder()
79 ->replaceInto(
'translate_messageindex' )
80 ->uniqueIndexFields( [
'tmi_key' ] )
82 ->caller( __METHOD__ )
86 if ( $deletions !== [] ) {
87 $dbw->newDeleteQueryBuilder()
88 ->deleteFrom(
'translate_messageindex' )
89 ->where( [
'tmi_key' => $deletions ] )
90 ->caller( __METHOD__ )
94 $dbw->endAtomic( __METHOD__ );
96 $this->index = $array;