Host multiple sites with the same codebase

This is the beginning of the code for status.net and related status
farms. It will read basic information about a site from a shared,
central database and use the data stored there to switch on the
hostname.
This commit is contained in:
Evan Prodromou 2009-04-07 17:10:54 -04:00
parent 95bb1c6a99
commit 60861760fc
4 changed files with 103 additions and 0 deletions

61
classes/Status_network.php Executable file
View File

@ -0,0 +1,61 @@
<?php
/**
* Table Definition for status_network
*/
class Status_network extends DB_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
public $__table = 'status_network'; // table name
public $nickname; // varchar(64) primary_key not_null
public $hostname; // varchar(255) unique_key
public $pathname; // varchar(255) unique_key
public $sitename; // varchar(255)
public $dbhost; // varchar(255)
public $dbuser; // varchar(255)
public $dbpass; // varchar(255)
public $dbname; // varchar(255)
public $created; // datetime() not_null
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
/* Static get */
function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Status_network',$k,$v); }
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
static function setupDB($dbhost, $dbuser, $dbpass, $dbname)
{
global $config;
$config['db']['database_'.$dbname] = "mysqli://$dbuser:$dbpass@$dbhost/$dbname";
$config['db']['ini_'.$dbname] = INSTALLDIR.'/classes/statusnet.ini';
$config['db']['table_status_network'] = $dbname;
return true;
}
static function setupSite($servername, $pathname)
{
global $config;
$parts = explode('.', $servername);
$sn = Status_network::staticGet('nickname', $parts[0]);
if (!empty($sn)) {
$dbhost = (empty($sn->dbhost)) ? 'localhost' : $sn->dbhost;
$dbuser = (empty($sn->dbuser)) ? $sn->nickname : $sn->dbuser;
$dbpass = $sn->dbpass;
$dbname = (empty($sn->dbname)) ? $sn->nickname : $sn->dbname;
$config['db']['database'] = "mysqli://$dbuser:$dbpass@$dbhost/$dbname";
$config['site']['name'] = $sn->sitename;
return true;
} else {
return false;
}
}
}

17
classes/statusnet.ini Executable file
View File

@ -0,0 +1,17 @@
[status_network]
nickname = 130
hostname = 2
pathname = 2
sitename = 2
dbhost = 2
dbuser = 2
dbpass = 2
dbname = 2
created = 142
modified = 384
[status_network__keys]
nickname = K
hostname = U
pathname = U

View File

@ -192,3 +192,11 @@ $config['sphinx']['port'] = 3312;
#Use a different hostname for SSL-encrypted pages #Use a different hostname for SSL-encrypted pages
#$config['site']['sslserver'] = 'secure.example.org'; #$config['site']['sslserver'] = 'secure.example.org';
#If you have a lot of status networks on the same server, you can
#store the site data in a database and switch as follows
#Status_network::setupDB('localhost', 'statusnet', 'statuspass', 'statusnet');
#if (!Status_network::setupSite($_server, $_path)) {
# print "Error\n";
# exit(1);
#}

17
db/site.sql Normal file
View File

@ -0,0 +1,17 @@
/* For managing multiple sites */
create table status_network (
nickname varchar(64) primary key comment 'nickname',
hostname varchar(255) unique key comment 'alternate hostname if any',
pathname varchar(255) unique key comment 'alternate pathname if any',
sitename varchar(255) comment 'display name',
dbhost varchar(255) comment 'database host',
dbuser varchar(255) comment 'database username',
dbpass varchar(255) comment 'database password',
dbname varchar(255) comment 'database name',
created datetime not null comment 'date this record was created',
modified timestamp comment 'date this record was modified'
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;