Compare commits

..

No commits in common. "stable" and "1.0.2" have entirely different histories.

10 changed files with 2562 additions and 701 deletions

2
.gitignore vendored Executable file → Normal file
View File

@ -1,3 +1 @@
vendor vendor
composer.lock
!.gitignore

11
LICENSE
View File

@ -1,11 +0,0 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

View File

@ -1,3 +0,0 @@
# PHP 8.3 Framework for working with ArangoDB
🤟 Very simple and flexible, easy to scale and integrate

94
composer.json Executable file → Normal file
View File

@ -1,47 +1,47 @@
{ {
"name": "mirzaev/arangodb", "name": "mirzaev/arangodb",
"description": "Simple PHP-framework for ArangoDB", "description": "Simple PHP-framework for ArangoDB",
"readme": "README.md", "readme": "README.md",
"keywords": [ "keywords": [
"ArangoDB" "ArangoDB"
], ],
"type": "framework", "type": "library",
"license": "WTFPL", "license": "WTFPL",
"homepage": "https://git.hood.su/mirzaev/arangodb", "homepage": "https://git.hood.su/mirzaev/arangodb",
"authors": [ "authors": [
{ {
"name": "Arsen Mirzaev Tatyano-Muradovich", "name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy", "email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy", "homepage": "https://mirzaev.sexy",
"role": "Developer" "role": "Developer"
} }
], ],
"support": { "support": {
"email": "arsen@mirzaev.sexy", "email": "arsen@mirzaev.sexy",
"wiki": "https://git.mirzaev.sexy/mirzaev/arangodb/manual", "wiki": "https://git.mirzaev.sexy/mirzaev/arangodb/manual",
"issues": "https://git.mirzaev.sexy/mirzaev/arangodb/issues" "issues": "https://git.mirzaev.sexy/mirzaev/arangodb/issues"
}, },
"funding": [ "funding": [
{ {
"type": "funding", "type": "funding",
"url": "https://fund.mirzaev.sexy" "url": "https://fund.mirzaev.sexy"
} }
], ],
"require": { "require": {
"php": "^8.2", "php": "^8.1",
"triagens/arangodb": "~3.8" "triagens/arangodb": "~3.8"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.3.3" "phpunit/phpunit": "^9.3.3"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"mirzaev\\arangodb\\": "mirzaev/arangodb/system" "mirzaev\\arangodb\\": "mirzaev/arangodb/system"
} }
}, },
"autoload-dev": { "autoload-dev": {
"psr-4": { "psr-4": {
"mirzaev\\arangodb\\tests\\": "mirzaev/arangodb/tests" "mirzaev\\arangodb\\tests\\": "mirzaev/arangodb/tests"
} }
} }
} }

2098
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

322
mirzaev/arangodb/system/collection.php Executable file → Normal file
View File

@ -1,204 +1,118 @@
<?php <?php
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\arangodb; namespace mirzaev\arangodb;
// Files of the project use mirzaev\arangodb\terminal;
use mirzaev\arangodb\connection,
mirzaev\arangodb\terminal, use ArangoDBClient\Connection as _connection;
mirzaev\arangodb\enumerations\collection\type; use ArangoDBClient\Collection as _collection;
use ArangoDBClient\Statement as _statement;
// Library for ArangoDB use ArangoDBClient\Document as _document;
use ArangoDBClient\Statement as _statement, use ArangoDBClient\CollectionHandler as _collection_handler;
ArangoDBClient\Document as _document,
ArangoDBClient\CollectionHandler as _collection_handler, /**
ArangoDBClient\Cursor as cursor; * Коллекция
*
// Built-in libraries * @package mirzaev\arangodb
use exception; * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
/** class collection
* Collection {
* /**
* @package mirzaev\arangodb * Инициализация
* *
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @param _connection $session Сессия соединения с базой данных
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @param string $name Название
*/ * @param bool $edge Обрабатывать как ребро? (иначе: вершина)
class collection * @param ?terminal $terminal Инстанция терминала
{ *
/** * @return string|null Идентификатор коллекции
* Initialize a collection */
* public static function init(_connection $session, string $name, bool $edge = false, ?terminal $terminal = null): ?string
* @param string $collection Name of the collection {
* @param type $type Type of the collection // Инициализация
* @param ?terminal $terminal Инстанция терминала $collections = new _collection_handler($session);
* @param array &$errors Registry of errors
* if (!$collections->has($name)) {
* @return string|null Identifier of the collection // Не найдана коллекция
*/
public static function initialize(string $name, type $type = type::document, ?terminal $terminal = null, array &$errors = []): ?string // Запись в вывод
{ if ($terminal instanceof terminal) $terminal::write("Коллекция \"$name\" не найдена");
try {
// Инициализация // Запись коллекции на сервер и его ответ в буфер возврата
$collections = new _collection_handler(connection::$session); $id = $collections->create($name, ['type' => $edge ? _collection::TYPE_EDGE : _collection::TYPE_DOCUMENT]);
if (!$collections->has($name)) { if ($collections->has($name)) {
// Не найдана коллекция // Коллекция найдена (записана)
// Запись в вывод // Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Not found $type collection: $name"); if ($terminal instanceof terminal) $terminal::write("Создана коллекция \"$name\" с типом " . ($edge ? 'ребро' : 'документ'));
// Запись коллекции на сервер и его ответ в буфер возврата // Возврат идентификатора коллекции
$id = $collections->create($name, ['type' => $type->code()]); return $id;
}
if ($collections->has($name)) { } else {
// Коллекция найдена (записана) // Найдена коллекция
// Запись в вывод // Возврат идентификатора коллекции
if ($terminal instanceof terminal) $terminal::write("Created $type collection: $name"); return $name;
}
// Возврат идентификатора коллекции
return $id; return null;
} }
} else {
// Найдена коллекция /**
* Поиск
// Возврат идентификатора коллекции *
return $name; * @param _connection $session Сессия соединения с базой данных
} * @param string $query AQL-запрос
} catch (exception $e) { *
// Writing to registry of errors * @return _document|null Инстанция документа
$errors[] = [ */
'text' => $e->getMessage(), public static function search(_connection $session, string $query): ?_document
'file' => $e->getFile(), {
'line' => $e->getLine(), // Поиск журнала
'stack' => $e->getTrace() $journal = (new _statement(
]; $session,
} [
'query' => $query,
return null; "batchSize" => 1000,
} "sanitize" => true
]
/** ))->execute();
* Execute
* // Инициализация буфера вывода
* @param string $query Query (AQL) $buffer = [];
* @param array $parameters Binded parameters for placeholders [placholder => parameter]
* @param bool $flat Not implement record? foreach ($journal as $key => $value) {
* @param array &$errors Registry of errors $buffer[$key] = $value;
* }
* @return _document|array|string|int|null Instance of the document
*/ return $buffer[0] ?? null;
public static function execute(string $query, array $parameters = [], bool $flat = false, array &$errors = []): _document|string|array|int|null }
{
try { /**
// Statement instance initialization * Очистка
$instance = new _statement( *
connection::$session, * @param _connection $session Сессия соединения с базой данных
[ * @param string $name Название
'query' => $query, *
'batchSize' => 1000, * @return bool Статус выполнения
'sanitize' => true, */
cursor::ENTRY_FLAT => $flat public static function truncate(_connection $session, string $name): bool
] {
); // Инициализация
$collections = new _collection_handler($session);
// Binds application
$instance->bind($parameters); if ($collections->has($name)) {
// Найдена коллекция
// Sending the request
$response = $instance->execute(); // Очистка
return $collections->truncate($name);
// Инициализация буфера вывода }
$buffer = [];
return false;
foreach ($response->getAll() as $key => $value) { }
$buffer[$key] = $value; }
}
// Exit (success)
return is_array($buffer) && count($buffer) > 1 ? $buffer : $buffer[0] ?? null;
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return null;
}
/**
* Truncate
*
* @param string $name Name of the collection
* @param array &$errors Registry of errors
*
* @return bool Статус выполнения
*/
public static function truncate(string $collection, array &$errors = []): bool
{
try {
// Initizlizing of the collection handler
$collections = new _collection_handler(connection::$session);
if ($collections->has($collection)) {
// Fount the collection
// Truncate and exit (success)
return $collections->truncate($collection);
}
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return false;
}
/**
* Count documents in ArangoDB
*
* @param string $collection Name of the collection
* @param array &$errors Registry of errors
*
* @return int|null Amount of documents in ArangoDB
*/
public static function count(string $collection, array &$errors = []): ?int
{
try {
// Count and exit (success)
return static::execute(
<<<'AQL'
RETURN LENGTH(@@collection)
AQL,
[
'@collection' => $collection
]
);
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return null;
}
}

340
mirzaev/arangodb/system/connection.php Executable file → Normal file
View File

@ -4,205 +4,201 @@ declare(strict_types=1);
namespace mirzaev\arangodb; namespace mirzaev\arangodb;
// Library for ArangoDB use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Connection as _connection, use ArangoDBClient\Exception as _exception;
ArangoDBClient\Exception as _exception, use ArangoDBClient\UpdatePolicy as _update;
ArangoDBClient\UpdatePolicy as _update, use ArangoDBClient\ConnectionOptions as _options;
ArangoDBClient\ConnectionOptions as _options;
// Built-in libraries
use exception; use exception;
/** /**
* Connection * Подключение
* *
* @package mirzaev\arangodb * @package mirzaev\arangodb
*
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class connection final class connection
{ {
/** /**
* Адрес * Адрес
*/ */
protected string $adress = 'tcp://127.0.0.1:8529'; protected string $adress = 'tcp://127.0.0.1:8529';
/** /**
* Хранилище (название) * Хранилище (название)
*/ */
protected string $storage = 'root'; protected string $storage = 'root';
/** /**
* Тип аутентификации * Тип аутентификации
*/ */
protected string $auth = 'Basic'; protected string $auth = 'Basic';
/** /**
* Псевдоним пользователя * Псевдоним пользователя
*/ */
protected string $name = 'root'; protected string $name = 'root';
/** /**
* Пароль пользователя * Пароль пользователя
*/ */
protected string $password = ''; protected string $password = '';
/** /**
* Тип соединения * Тип соединения
*/ */
protected string $connection = 'Keep-Alive'; protected string $connection = 'Keep-Alive';
/** /**
* Время ожидания соединения * Время ожидания соединения
*/ */
protected int $timeout_connect = 3; protected int $timeout_connect = 3;
/** /**
* Время ожидания запроса * Время ожидания запроса
*/ */
protected int $timeout_request = 3; protected int $timeout_request = 3;
/** /**
* Переподключиться ли при разрыве соединения * Переподключиться ли при разрыве соединения
*/ */
protected bool $reconnect = true; protected bool $reconnect = true;
/** /**
* Создавать ли коллекцию, если она не существует * Создавать ли коллекцию, если она не существует
*/ */
protected bool $create = true; protected bool $create = true;
/** /**
* Действия при обновлении коллекции * Действия при обновлении коллекции
*/ */
protected string $update = _update::LAST; protected string $update = _update::LAST;
/** /**
* Активация журналирования * Активация журналирования
*/ */
protected bool $journal = false; protected bool $journal = false;
/** /**
* Сессия соединения * Сессия соединения
*/ */
public static _connection $session; protected _connection $session;
/** /**
* Конструктор * Конструктор
* *
* @param array $settings Настройки * @param array $settings Настройки
* */
* @todo ПЕРЕДЕЛАТЬ ПОЛНОСТЬЮ public function __construct(array $settings = null)
*/ {
public function __construct(array $settings = null) // Запись
{ @$this->__set('adress', $settings['adress'] ?? $settings['endpoint']);
// Запись @$this->__set('storage', $settings['storage'] ?? $settings['database']);
@$this->__set('adress', $settings['adress'] ?? $settings['endpoint']); @$this->__set('auth', $settings['auth']);
@$this->__set('storage', $settings['storage'] ?? $settings['database']); @$this->__set('name', $settings['name']);
@$this->__set('auth', $settings['auth']); @$this->__set('password', $settings['password']);
@$this->__set('name', $settings['name']); @$this->__set('connection', $settings['connection']);
@$this->__set('password', $settings['password']); @$this->__set('timeout_connect', $settings['timeout_connect']);
@$this->__set('connection', $settings['connection']); @$this->__set('timeout_request', $settings['timeout_request']);
@$this->__set('timeout_connect', $settings['timeout_connect']); @$this->__set('reconnect', $settings['reconnect']);
@$this->__set('timeout_request', $settings['timeout_request']); @$this->__set('create', $settings['create']);
@$this->__set('reconnect', $settings['reconnect']); @$this->__set('update', $settings['update'] ?? $settings['policy']);
@$this->__set('create', $settings['create']); @$this->__set('journal', $settings['journal']);
@$this->__set('update', $settings['update'] ?? $settings['policy']);
@$this->__set('journal', $settings['journal']);
if ($this->journal) { if ($this->journal) {
// Запрос на активацию журналирования // Запрос на активацию журналирования
_exception::enableLogging(); _exception::enableLogging();
} }
// Подключение // Подключение
static::$session = new _connection([ $this->session = new _connection([
_options::OPTION_ENDPOINT => $this->adress, _options::OPTION_ENDPOINT => $this->adress,
_options::OPTION_DATABASE => $this->storage, _options::OPTION_DATABASE => $this->storage,
_options::OPTION_AUTH_TYPE => $this->auth, _options::OPTION_AUTH_TYPE => $this->auth,
_options::OPTION_AUTH_USER => $this->name, _options::OPTION_AUTH_USER => $this->name,
_options::OPTION_AUTH_PASSWD => $this->password, _options::OPTION_AUTH_PASSWD => $this->password,
_options::OPTION_CONNECTION => $this->connection, _options::OPTION_CONNECTION => $this->connection,
_options::OPTION_CONNECT_TIMEOUT => $this->timeout_connect, _options::OPTION_CONNECT_TIMEOUT => $this->timeout_connect,
_options::OPTION_REQUEST_TIMEOUT => $this->timeout_request, _options::OPTION_REQUEST_TIMEOUT => $this->timeout_request,
_options::OPTION_RECONNECT => $this->reconnect, _options::OPTION_RECONNECT => $this->reconnect,
_options::OPTION_CREATE => $this->create, _options::OPTION_CREATE => $this->create,
_options::OPTION_UPDATE_POLICY => $this->update, _options::OPTION_UPDATE_POLICY => $this->update,
]); ]);
} }
/** /**
* Записать свойство * Записать свойство
* *
* @param mixed $name Название * @param mixed $name Название
* @param mixed $value Значение * @param mixed $value Значение
*/ */
public function __set(string $name, mixed $value): void public function __set(string $name, mixed $value): void
{ {
match ($name) { match ($name) {
'adress', 'endpoint' => $this->adress = $value ?? throw new exception("Свойство \"$name\" не может быть пустым", 500), 'adress', 'endpoint' => $this->adress = $value ?? throw new exception("Свойство \"$name\" не может быть пустым", 500),
'storage', 'database', 'db' => $this->storage = $value ?? throw new exception("Свойство \"$name\" не может быть пустым", 500), 'storage', 'database', 'db' => $this->storage = $value ?? throw new exception("Свойство \"$name\" не может быть пустым", 500),
'auth' => !$value ?: $this->auth = $value, 'auth' => !$value ?: $this->auth = $value,
'name' => !$value ?: $this->name = $value, 'name' => !$value ?: $this->name = $value,
'password' => !$value ?: $this->password = $value, 'password' => !$value ?: $this->password = $value,
'connection' => !$value ?: $this->connection = $value, 'connection' => !$value ?: $this->connection = $value,
'timeout_connect' => !$value ?: $this->timeout_connect = $value, 'timeout_connect' => !$value ?: $this->timeout_connect = $value,
'timeout_request' => !$value ?: $this->timeout_request = $value, 'timeout_request' => !$value ?: $this->timeout_request = $value,
'reconnect' => !$value ?: $this->reconnect = $value, 'reconnect' => !$value ?: $this->reconnect = $value,
'create' => !$value ?: $this->create = $value, 'create' => !$value ?: $this->create = $value,
'update', 'policy' => !$value ?: $this->update = $value, 'update', 'policy' => !$value ?: $this->update = $value,
'journal' => !$value ?: $this->journal = $value, 'journal' => !$value ?: $this->journal = $value,
default => throw new exception("Свойство \"$name\" не найдено", 404) default => throw new exception("Свойство \"$name\" не найдено", 404)
}; };
} }
/** /**
* Прочитать свойство * Прочитать свойство
* *
* @param mixed $name Название * @param mixed $name Название
*/ */
public function __get(string $name): mixed public function __get(string $name): mixed
{ {
return match ($name) { return match ($name) {
'adress', 'endpoint' => $this->adress, 'adress', 'endpoint' => $this->adress,
'storage', 'database', 'db' => $this->storage, 'storage', 'database', 'db' => $this->storage,
'auth' => $this->auth, 'auth' => $this->auth,
'name' => $this->name, 'name' => $this->name,
'password' => $this->password, 'password' => $this->password,
'connection' => $this->connection, 'connection' => $this->connection,
'timeout_connect' => $this->timeout_connect, 'timeout_connect' => $this->timeout_connect,
'timeout_request' => $this->timeout_request, 'timeout_request' => $this->timeout_request,
'reconnect' => $this->reconnect, 'reconnect' => $this->reconnect,
'create' => $this->create, 'create' => $this->create,
'update', 'policy' => $this->update, 'update', 'policy' => $this->update,
'journal' => $this->journal, 'session' => $this->session,
default => throw new exception("Свойство \"$name\" не найдено", 404) 'journal' => $this->journal,
}; default => throw new exception("Свойство \"$name\" не найдено", 404)
} };
}
/** /**
* Проверить свойство на инициализированность * Проверить свойство на инициализированность
* *
* @param mixed $name Название * @param mixed $name Название
*/ */
public function __isset(string $name): bool public function __isset(string $name): bool
{ {
return match ($name) { return match ($name) {
'adress', 'endpoint' => isset($this->adress), 'adress', 'endpoint' => isset($this->adress),
'storage', 'database', 'db' => isset($this->storage), 'storage', 'database', 'db' => isset($this->storage),
'auth' => isset($this->auth), 'auth' => isset($this->auth),
'name' => isset($this->name), 'name' => isset($this->name),
'password' => isset($this->password), 'password' => isset($this->password),
'connection' => isset($this->connection), 'connection' => isset($this->connection),
'timeout_connect' => isset($this->timeout_connect), 'timeout_connect' => isset($this->timeout_connect),
'timeout_request' => isset($this->timeout_request), 'timeout_request' => isset($this->timeout_request),
'reconnect' => isset($this->reconnect), 'reconnect' => isset($this->reconnect),
'create' => isset($this->create), 'create' => isset($this->create),
'update', 'policy' => isset($this->update), 'update', 'policy' => isset($this->update),
'journal' => isset($this->journal), 'session' => isset($this->session),
default => throw new exception("Свойство \"$name\" не найдено", 404) 'journal' => isset($this->journal),
}; default => throw new exception("Свойство \"$name\" не найдено", 404)
} };
}
} }

297
mirzaev/arangodb/system/document.php Executable file → Normal file
View File

@ -1,189 +1,108 @@
<?php <?php
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\arangodb; namespace mirzaev\arangodb;
// Files of the project use mirzaev\arangodb\terminal;
use mirzaev\arangodb\terminal,
mirzaev\arangodb\connection, use ArangoDBClient\Connection as _connection;
mirzaev\arangodb\enumerations\collection\type; use ArangoDBClient\Document as _document;
use ArangoDBClient\Edge as _edge;
// Librsry for ArangoDB use ArangoDBClient\DocumentHandler as _document_handler;
use ArangoDBClient\Connection as _connection, use ArangoDBClient\EdgeHandler as _edge_handler;
ArangoDBClient\Document as _document,
ArangoDBClient\Edge as _edge, /**
ArangoDBClient\DocumentHandler as _document_handler, * Документ
ArangoDBClient\EdgeHandler as _edge_handler; *
* @package mirzaev\arangodb
// Built-in libraries * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
use exception; */
class document
/** {
* Document /**
* * Записать
* Handlers of document in ArangoDB *
* * @param _connection $session Сессия соединения с базой данных
* @package mirzaev\arangodb * @param string $collection Коллекция
* * @param ?array $data Данные
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @param bool $check Проверка на запись в базу данных
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @param ?terminal $terminal Инстанция терминала
*/ *
class document * @return string|null Идентификатор
{ */
/** public static function write(_connection $session, string $collection, ?array $data = [], bool $check = false, ?terminal $terminal = null): ?string
* Write {
* // Инициализация коллекции
* @param string $collection Коллекция collection::init($session, $collection, isset($data['_from'], $data['_to']));
* @param ?array $data Данные
* @param bool $check Проверка на запись в базу данных if (isset($data['_from'], $data['_to'])) {
* @param ?terminal $terminal Instance of the terminal // Ребро
* @param array &$errors Registry of errors
* // Инициализация обработчика рёбер
* @return string|null Идентификатор $documents = new _edge_handler($session);
*
* @todo // Инициализация ребра
* 1. Bind parameters $document = new _edge();
*/
public static function write( // Инициализация вершин
string $collection, $_from = $data['_from'];
?array $data = [], $_to = $data['_to'];
bool $check = false,
?terminal $terminal = null, // Деинициализация из входных данных
array &$errors = [] unset($data['_from'], $data['_to']);
): string|null|false { } else {
try { // Вершина
// Инициализация коллекции
collection::initialize($collection, isset($data['_from'], $data['_to']) ? type::edge : type::document); // Инициализация обработчика вершин
$documents = new _document_handler($session);
if (isset($data['_from'], $data['_to'])) {
// Ребро // Инициализация вершины
$document = new _document();
// Инициализация обработчика рёбер }
$documents = new _edge_handler(connection::$session);
foreach (['created' => time()] + $data as $key => $value) {
// Инициализация ребра // Перебор параметров
$document = new _edge();
// Запись в инстанцию документа
// Инициализация вершин $document->set($key, $value);
$_from = $data['_from']; }
$_to = $data['_to'];
// Запись на сервер и его ответ в буфер возврата
// Деинициализация из входных данных $id = isset($_from, $_to) ? $documents->saveEdge($collection, $_from, $_to, $document) : $documents->insert($collection, $document);
unset($data['_from'], $data['_to']);
} else { if ($check && $documents->has($collection, $id)) {
// Вершина // Найден записанный документ
// Инициализация обработчика вершин // Запись в вывод
$documents = new _document_handler(connection::$session); if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" создан документ \"$id\"");
} else if ($check) {
// Инициализация вершины // Не найден записанный документ
$document = new _document();
} // Запись в вывод
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" не удалось найти созданный или создать документ");
// Инициализация даты создания
$created = time(); return null;
}
foreach (['created' => $created, 'updated' => $created] + $data as $key => $value) {
// Перебор параметров // Возврат идентификатора коллекции
return $id;
// Запись в инстанцию документа }
$document->set($key, $value);
} /**
* Обновить
// Запись на сервер и его ответ в буфер возврата *
$id = isset($_from, $_to) ? $documents->saveEdge($collection, $_from, $_to, $document) : $documents->insert($collection, $document); * @param _connection $session Сессия соединения с базой данных
* @param _document $document Инстанция документа вершины
if ($check && $documents->has($collection, $id)) { *
// Найден записанный документ * @return bool Статус обработки
*/
// Запись в вывод public static function update(_connection $session, _document $document): bool
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" создан документ \"$id\""); {
} else if ($check) { // Инициализация обработчика вершин
// Не найден записанный документ $documents = new _document_handler($session);
// Запись в вывод // Запись в базу данных
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" не удалось найти созданный или создать документ"); return $documents->update($document);
}
return null; }
}
// Возврат идентификатора коллекции
return $id;
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return false;
}
/**
* Update
*
* @param array &$errors Registry of errors
* @param _document $document Instance of the document
*
* @return bool Has the document been updated?
*/
public static function update(_document $document, array &$errors = []): bool
{
try {
// Initialize the handler of documents
$documents = new _document_handler(connection::$session);
// Writing date of the updating to the updating document
$document->set('updated', time());
// Writing and exit (success)
return $documents->update($document);
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return false;
}
/**
* Delete
*
* @param _document $document Instance of the document
* @param array &$errors Registry of errors
*
* @return bool Has the document been deleted?
*/
public static function delete(_document $document, array &$errors = []): bool
{
try {
// Initialize the handler of documents
$documents = new _document_handler(connection::$session);
// Delete abd exit (success)
return $documents->remove($document);
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
// Exit (fail)
return false;
}
}

View File

@ -1,36 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\arangodb\enumerations\collection;
// Library for ArangoDB
use ArangoDBClient\Collection as _collection;
/**
* Types of collections
*
* @package mirzaev\arangodb\enumerations\collection
*
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
enum type
{
case document;
case edge;
/**
* Read code of the type from library for ArangoDB
*
* @return int Code of the type
*/
public function code(): int
{
// Exit (success)
return match ($this) {
type::document => _collection::TYPE_DOCUMENT,
type::edge => _collection::TYPE_EDGE
};
}
}

60
mirzaev/arangodb/system/terminal.php Executable file → Normal file
View File

@ -1,37 +1,23 @@
<?php <?php
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\arangodb; namespace mirzaev\arangodb;
// Built-in libraries class terminal
use exception; {
/**
/** * Префикс
* Terminal */
* protected const PREFIX = 'arangodb';
* lol sorry
* i did not want to do this /**
* * Запись в вывод
* @package mirzaev\arangodb *
* * @param string $text Текст сообщения
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License */
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> public static function write(string $text): void
*/ {
class terminal echo sprintf("[%s] $text\n", self::PREFIX);
{ }
/** }
* Префикс
*/
protected const string PREFIX = 'arangodb';
/**
* Запись в вывод
*
* @param string $text Текст сообщения
*/
public static function write(string $text): void
{
echo sprintf("[%s] $text\n", self::PREFIX);
}
}