Personal tools




Extension:DatabaseFetchHook.php

From OrganicDesign Wiki

Jump to: navigation, search
<?php
# Extension:DatabaseFetchHook
{|class="message"
|-
|
{|style="background:none;border:none;margin:0;padding:0;vertical-align:middle;"
|[[Image:Voodoo.svg|100px]]
|<div style=width:100%>This code exhibits [[w:Voodoo programming|voodoo programming]] techniques. The most common of these is extending an instance's class at [[w:runtime|runtime]] after it has been instantiated, a technique that can be used to provide additional [[MW:Manual:Hooks|hooks]] into existing code without requiring modification of code-base files. For a list of all our scripts which exhibit voodoo, see [[:Category:Code that uses voodoo]].</div>
|}
|}
[[Category:Code that uses voodoo]]
# - See http://www.mediawiki.org/wiki/Extension:DatabaseFetchHook for installation and usage details
# - Started: 2007-03-05
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
define('DFH_VERSION','2.0.0, 2007-10-11');
 
$wgExtensionCredits['parserhook'][] = array(
	'name'        => "DatabaseFetchHook",
	'author'      => '[http://www.organicdesign.co.nz/nad User:Nad]',
	'description' => 'Dynamically adds a new hook to intercept the database fetchObject and fetchRow methods',
	'url'         => 'http://www.mediawiki.org/wiki/Extension:DatabaseFetchHook',
	'version'     => DFH_VERSION
	);
 
$wgExtensionFunctions[] = 'wfSetupDatabaseFetchHook';
function wfSetupDatabaseFetchHook() {
	global $wgLoadBalancer,$wgDBtype;
 
	wfGetDB(); # This ensures that $wgLoadBalancer is not a stub object when we subclass it
 
	# Create a replica of the Database class which calls the hook in its fetch methods
	$type = ucfirst($wgDBtype);
	eval("class Database{$type}2 extends Database{$type}".' {
 
		function fetchObject($res) {
			$row = parent::fetchObject($res);
			wfRunHooks("DatabaseFetchHook", array(&$this,&$row));
			return $row;
			}
 
		function fetchRow($res) {
			$row = parent::fetchRow($res);
			wfRunHooks("DatabaseFetchHook", array(&$this,&$row));
			return $row;
			}
		}');
 
	# Create a replica of the LoadBalancer class which uses the new Database class for its connection objects
	$LoadBalancer  = get_class($wgLoadBalancer);
	$LoadBalancer2 = $LoadBalancer."2";
	eval("class $LoadBalancer2 extends $LoadBalancer".' {
		function reallyOpenConnection(&$server) {
			$server["type"] .= "2";
			$db =& parent::reallyOpenConnection($server);
			return $db;
			}
		}');
 
	# Replace the global $wgLoadBalancer object with an identical instance of the new LoadBalancer2 class
	$wgLoadBalancer->closeAll(); # Close any open connections as they will be of the original Database class
	$oldLoadBalancer = $wgLoadBalancer;
	$wgLoadBalancer  = new $LoadBalancer2($oldLoadBalancer->mServers);
	foreach(array_keys(get_class_vars($LoadBalancer)) as $k) $wgLoadBalancer->$k = $oldLoadBalancer->$k;
 
	}
 
?>

The GNU Project Debian Linux Ubuntu Linux Wikipedia Affiliate Button MediaWiki