Files
librenms-librenms/src/InfluxDB/Database.php
T

233 lines
4.9 KiB
PHP
Raw Normal View History

<?php
/**
* @author Stephen "TheCodeAssassin" Hoogendijk
*/
2015-06-23 09:19:24 +02:00
namespace InfluxDB;
2015-06-23 09:19:24 +02:00
use InfluxDB\Database\RetentionPolicy;
use InfluxDB\Query\Builder as QueryBuilder;
use InfluxDB\Database\Exception as DatabaseException;
/**
* Class Database
*
* @todo admin functionality
*
2015-06-23 09:19:24 +02:00
* @package InfluxDB
*/
class Database
{
/**
* The name of the Database
*
* @var string
*/
protected $name = '';
/**
* @var Client
*/
protected $client;
/**
* Precision constants
*/
const PRECISION_NANOSECONDS = 'n';
const PRECISION_MICROSECONDS = 'u';
const PRECISION_MILLISECONDS = 'ms';
const PRECISION_SECONDS = 's';
const PRECISION_MINUTES = 'm';
const PRECISION_HOURS = 'h';
/**
* Construct a database object
*
* @param string $name
* @param Client $client
2015-06-18 16:17:57 +02:00
*
* @throws DatabaseException
*/
public function __construct($name, Client $client)
{
$this->client = $client;
2015-06-18 16:17:57 +02:00
if (!$name) {
throw new \InvalidArgumentException('No database name provided');
2015-06-18 16:17:57 +02:00
}
$this->name = $name;
}
2015-06-19 12:04:25 +02:00
/**
* @return string db name
*/
public function getName()
{
return $this->name;
}
/**
* Query influxDB
*
* @param string $query
2015-06-19 15:46:02 +02:00
* @param array $params
2015-06-18 16:17:57 +02:00
*
* @return ResultSet
*
* @throws Exception
*/
public function query($query, $params = array())
{
2015-06-19 15:46:02 +02:00
return $this->client->query($this->name, $query, $params);
}
/**
* Create this database
*
2015-06-18 16:17:57 +02:00
* @param RetentionPolicy $retentionPolicy
*
* @return ResultSet
*
* @throws DatabaseException
* @throws Exception
*/
public function create(RetentionPolicy $retentionPolicy = null)
{
try {
$this->query(sprintf('CREATE DATABASE %s', $this->name));
if ($retentionPolicy) {
$this->createRetentionPolicy($retentionPolicy);
2015-06-18 16:17:57 +02:00
}
} catch (\Exception $e) {
throw new DatabaseException(
sprintf('Failed to created database %s, exception: %s', $this->name, $e->getMessage())
);
}
}
/**
* @param RetentionPolicy $retentionPolicy
*
* @return ResultSet
*/
public function createRetentionPolicy(RetentionPolicy $retentionPolicy)
{
return $this->query($this->getRetentionPolicyQuery('CREATE', $retentionPolicy));
}
2015-06-19 09:49:58 +02:00
/**
* Writes points into InfluxDB
*
* @param Point[] $points Array of points
* @param string $precision The timestamp precision (defaults to nanoseconds)
*
* @return bool
* @throws Exception
2015-06-19 09:49:58 +02:00
*/
public function writePoints(array $points, $precision = self::PRECISION_NANOSECONDS)
2015-06-19 09:49:58 +02:00
{
$payload = array();
2015-06-19 09:49:58 +02:00
foreach ($points as $point) {
2015-06-19 15:46:02 +02:00
if (!$point instanceof Point) {
throw new \InvalidArgumentException('An array of Point[] should be passed');
}
$payload[] = (string) $point;
2015-06-19 09:49:58 +02:00
}
return $this->client->write($this->name, implode(PHP_EOL, $payload), $precision);
}
/**
* @return bool
*/
public function exists()
{
$databases = $this->client->listDatabases();
return in_array($this->name, $databases);
2015-06-19 09:49:58 +02:00
}
2015-06-18 16:17:57 +02:00
/**
* @param RetentionPolicy $retentionPolicy
*/
2015-06-18 16:17:57 +02:00
public function alterRetentionPolicy(RetentionPolicy $retentionPolicy)
{
2015-06-18 16:17:57 +02:00
$this->query($this->getRetentionPolicyQuery('ALTER', $retentionPolicy));
}
/**
* @return array
*
* @throws Exception
*/
public function listRetentionPolicies()
{
return $this->query(sprintf('SHOW RETENTION POLICIES %s', $this->name))->getPoints();
}
2015-06-18 16:17:57 +02:00
/**
* Drop this database
*/
public function drop()
{
2015-06-18 16:17:57 +02:00
$this->query(sprintf('DROP DATABASE %s', $this->name));
}
/**
* Retrieve the query builder
*
* @return QueryBuilder
*/
public function getQueryBuilder()
{
return new QueryBuilder($this);
}
2015-06-22 14:51:48 +02:00
/**
* @return Client
*/
public function getClient()
{
return $this->client;
}
2015-06-18 16:17:57 +02:00
/**
* @param $method
* @param RetentionPolicy $retentionPolicy
*
* @return string
*/
protected function getRetentionPolicyQuery($method, RetentionPolicy $retentionPolicy)
{
if (!in_array($method, array('CREATE', 'ALTER'))) {
throw new \InvalidArgumentException(sprintf('%s is not a valid method'));
}
$query = sprintf(
'%s RETENTION POLICY %s ON %s DURATION %s REPLICATION %s',
$method,
$retentionPolicy->name,
$this->name,
$retentionPolicy->duration,
$retentionPolicy->replication
);
if ($retentionPolicy->default) {
$query .= " DEFAULT";
}
return $query;
}
}