Compare commits

..

18 Commits

Author SHA1 Message Date
Arsen Mirzaev Tatyano-Muradovich 453cac0b77 resolved #1 2025-02-13 08:52:44 +03:00
Arsen Mirzaev Tatyano-Muradovich 3e095e14f7 return values fix 2024-10-12 19:21:25 +03:00
Arsen Mirzaev Tatyano-Muradovich 577bc837d8 connection fix 2024-10-12 11:24:32 +03:00
Arsen Mirzaev Tatyano-Muradovich 9f7ce7e9b6 chmod 0664 2024-10-11 10:02:53 +03:00
Arsen Mirzaev Tatyano-Muradovich 4e04d09b32 TOTAL REBUILD 2024-10-11 10:01:40 +03:00
Arsen Mirzaev Tatyano-Muradovich d0ce9e47af удалили компосер лок 2023-12-21 23:26:50 +07:00
Arsen Mirzaev Tatyano-Muradovich b2088df8fb забыл что сделал 2023-12-21 23:20:32 +07:00
Arsen Mirzaev Tatyano-Muradovich cb1388722c added to .gitignore 2023-07-10 06:47:42 +07:00
root 11be80b0ad remove composer.lock 2023-07-09 16:45:49 +00:00
root 48a8908afd PHP 8.2 2023-07-09 16:42:01 +00:00
root 8f5f5b44de just rules and license 2023-07-09 16:37:43 +00:00
root 8e7972d933 cool patch 2023-07-09 16:24:00 +00:00
Arsen Mirzaev Tatyano-Muradovich e7da9978d0 english description 2022-11-06 10:03:56 +10:00
Arsen Mirzaev Tatyano-Muradovich 4daa93799e Update composer.json 2022-11-06 09:57:23 +10:00
Arsen Mirzaev Tatyano-Muradovich 0012a31e6b Механизм деления на данные и метаданные был порублен на мелкие кусочки 2022-10-26 06:16:30 +10:00
Arsen Mirzaev Tatyano-Muradovich c5d83ceee5 Отключена проверка по умолчанию 2022-10-23 08:08:56 +10:00
Arsen Mirzaev Tatyano-Muradovich d21e421b2e Доработка того же самого 2022-10-23 08:08:31 +10:00
Arsen Mirzaev Tatyano-Muradovich 0feecd605f Исправление записи в буфер вывода при проверке 2022-10-23 08:06:02 +10:00
10 changed files with 701 additions and 2543 deletions

2
.gitignore vendored Normal file → Executable file
View File

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

11
LICENSE Normal file
View File

@ -0,0 +1,11 @@
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.

3
README.md Normal file
View File

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

18
composer.json Normal file → Executable file
View File

@ -1,10 +1,11 @@
{
"name": "mirzaev/arangodb",
"description": "Реализация управления хранилищем данных ArangoDB",
"description": "Simple PHP-framework for ArangoDB",
"readme": "README.md",
"keywords": [
"ArangoDB"
],
"type": "library",
"type": "framework",
"license": "WTFPL",
"homepage": "https://git.hood.su/mirzaev/arangodb",
"authors": [
@ -15,8 +16,19 @@
"role": "Developer"
}
],
"support": {
"email": "arsen@mirzaev.sexy",
"wiki": "https://git.mirzaev.sexy/mirzaev/arangodb/manual",
"issues": "https://git.mirzaev.sexy/mirzaev/arangodb/issues"
},
"funding": [
{
"type": "funding",
"url": "https://fund.mirzaev.sexy"
}
],
"require": {
"php": "^8.1",
"php": "^8.2",
"triagens/arangodb": "~3.8"
},
"require-dev": {

2098
composer.lock generated

File diff suppressed because it is too large Load Diff

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

@ -4,51 +4,60 @@ declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
// Files of the project
use mirzaev\arangodb\connection,
mirzaev\arangodb\terminal,
mirzaev\arangodb\enumerations\collection\type;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Collection as _collection;
use ArangoDBClient\Statement as _statement;
use ArangoDBClient\Document as _document;
use ArangoDBClient\CollectionHandler as _collection_handler;
// Library for ArangoDB
use ArangoDBClient\Statement as _statement,
ArangoDBClient\Document as _document,
ArangoDBClient\CollectionHandler as _collection_handler,
ArangoDBClient\Cursor as cursor;
// Built-in libraries
use exception;
/**
* Коллекция
* Collection
*
* @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>
*/
class collection
{
/**
* Инициализация
* Initialize a collection
*
* @param _connection $session Сессия соединения с базой данных
* @param string $name Название
* @param bool $edge Обрабатывать как ребро? (иначе: вершина)
* @param string $collection Name of the collection
* @param type $type Type of the collection
* @param ?terminal $terminal Инстанция терминала
* @param array &$errors Registry of errors
*
* @return string|null Идентификатор коллекции
* @return string|null Identifier of the collection
*/
public static function init(_connection $session, string $name, bool $edge = false, ?terminal $terminal = null): ?string
public static function initialize(string $name, type $type = type::document, ?terminal $terminal = null, array &$errors = []): ?string
{
try {
// Инициализация
$collections = new _collection_handler($session);
$collections = new _collection_handler(connection::$session);
if (!$collections->has($name)) {
// Не найдана коллекция
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Коллекция \"$name\" не найдена");
if ($terminal instanceof terminal) $terminal::write("Not found $type collection: $name");
// Запись коллекции на сервер и его ответ в буфер возврата
$id = $collections->create($name, ['type' => $edge ? _collection::TYPE_EDGE : _collection::TYPE_DOCUMENT]);
$id = $collections->create($name, ['type' => $type->code()]);
if ($collections->has($name)) {
// Коллекция найдена (записана)
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("Создана коллекция \"$name\" с типом " . ($edge ? 'ребро' : 'документ'));
if ($terminal instanceof terminal) $terminal::write("Created $type collection: $name");
// Возврат идентификатора коллекции
return $id;
@ -59,60 +68,137 @@ class collection
// Возврат идентификатора коллекции
return $name;
}
} catch (exception $e) {
// Writing to registry of errors
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Поиск
* Execute
*
* @param _connection $session Сессия соединения с базой данных
* @param string $query AQL-запрос
* @param string $query Query (AQL)
* @param array $parameters Binded parameters for placeholders [placholder => parameter]
* @param bool $flat Not implement record?
* @param array &$errors Registry of errors
*
* @return _document|null Инстанция документа
* @return _document|array|string|int|null Instance of the document
*/
public static function search(_connection $session, string $query): ?_document
public static function execute(string $query, array $parameters = [], bool $flat = false, array &$errors = []): _document|string|array|int|null
{
// Поиск журнала
$journal = (new _statement(
$session,
try {
// Statement instance initialization
$instance = new _statement(
connection::$session,
[
'query' => $query,
"batchSize" => 1000,
"sanitize" => true
'batchSize' => 1000,
'sanitize' => true,
cursor::ENTRY_FLAT => $flat
]
))->execute();
);
// Binds application
$instance->bind($parameters);
// Sending the request
$response = $instance->execute();
// Инициализация буфера вывода
$buffer = [];
foreach ($journal as $key => $value) {
foreach ($response->getAll() as $key => $value) {
$buffer[$key] = $value;
}
return $buffer[0] ?? null;
// 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 _connection $session Сессия соединения с базой данных
* @param string $name Название
* @param string $name Name of the collection
* @param array &$errors Registry of errors
*
* @return bool Статус выполнения
*/
public static function truncate(_connection $session, string $name): bool
public static function truncate(string $collection, array &$errors = []): bool
{
// Инициализация
$collections = new _collection_handler($session);
try {
// Initizlizing of the collection handler
$collections = new _collection_handler(connection::$session);
if ($collections->has($name)) {
// Найдена коллекция
if ($collections->has($collection)) {
// Fount the collection
// Очистка
return $collections->truncate($name);
// 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;
}
}

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

@ -4,17 +4,21 @@ declare(strict_types=1);
namespace mirzaev\arangodb;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Exception as _exception;
use ArangoDBClient\UpdatePolicy as _update;
use ArangoDBClient\ConnectionOptions as _options;
// Library for ArangoDB
use ArangoDBClient\Connection as _connection,
ArangoDBClient\Exception as _exception,
ArangoDBClient\UpdatePolicy as _update,
ArangoDBClient\ConnectionOptions as _options;
// Built-in libraries
use exception;
/**
* Подключение
* Connection
*
* @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>
*/
final class connection
@ -82,12 +86,14 @@ final class connection
/**
* Сессия соединения
*/
protected _connection $session;
public static _connection $session;
/**
* Конструктор
*
* @param array $settings Настройки
*
* @todo ПЕРЕДЕЛАТЬ ПОЛНОСТЬЮ
*/
public function __construct(array $settings = null)
{
@ -112,7 +118,7 @@ final class connection
}
// Подключение
$this->session = new _connection([
static::$session = new _connection([
_options::OPTION_ENDPOINT => $this->adress,
_options::OPTION_DATABASE => $this->storage,
_options::OPTION_AUTH_TYPE => $this->auth,
@ -171,7 +177,6 @@ final class connection
'reconnect' => $this->reconnect,
'create' => $this->create,
'update', 'policy' => $this->update,
'session' => $this->session,
'journal' => $this->journal,
default => throw new exception("Свойство \"$name\" не найдено", 404)
};
@ -196,7 +201,6 @@ final class connection
'reconnect' => isset($this->reconnect),
'create' => isset($this->create),
'update', 'policy' => isset($this->update),
'session' => isset($this->session),
'journal' => isset($this->journal),
default => throw new exception("Свойство \"$name\" не найдено", 404)
};

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

@ -4,65 +4,87 @@ declare(strict_types=1);
namespace mirzaev\arangodb;
use mirzaev\arangodb\terminal;
// Files of the project
use mirzaev\arangodb\terminal,
mirzaev\arangodb\connection,
mirzaev\arangodb\enumerations\collection\type;
use ArangoDBClient\Connection as _connection;
use ArangoDBClient\Document as _document;
use ArangoDBClient\Edge as _edge;
use ArangoDBClient\DocumentHandler as _document_handler;
use ArangoDBClient\EdgeHandler as _edge_handler;
// Librsry for ArangoDB
use ArangoDBClient\Connection as _connection,
ArangoDBClient\Document as _document,
ArangoDBClient\Edge as _edge,
ArangoDBClient\DocumentHandler as _document_handler,
ArangoDBClient\EdgeHandler as _edge_handler;
// Built-in libraries
use exception;
/**
* Документ
* Document
*
* Handlers of document in 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>
*/
class document
{
/**
* Записать
* Write
*
* @param _connection $session Сессия соединения с базой данных
* @param string $collection Коллекция
* @param ?array $data Данные
* @param ?array $metadata Метаданные
* @param bool $check Проверка на запись в базу данных
* @param ?terminal $terminal Инстанция терминала
* @param ?terminal $terminal Instance of the terminal
* @param array &$errors Registry of errors
*
* @return string|null Идентификатор
*
* @todo
* 1. Bind parameters
*/
public static function write(_connection $session, string $collection, ?array $data = [], ?array $metadata = [], bool $check = true, ?terminal $terminal = null): ?string
{
public static function write(
string $collection,
?array $data = [],
bool $check = false,
?terminal $terminal = null,
array &$errors = []
): string|null|false {
try {
// Инициализация коллекции
collection::init($session, $collection, isset($metadata['_from'], $metadata['_to']));
collection::initialize($collection, isset($data['_from'], $data['_to']) ? type::edge : type::document);
if (isset($metadata['_from'], $metadata['_to'])) {
if (isset($data['_from'], $data['_to'])) {
// Ребро
// Инициализация обработчика рёбер
$documents = new _edge_handler($session);
$documents = new _edge_handler(connection::$session);
// Инициализация ребра
$document = new _edge();
// Инициализация вершин
$_from = $metadata['_from'];
$_to = $metadata['_to'];
$_from = $data['_from'];
$_to = $data['_to'];
// Деинициализация из входных данных
unset($metadata['_from'], $metadata['_to']);
unset($data['_from'], $data['_to']);
} else {
// Вершина
// Инициализация обработчика вершин
$documents = new _document_handler($session);
$documents = new _document_handler(connection::$session);
// Инициализация вершины
$document = new _document();
}
foreach (['data' => $data, 'metadata' => ($metadata ?? []) + ['created' => time()]] as $key => $value) {
// Инициализация даты создания
$created = time();
foreach (['created' => $created, 'updated' => $created] + $data as $key => $value) {
// Перебор параметров
// Запись в инстанцию документа
@ -72,30 +94,96 @@ class document
// Запись на сервер и его ответ в буфер возврата
$id = isset($_from, $_to) ? $documents->saveEdge($collection, $_from, $_to, $document) : $documents->insert($collection, $document);
if ($check && $terminal instanceof terminal && $documents->has($collection, $id)) {
// Документ записан
if ($check && $documents->has($collection, $id)) {
// Найден записанный документ
// Запись в вывод
$terminal::write("В коллекции \"$collection\" создан документ \"$id\"");
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" создан документ \"$id\"");
} else if ($check) {
// Не найден записанный документ
// Запись в вывод
if ($terminal instanceof terminal) $terminal::write("В коллекции \"$collection\" не удалось найти созданный или создать документ");
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 _connection $session Сессия соединения с базой данных
* @param _document $document Инстанция документа вершины
* @param array &$errors Registry of errors
* @param _document $document Instance of the document
*
* @return bool Статус обработки
* @return bool Has the document been updated?
*/
public static function update(_connection $session, _document $document): bool {
// Инициализация обработчика вершин
$documents = new _document_handler($session);
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

@ -0,0 +1,36 @@
<?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
};
}
}

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

@ -4,12 +4,26 @@ declare(strict_types=1);
namespace mirzaev\arangodb;
// Built-in libraries
use exception;
/**
* Terminal
*
* lol sorry
* i did not want to do this
*
* @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>
*/
class terminal
{
/**
* Префикс
*/
protected const PREFIX = 'arangodb';
protected const string PREFIX = 'arangodb';
/**
* Запись в вывод