-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGlobalDBAccess.php
110 lines (93 loc) · 2.36 KB
/
GlobalDBAccess.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
$wgExtensionCredits['other'][] = array(
'path' => __FILE__,
'name' => 'GlobalDBAccess',
'author' => 'Adam Carter/UltrasonicNXT',
'url' => '',
'description' => 'Allows easy access to DBs on other wikis of a farm',
'version' => 1.0,
);
class GlobalDB {
public $wiki;
public $slave;
public $master;
function __construct( $wiki ){
$this -> wiki = $wiki;
$this -> slave = $this -> getSlave();
$this -> master = $this -> getMaster();
}
function getSlave(){
return $this -> getDB( DB_SLAVE, $this -> wiki );
}
function getMaster( ){
return $this -> getDB( DB_MASTER, $this -> wiki );
}
function getDB( $dbtype, $wiki ){
return wfGetDB( $dbtype, array(), $this -> wiki );
}
static function selectGlobal( array $wikis,
$table,
$vars,
$conds = '',
$fname = __METHOD__,
$options = array(),
$join_conds = array()
){
$dbs = array();
foreach( $wikis as $wiki ){
$db = new GlobalDB( $wiki );
$dbs[$wiki] = $db -> getSlave();
}
$wikiresults = array();
foreach( $dbs as $wiki => $db ){
$result = $db -> select( $table, $vars, $conds, $fname, $options, $join_conds );
$wikiresults[$wiki] = $result;
}
return new GlobalResultWrapper( $wikiresults );
}
}
/*
* Not really like resultwrapper at all, resultwrapper relies heavily
* on using the db object, which we cannot with multiple dbs, but you
* can just about use it in the same way as resultwrapper
*/
class GlobalResultWrapper implements Iterator {
var $db, $result, $pos = 0, $currentRow = null;
function __construct( $wikiResults ) {
foreach( $wikiResults as $wiki => $aResult ){
foreach($aResult as $row){
$row -> wiki = $wiki;
$this -> result[] = $row;
}
}
}
function numRows(){
return count( $this -> result );
}
/*********************
* Iterator functions
* Note that using these in combination with the non-iterator functions
* above may cause rows to be skipped or repeated.
*/
function rewind() {
$this->pos = 0;
$this->currentRow = null;
}
function current() {
if ( is_null( $this->currentRow ) ) {
$this->next();
}
return $this->currentRow;
}
function key() {
return $this->pos;
}
function next() {
$this->pos++;
$this->currentRow = $this->result[$this->pos];
return $this->currentRow;
}
function valid() {
return $this->current() !== false;
}
}