|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @link http://www.yiiframework.com/
|
|
|
|
* @copyright Copyright © 2008 Yii Software LLC
|
|
|
|
* @license http://www.yiiframework.com/license/
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace yii\elasticsearch;
|
|
|
|
|
|
|
|
|
|
|
|
use yii\base\Component;
|
|
|
|
use yii\base\InvalidConfigException;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* elasticsearch Connection is used to connect to an elasticsearch cluster version 0.20 or higher
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @author Carsten Brandt <mail@cebe.cc>
|
|
|
|
* @since 2.0
|
|
|
|
*/
|
|
|
|
class Connection extends Component
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @event Event an event that is triggered after a DB connection is established
|
|
|
|
*/
|
|
|
|
const EVENT_AFTER_OPEN = 'afterOpen';
|
|
|
|
|
|
|
|
// TODO add autodetection of cluster nodes
|
|
|
|
// http://localhost:9200/_cluster/nodes
|
|
|
|
public $nodes = array(
|
|
|
|
array(
|
|
|
|
'host' => 'localhost',
|
|
|
|
'port' => 9200,
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO use timeouts
|
|
|
|
/**
|
|
|
|
* @var float timeout to use for connection to redis. If not set the timeout set in php.ini will be used: ini_get("default_socket_timeout")
|
|
|
|
*/
|
|
|
|
public $connectionTimeout = null;
|
|
|
|
/**
|
|
|
|
* @var float timeout to use for redis socket when reading and writing data. If not set the php default value will be used.
|
|
|
|
*/
|
|
|
|
public $dataTimeout = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function init()
|
|
|
|
{
|
|
|
|
if ($this->nodes === array()) {
|
|
|
|
throw new InvalidConfigException('elasticsearch needs at least one node.');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a command for execution.
|
|
|
|
* @param string $query the SQL statement to be executed
|
|
|
|
* @return Command the DB command
|
|
|
|
*/
|
|
|
|
public function createCommand($query = null, $index = null, $type = null)
|
|
|
|
{
|
|
|
|
$this->open();
|
|
|
|
$command = new Command(array(
|
|
|
|
'db' => $this,
|
|
|
|
'query' => $query,
|
|
|
|
'index' => $index,
|
|
|
|
'type' => $type,
|
|
|
|
));
|
|
|
|
return $command;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Closes the connection when this component is being serialized.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function __sleep()
|
|
|
|
{
|
|
|
|
$this->close();
|
|
|
|
return array_keys(get_object_vars($this));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a value indicating whether the DB connection is established.
|
|
|
|
* @return boolean whether the DB connection is established
|
|
|
|
*/
|
|
|
|
public function getIsActive()
|
|
|
|
{
|
|
|
|
return false; // TODO implement
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Establishes a DB connection.
|
|
|
|
* It does nothing if a DB connection has already been established.
|
|
|
|
* @throws Exception if connection fails
|
|
|
|
*/
|
|
|
|
public function open()
|
|
|
|
{
|
|
|
|
foreach($this->nodes as $key => $node) {
|
|
|
|
if (is_array($node)) {
|
|
|
|
$this->nodes[$key] = new Node($node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* if ($this->_socket === null) {
|
|
|
|
if (empty($this->dsn)) {
|
|
|
|
throw new InvalidConfigException('Connection.dsn cannot be empty.');
|
|
|
|
}
|
|
|
|
$dsn = explode('/', $this->dsn);
|
|
|
|
$host = $dsn[2];
|
|
|
|
if (strpos($host, ':')===false) {
|
|
|
|
$host .= ':6379';
|
|
|
|
}
|
|
|
|
$db = isset($dsn[3]) ? $dsn[3] : 0;
|
|
|
|
|
|
|
|
\Yii::trace('Opening DB connection: ' . $this->dsn, __CLASS__);
|
|
|
|
$this->_socket = @stream_socket_client(
|
|
|
|
$host,
|
|
|
|
$errorNumber,
|
|
|
|
$errorDescription,
|
|
|
|
$this->connectionTimeout ? $this->connectionTimeout : ini_get("default_socket_timeout")
|
|
|
|
);
|
|
|
|
if ($this->_socket) {
|
|
|
|
if ($this->dataTimeout !== null) {
|
|
|
|
stream_set_timeout($this->_socket, $timeout=(int)$this->dataTimeout, (int) (($this->dataTimeout - $timeout) * 1000000));
|
|
|
|
}
|
|
|
|
if ($this->password !== null) {
|
|
|
|
$this->executeCommand('AUTH', array($this->password));
|
|
|
|
}
|
|
|
|
$this->executeCommand('SELECT', array($db));
|
|
|
|
$this->initConnection();
|
|
|
|
} else {
|
|
|
|
\Yii::error("Failed to open DB connection ({$this->dsn}): " . $errorNumber . ' - ' . $errorDescription, __CLASS__);
|
|
|
|
$message = YII_DEBUG ? 'Failed to open DB connection: ' . $errorNumber . ' - ' . $errorDescription : 'Failed to open DB connection.';
|
|
|
|
throw new Exception($message, $errorDescription, (int)$errorNumber);
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
// TODO implement
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Closes the currently active DB connection.
|
|
|
|
* It does nothing if the connection is already closed.
|
|
|
|
*/
|
|
|
|
public function close()
|
|
|
|
{
|
|
|
|
// TODO implement
|
|
|
|
/* if ($this->_socket !== null) {
|
|
|
|
\Yii::trace('Closing DB connection: ' . $this->dsn, __CLASS__);
|
|
|
|
$this->executeCommand('QUIT');
|
|
|
|
stream_socket_shutdown($this->_socket, STREAM_SHUT_RDWR);
|
|
|
|
$this->_socket = null;
|
|
|
|
$this->_transaction = null;
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes the DB connection.
|
|
|
|
* This method is invoked right after the DB connection is established.
|
|
|
|
* The default implementation triggers an [[EVENT_AFTER_OPEN]] event.
|
|
|
|
*/
|
|
|
|
protected function initConnection()
|
|
|
|
{
|
|
|
|
$this->trigger(self::EVENT_AFTER_OPEN);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the name of the DB driver for the current [[dsn]].
|
|
|
|
* @return string name of the DB driver
|
|
|
|
*/
|
|
|
|
public function getDriverName()
|
|
|
|
{
|
|
|
|
return 'elasticsearch';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getNodeInfo()
|
|
|
|
{
|
|
|
|
// TODO HTTP request to localhost:9200/
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getQueryBuilder()
|
|
|
|
{
|
|
|
|
return new QueryBuilder($this);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return \Guzzle\Http\Client
|
|
|
|
*/
|
|
|
|
public function http()
|
|
|
|
{
|
|
|
|
$guzzle = new \Guzzle\Http\Client('http://localhost:9200/');
|
|
|
|
//$guzzle->setDefaultOption()
|
|
|
|
return $guzzle;
|
|
|
|
}
|
|
|
|
}
|