blob: 82847b4ab6583efb26c4d0c97aebdf30a4b2a6a3 [file] [log] [blame]
<?php
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Apache\Ignite;
use Apache\Ignite\Exception\ClientException;
use Apache\Ignite\Cache\CacheConfiguration;
use Apache\Ignite\Cache\CacheInterface;
use Apache\Ignite\Internal\Connection\ClientFailoverSocket;
use Apache\Ignite\Internal\Binary\MessageBuffer;
use Apache\Ignite\Internal\Binary\BinaryCommunicator;
use Apache\Ignite\Internal\Utils\ArgumentChecker;
use Apache\Ignite\Internal\Utils\Logger;
use Apache\Ignite\Internal\Binary\ClientOperation;
use Apache\Ignite\Internal\Cache;
/**
* @mainpage Public API specification
* The thin client allows your PHP applications to work with Apache Ignite clusters via Binary %Client Protocol.
*
* This is the public API specification of the client.
*
* If you open it for the first time, start from the Client class.
*
* For the usage guide and other instructions see accompanied Apache Ignite PHP %Client documentation.
*/
/**
* Class representing Ignite client.
*/
class Client
{
private $socket;
private $communicator;
/**
* Public Client constructor.
*/
public function __construct()
{
$this->socket = new ClientFailoverSocket();
$this->communicator = new BinaryCommunicator($this->socket);
}
/**
* Connects the client.
*
* Reconnects if the client already connected.
*
* @param ClientConfiguration $config the client configuration.
*
* @throws ClientException if error.
*/
public function connect(ClientConfiguration $config): void
{
$this->socket->connect($config);
}
/**
* Disconnects the client.
*
* Does nothing if the client already disconnected.
*/
public function disconnect(): void
{
$this->socket->disconnect();
}
/**
* Creates new cache with the provided name and optional configuration.
*
* @param string $name cache name.
* @param CacheConfiguration $cacheConfig optional cache configuration.
*
* @return CacheInterface new instance of the class with interface representing the created cache.
*
* @throws ClientException if error.
*/
public function createCache(
string $name,
CacheConfiguration $cacheConfig = null): CacheInterface
{
ArgumentChecker::notEmpty($name, 'name');
$this->communicator->send(
$cacheConfig ?
ClientOperation::CACHE_CREATE_WITH_CONFIGURATION :
ClientOperation::CACHE_CREATE_WITH_NAME,
function (MessageBuffer $payload) use ($name, $cacheConfig)
{
$this->writeCacheNameOrConfig($payload, $name, $cacheConfig);
});
return new Cache($name, $this->communicator);
}
/**
* Gets existing cache with the provided name
* or creates new one with the provided name and optional configuration.
*
* @param string $name cache name.
* @param CacheConfiguration $cacheConfig cache configuration (ignored if cache
* with the provided name already exists).
*
* @return CacheInterface new instance of the class with interface representing the existing or created cache.
*
* @throws ClientException if error.
*/
public function getOrCreateCache(
string $name,
CacheConfiguration $cacheConfig = null): CacheInterface
{
ArgumentChecker::notEmpty($name, 'name');
$this->communicator->send(
$cacheConfig ?
ClientOperation::CACHE_GET_OR_CREATE_WITH_CONFIGURATION :
ClientOperation::CACHE_GET_OR_CREATE_WITH_NAME,
function (MessageBuffer $payload) use ($name, $cacheConfig)
{
$this->writeCacheNameOrConfig($payload, $name, $cacheConfig);
});
return new Cache($name, $this->communicator);
}
/**
* Gets instance of the class with interface representing the cache with the provided name.
* The method does not check if the cache with the provided name exists.
*
* @param string $name cache name.
*
* @return CacheInterface new instance of the class with interface representing the cache.
*
* @throws ClientException if error.
*/
public function getCache(string $name): CacheInterface
{
ArgumentChecker::notEmpty($name, 'name');
return new Cache($name, $this->communicator);
}
/**
* Destroys cache with the provided name.
*
* @param string $name cache name.
*
* @throws ClientException if error.
*/
public function destroyCache(string $name): void
{
ArgumentChecker::notEmpty($name, 'name');
$this->communicator->send(
ClientOperation::CACHE_DESTROY,
function (MessageBuffer $payload) use ($name)
{
$payload->writeInteger(Cache::calculateId($name));
});
}
/**
* Returns configuration of cache with the provided name.
*
* @param string $name cache name.
*
* @return CacheConfiguration cache configuration.
*
* @throws ClientException if error.
*/
public function getCacheConfiguration(string $name): CacheConfiguration
{
ArgumentChecker::notEmpty($name, 'name');
$config = null;
$this->communicator->send(
ClientOperation::CACHE_GET_CONFIGURATION,
function (MessageBuffer $payload) use ($name)
{
$payload->writeInteger(Cache::calculateId($name));
$payload->writeByte(0);
},
function (MessageBuffer $payload) use (&$config)
{
$config = new CacheConfiguration();
$config->read($this->communicator, $payload);
});
return $config;
}
/**
* Gets existing cache names.
*
* @return array array with the existing cache names.
* The array is empty if no caches exist.
*
* @throws ClientException if error.
*/
public function cacheNames(): array
{
$names = null;
$this->communicator->send(
ClientOperation::CACHE_GET_NAMES,
null,
function (MessageBuffer $payload) use (&$names)
{
$names = $this->communicator->readStringArray($payload);
});
return $names;
}
/**
* Enables/disables the Ignite client's debug output (including errors logging).
* Disabled by default.
*
* @param bool $value true to enable, false to disable.
*/
public function setDebug(bool $value): void
{
Logger::setDebug($value);
}
private function writeCacheNameOrConfig(
MessageBuffer $buffer,
string $name,
CacheConfiguration $cacheConfig = null): void
{
if ($cacheConfig) {
$cacheConfig->write($this->communicator, $buffer, $name);
} else {
$this->communicator->writeString($buffer, $name);
}
}
}