return array();
}
+ /**
+ * Delete all objects expiring before a certain date.
+ *
+ * @return true on success, false if unimplemented
+ */
+ public function deleteObjectsExpiringBefore( $date ) {
+ // stub
+ return false;
+ }
+
/* *** Emulated functions *** */
public function add( $key, $value, $exptime = 0 ) {
array_shift( $args );
foreach ( $this->caches as $cache ) {
- $ret = $ret && call_user_func_array( array( $cache, $method ), $args );
+ if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+ $ret = false;
+ }
}
return $ret;
}
+ /**
+ * Delete objects expiring before a certain date.
+ *
+ * Succeed if any of the child caches succeed.
+ */
+ public function deleteObjectsExpiringBefore( $date ) {
+ $ret = false;
+ foreach ( $this->caches as $cache ) {
+ if ( $cache->deleteObjectsExpiringBefore( $date ) ) {
+ $ret = true;
+ }
+ }
+ return $ret;
+ }
}
}
public function expireAll() {
+ $this->deleteObjectsExpiringBefore( wfTimestampNow() );
+ }
+
+ /**
+ * Delete objects from the database which expire before a certain date.
+ */
+ public function deleteObjectsExpiringBefore( $timestamp ) {
$db = $this->getDB();
- $now = $db->timestamp();
+ $dbTimestamp = $db->timestamp( $timestamp );
try {
for ( $i = 0; $i < $this->shards; $i++ ) {
$db->begin();
$db->delete(
$this->getTableByShard( $i ),
- array( 'exptime < ' . $db->addQuotes( $now ) ),
+ array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) ),
__METHOD__ );
$db->commit();
}
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
}
+ return true;
}
public function deleteAll() {
--- /dev/null
+<?php
+
+require( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class PurgeParserCache extends Maintenance {
+ function __construct() {
+ parent::__construct();
+ $this->addDescription( "Remove old objects from the parser cache. " .
+ "This only works when the parser cache is in an SQL database." );
+ $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
+ $this->addOption( 'age',
+ 'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime '.
+ 'has been consistent.',
+ false, true );
+ }
+
+ function execute() {
+ $inputDate = $this->getOption( 'expiredate' );
+ $inputAge = $this->getOption( 'age' );
+ if ( $inputDate !== null ) {
+ $date = wfTimestamp( TS_MW, strtotime( $inputDate ) );
+ } elseif ( $inputAge !== null ) {
+ global $wgParserCacheExpireTime;
+ $date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
+ } else {
+ echo "Must specify either --expiredate or --age\n";
+ exit( 1 );
+ }
+
+ $english = Language::factory( 'en' );
+ echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
+
+ $pc = wfGetParserCacheStorage();
+ $success = $pc->deleteObjectsExpiringBefore( $date );
+ if ( !$success ) {
+ echo "Cannot purge this kind of parser cache.\n";
+ exit( 1 );
+ }
+ echo "Done\n";
+ }
+}
+$maintClass = 'PurgeParserCache';
+require_once( RUN_MAINTENANCE_IF_MAIN );