MySQL socket/pipe support
Posted: Sun Sep 12, 2010 4:59 pm
Sometimes for DB connections socket/pipe is used instead of tcp/ip. Whether it is possible to include support of socket/pipe connections in the TeraWURFL?
As an example of typical (but not ideal) procedure of DB connection, let me post the source code from Joomla!CMS (it allows to use both variant: non-standard tcp/ip port or the non-standard socket/pipe):
PS. Using TeraWURFL 2.1.2 we've been forced to use workaround with ini_set:
but as you add support for nonstandard port to 2.1.3, we hope that support for nonstandard sockets/pipes will be added also.
As an example of typical (but not ideal) procedure of DB connection, let me post the source code from Joomla!CMS (it allows to use both variant: non-standard tcp/ip port or the non-standard socket/pipe):
- Code: Select all
function __construct( $options )
{
$host = array_key_exists('host', $options) ? $options['host'] : 'localhost';
$user = array_key_exists('user', $options) ? $options['user'] : '';
$password = array_key_exists('password',$options) ? $options['password'] : '';
$database = array_key_exists('database',$options) ? $options['database'] : '';
$prefix = array_key_exists('prefix', $options) ? $options['prefix'] : 'jos_';
$select = array_key_exists('select', $options) ? $options['select'] : true;
// Unlike mysql_connect(), mysqli_connect() takes the port and socket
// as separate arguments. Therefore, we have to extract them from the
// host string.
$port = NULL;
$socket = NULL;
$targetSlot = substr( strstr( $host, ":" ), 1 );
if (!empty( $targetSlot )) {
// Get the port number or socket name
if (is_numeric( $targetSlot ))
$port = $targetSlot;
else
$socket = $targetSlot;
// Extract the host name only
$host = substr( $host, 0, strlen( $host ) - (strlen( $targetSlot ) + 1) );
// This will take care of the following notation: ":3306"
if($host == '')
$host = 'localhost';
}
// perform a number of fatality checks, then return gracefully
if (!function_exists( 'mysqli_connect' )) {
$this->_errorNum = 1;
$this->_errorMsg = 'The MySQL adapter "mysqli" is not available.';
return;
}
// connect to the server
if (!($this->_resource = @mysqli_connect($host, $user, $password, NULL, $port, $socket))) {
$this->_errorNum = 2;
$this->_errorMsg = 'Could not connect to MySQL';
return;
}
// finalize initialization
parent::__construct($options);
// select the database
if ( $select ) {
$this->select($database);
}
}
PS. Using TeraWURFL 2.1.2 we've been forced to use workaround with ini_set:
- Code: Select all
if(strpos($host, ':')!==false)
{
list($host, $port) = explode(':', $host);
if(is_numeric($port))
ini_set('mysqli.default_port', $port);
else
ini_set('mysqli.default_socket', $port);
}
if($host == '')
$host = 'localhost';
TeraWurflConfig::$DB_HOST = $host;
but as you add support for nonstandard port to 2.1.3, we hope that support for nonstandard sockets/pipes will be added also.