X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fobjectcache%2FSqlBagOStuff.php;h=5313ca41153b33fa6469e28e4a20fbeb1c2c5d07;hb=5f43b1706c9b69928100260085cc5f081e743920;hp=b2d61a892575e168d8eacfec2115e3c14e4a069b;hpb=be8019b967c9d5efeedf42cfee7967de1affa67c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php index b2d61a8925..5313ca4115 100644 --- a/includes/objectcache/SqlBagOStuff.php +++ b/includes/objectcache/SqlBagOStuff.php @@ -234,22 +234,34 @@ class SqlBagOStuff extends BagOStuff { } } - protected function doGet( $key, $flags = 0 ) { + protected function doGet( $key, $flags = 0, &$casToken = null ) { $casToken = null; - return $this->getWithToken( $key, $casToken, $flags ); - } + $blobs = $this->fetchBlobMulti( [ $key ] ); + if ( array_key_exists( $key, $blobs ) ) { + $blob = $blobs[$key]; + $value = $this->unserialize( $blob ); + + $casToken = ( $value !== false ) ? $blob : null; - protected function getWithToken( $key, &$casToken, $flags = 0 ) { - $values = $this->getMulti( [ $key ] ); - if ( array_key_exists( $key, $values ) ) { - $casToken = $values[$key]; - return $values[$key]; + return $value; } + return false; } public function getMulti( array $keys, $flags = 0 ) { + $values = []; + + $blobs = $this->fetchBlobMulti( $keys ); + foreach ( $blobs as $key => $blob ) { + $values[$key] = $this->unserialize( $blob ); + } + + return $values; + } + + public function fetchBlobMulti( array $keys, $flags = 0 ) { $values = []; // array of (key => value) $keysByTable = []; @@ -298,7 +310,7 @@ class SqlBagOStuff extends BagOStuff { if ( $this->isExpired( $db, $row->exptime ) ) { // MISS $this->debug( "get: key has expired" ); } else { // HIT - $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) ); + $values[$key] = $db->decodeBlob( $row->value ); } } catch ( DBQueryError $e ) { $this->handleWriteError( $e, $db, $row->serverIndex ); @@ -344,7 +356,7 @@ class SqlBagOStuff extends BagOStuff { if ( $exptime == 0 ) { $encExpiry = $this->getMaxDateTime( $db ); } else { - $exptime = $this->convertExpiry( $exptime ); + $exptime = $this->convertToExpiry( $exptime ); $encExpiry = $db->timestamp( $exptime ); } foreach ( $serverKeys as $tableName => $tableKeys ) { @@ -406,7 +418,7 @@ class SqlBagOStuff extends BagOStuff { if ( $exptime == 0 ) { $encExpiry = $this->getMaxDateTime( $db ); } else { - $exptime = $this->convertExpiry( $exptime ); + $exptime = $this->convertToExpiry( $exptime ); $encExpiry = $db->timestamp( $exptime ); } // (T26425) use a replace if the db supports it instead of @@ -420,7 +432,7 @@ class SqlBagOStuff extends BagOStuff { ], [ 'keyname' => $key, - 'value' => $db->encodeBlob( $this->serialize( $casToken ) ) + 'value' => $db->encodeBlob( $casToken ) ], __METHOD__ ); @@ -510,7 +522,7 @@ class SqlBagOStuff extends BagOStuff { 'exptime' => $row->exptime ], __METHOD__, - 'IGNORE' + [ 'IGNORE' ] ); if ( $db->affectedRows() == 0 ) { @@ -519,7 +531,7 @@ class SqlBagOStuff extends BagOStuff { } } catch ( DBError $e ) { $this->handleWriteError( $e, $db, $serverIndex ); - return null; + return false; } return $newValue; @@ -534,20 +546,33 @@ class SqlBagOStuff extends BagOStuff { return $ok; } - public function changeTTL( $key, $expiry = 0, $flags = 0 ) { + public function changeTTL( $key, $exptime = 0, $flags = 0 ) { list( $serverIndex, $tableName ) = $this->getTableByKey( $key ); $db = null; $silenceScope = $this->silenceTransactionProfiler(); try { $db = $this->getDB( $serverIndex ); + if ( $exptime == 0 ) { + $timestamp = $this->getMaxDateTime( $db ); + } else { + $timestamp = $db->timestamp( $this->convertToExpiry( $exptime ) ); + } $db->update( $tableName, - [ 'exptime' => $db->timestamp( $this->convertExpiry( $expiry ) ) ], + [ 'exptime' => $timestamp ], [ 'keyname' => $key, 'exptime > ' . $db->addQuotes( $db->timestamp( time() ) ) ], __METHOD__ ); if ( $db->affectedRows() == 0 ) { - return false; + $exists = (bool)$db->selectField( + $tableName, + 1, + [ 'keyname' => $key, 'exptime' => $timestamp ], + __METHOD__, + [ 'FOR UPDATE' ] + ); + + return $exists; } } catch ( DBError $e ) { $this->handleWriteError( $e, $db, $serverIndex );