writesDone && $this->dbw ) { $db = $this->dbw; // see the changes in finishWrite() } else { $db = wfGetDB( DB_REPLICA ); } $value = $db->selectField( 'l10n_cache', 'lc_value', [ 'lc_lang' => $code, 'lc_key' => $key ], __METHOD__ ); return ( $value !== false ) ? unserialize( $db->decodeBlob( $value ) ) : null; } public function startWrite( $code ) { if ( $this->readOnly ) { return; } elseif ( !$code ) { throw new MWException( __METHOD__ . ": Invalid language \"$code\"" ); } $this->dbw = wfGetDB( DB_MASTER ); $this->readOnly = $this->dbw->isReadOnly(); $this->currentLang = $code; $this->batch = []; } public function finishWrite() { if ( $this->readOnly ) { return; } elseif ( is_null( $this->currentLang ) ) { throw new MWException( __CLASS__ . ': must call startWrite() before finishWrite()' ); } $this->dbw->startAtomic( __METHOD__ ); try { $this->dbw->delete( 'l10n_cache', [ 'lc_lang' => $this->currentLang ], __METHOD__ ); foreach ( array_chunk( $this->batch, 500 ) as $rows ) { $this->dbw->insert( 'l10n_cache', $rows, __METHOD__ ); } $this->writesDone = true; } catch ( DBQueryError $e ) { if ( $this->dbw->wasReadOnlyError() ) { $this->readOnly = true; // just avoid site down time } else { throw $e; } } $this->dbw->endAtomic( __METHOD__ ); $this->currentLang = null; $this->batch = []; } public function set( $key, $value ) { if ( $this->readOnly ) { return; } elseif ( is_null( $this->currentLang ) ) { throw new MWException( __CLASS__ . ': must call startWrite() before set()' ); } $this->batch[] = [ 'lc_lang' => $this->currentLang, 'lc_key' => $key, 'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) ]; } }