X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fobjectcache%2FSqlBagOStuff.php;h=e6a8c45ed954974ee6cf02bf036f898bff79cd19;hb=9221f5ffd09b4f7347dbd5e251c96733c1becba1;hp=74b5de259e74488f7001bd84d4e164c8a605575e;hpb=34ffc500e4bf4ba5efbd3eae3c5b93af526a26ae;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php index 74b5de259e..e6a8c45ed9 100644 --- a/includes/objectcache/SqlBagOStuff.php +++ b/includes/objectcache/SqlBagOStuff.php @@ -70,7 +70,7 @@ class SqlBagOStuff extends BagOStuff { * distributed across all tables by key hash. This is for * MySQL bugs 61735 and 61736. * - * @param $params array + * @param array $params */ public function __construct( $params ) { if ( isset( $params['servers'] ) ) { @@ -101,7 +101,7 @@ class SqlBagOStuff extends BagOStuff { /** * Get a connection to the specified database * - * @param $serverIndex integer + * @param int $serverIndex * @return DatabaseBase */ protected function getDB( $serverIndex ) { @@ -155,8 +155,8 @@ class SqlBagOStuff extends BagOStuff { /** * Get the server index and table name for a given key - * @param $key string - * @return Array: server index and table name + * @param string $key + * @return array Server index and table name */ protected function getTableByKey( $key ) { if ( $this->shards > 1 ) { @@ -178,7 +178,7 @@ class SqlBagOStuff extends BagOStuff { /** * Get the table name for a given shard index - * @param $index int + * @param int $index * @return string */ protected function getTableNameByShard( $index ) { @@ -192,8 +192,8 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $key string - * @param $casToken[optional] mixed + * @param string $key + * @param mixed $casToken [optional] * @return mixed */ public function get( $key, &$casToken = null ) { @@ -206,8 +206,8 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $keys array - * @return Array + * @param array $keys + * @return array */ public function getMulti( array $keys ) { $values = array(); // array of (key => value) @@ -272,9 +272,79 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $key string - * @param $value mixed - * @param $exptime int + * @param array $data + * @param int $expiry + * @return bool + */ + public function setMulti( array $data, $expiry = 0 ) { + $keysByTable = array(); + foreach ( $data as $key => $value ) { + list( $serverIndex, $tableName ) = $this->getTableByKey( $key ); + $keysByTable[$serverIndex][$tableName][] = $key; + } + + $this->garbageCollect(); // expire old entries if any + + $result = true; + $exptime = (int)$expiry; + foreach ( $keysByTable as $serverIndex => $serverKeys ) { + try { + $db = $this->getDB( $serverIndex ); + } catch ( DBError $e ) { + $this->handleWriteError( $e, $serverIndex ); + $result = false; + continue; + } + + if ( $exptime < 0 ) { + $exptime = 0; + } + + if ( $exptime == 0 ) { + $encExpiry = $this->getMaxDateTime( $db ); + } else { + if ( $exptime < 3.16e8 ) { # ~10 years + $exptime += time(); + } + $encExpiry = $db->timestamp( $exptime ); + } + foreach ( $serverKeys as $tableName => $tableKeys ) { + $rows = array(); + foreach ( $tableKeys as $key ) { + $rows[] = array( + 'keyname' => $key, + 'value' => $db->encodeBlob( $this->serialize( $data[$key] ) ), + 'exptime' => $encExpiry, + ); + } + + try { + $db->commit( __METHOD__, 'flush' ); + $db->replace( + $tableName, + array( 'keyname' ), + $rows, + __METHOD__ + ); + $db->commit( __METHOD__, 'flush' ); + } catch ( DBError $e ) { + $this->handleWriteError( $e, $serverIndex ); + $result = false; + } + + } + + } + + return $result; + } + + + + /** + * @param string $key + * @param mixed $value + * @param int $exptime * @return bool */ public function set( $key, $value, $exptime = 0 ) { @@ -317,10 +387,10 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $casToken mixed - * @param $key string - * @param $value mixed - * @param $exptime int + * @param mixed $casToken + * @param string $key + * @param mixed $value + * @param int $exptime * @return bool */ public function cas( $casToken, $key, $value, $exptime = 0 ) { @@ -368,8 +438,8 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $key string - * @param $time int + * @param string $key + * @param int $time * @return bool */ public function delete( $key, $time = 0 ) { @@ -391,8 +461,8 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $key string - * @param $step int + * @param string $key + * @param int $step * @return int|null */ public function incr( $key, $step = 1 ) { @@ -444,7 +514,7 @@ class SqlBagOStuff extends BagOStuff { } /** - * @param $exptime string + * @param string $exptime * @return bool */ protected function isExpired( $db, $exptime ) { @@ -452,6 +522,7 @@ class SqlBagOStuff extends BagOStuff { } /** + * @param DatabaseBase $db * @return string */ protected function getMaxDateTime( $db ) { @@ -485,8 +556,8 @@ class SqlBagOStuff extends BagOStuff { /** * Delete objects from the database which expire before a certain date. - * @param $timestamp string - * @param $progressCallback bool|callback + * @param string $timestamp + * @param bool|callable $progressCallback * @return bool */ public function deleteObjectsExpiringBefore( $timestamp, $progressCallback = false ) { @@ -583,7 +654,7 @@ class SqlBagOStuff extends BagOStuff { * On typical message and page data, this can provide a 3X decrease * in storage requirements. * - * @param $data mixed + * @param mixed $data * @return string */ protected function serialize( &$data ) { @@ -598,7 +669,7 @@ class SqlBagOStuff extends BagOStuff { /** * Unserialize and, if necessary, decompress an object. - * @param $serial string + * @param string $serial * @return mixed */ protected function unserialize( $serial ) { @@ -619,6 +690,9 @@ class SqlBagOStuff extends BagOStuff { /** * Handle a DBError which occurred during a read operation. + * + * @param DBError $exception + * @param int $serverIndex */ protected function handleReadError( DBError $exception, $serverIndex ) { if ( $exception instanceof DBConnectionError ) { @@ -636,6 +710,9 @@ class SqlBagOStuff extends BagOStuff { /** * Handle a DBQueryError which occurred during a write operation. + * + * @param DBError $exception + * @param int $serverIndex */ protected function handleWriteError( DBError $exception, $serverIndex ) { if ( $exception instanceof DBConnectionError ) { @@ -658,6 +735,9 @@ class SqlBagOStuff extends BagOStuff { /** * Mark a server down due to a DBConnectionError exception + * + * @param DBError $exception + * @param int $serverIndex */ protected function markServerDown( $exception, $serverIndex ) { if ( isset( $this->connFailureTimes[$serverIndex] ) ) {