aboutsummaryrefslogtreecommitdiffstats
path: root/includes/ExternalStoreDB.php
blob: 3c61726523fb10dc2772ebe04dedce33930082f7 (plain) (blame)
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
<?php
/**
 * 
 * @package MediaWiki
 *
 * DB accessable external objects
 *
 */
require_once( 'LoadBalancer.php' ); 


/** @package MediaWiki */

class ExternalStoreDB {
	var $loadBalancers = array();
	
	/**
	 * Fetch data from given URL
	 * @param string $url An url
	 */

	function &getLoadBalancer( $cluster ) {
		global $wgExternalServers;
		if ( !array_key_exists( $cluster, $this->loadBalancers ) ) {
			$this->loadBalancers[$cluster] = LoadBalancer::newFromParams( $wgExternalServers[$cluster] );
		}
		return $this->loadBalancers[$cluster];
	}
	
	function &getSlave( $cluster ) {
		$lb =& $this->getLoadBalancer( $cluster );
		return $lb->getConnection( DB_SLAVE );
	}

	function &getMaster( $cluster ) {
		$lb =& $this->getLoadBalancer( $cluster );
		return $lb->getConnection( DB_MASTER );
	}		
	
	function fetchFromURL($url) {
		global $wgExternalServers;
		#
		# URLs have the form DB://cluster/id or DB://cluster/id/itemid for concatenated storage
		#
		$path = explode( '/', $url );
		$cluster  = $path[2];
		$id	  = $path[3];
		if ( isset( $path[4] ) ) {
			$itemID = $path[4];
		} else {
			$itemID = false;
		}

		$dbr =& $this->getSlave( $cluster );
		$ret = $dbr->selectField( 'blobs', 'blob_text', array( 'blob_id' => $id ) ); 

		if ( $itemID !== false ) {
			# Unserialise object and get item
			$obj = unserialize( $ret );
			$ret = $obj->getItem( $itemID );
		}
		return $ret;
	}

	/**
	 * Insert a data item into a given cluster
	 *
	 * @param string $cluster The cluster name
	 * @param string $data The data item
	 * @return string URL
	 */
	function store( $cluster, $data ) {
		global $wgExternalServers;
		$fname = 'ExternalStoreDB::store';

		$dbw =& $this->getMaster( $cluster );

		$id = $dbw->nextSequenceValue( 'blob_blob_id_seq' );
		$dbw->insert( 'blobs', array( 'blob_id' => $id, 'blob_text' => $data ), $fname );
		return "DB://$cluster/" . $dbw->insertId();
	}
}
?>