created from svoboda/antivertical
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
vendor
|
||||
33
composer.json
Normal file
33
composer.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "mirzaev/record",
|
||||
"description": "Active Record pattern for Baza",
|
||||
"homepage": "https://git.svoboda.works/mirzaev/record",
|
||||
"type": "pattern",
|
||||
"keywords": [
|
||||
"baza"
|
||||
],
|
||||
"readme": "README.md",
|
||||
"license": "WTFPL",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arsen Mirzaev Tatyano-Muradovich",
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"homepage": "https://mirzaev.sexy",
|
||||
"role": "Creator"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"wiki": "https://git.svoboda.works/mirzaev/record/wiki",
|
||||
"issues": "https://git.svoboda.works/mirzaev/record/issues"
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.4",
|
||||
"svoboda/time": "^1.0",
|
||||
"mirzaev/baza": "^3.4"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mirzaev\\record\\": "mirzaev/record/system"
|
||||
}
|
||||
}
|
||||
}
|
||||
97
composer.lock
generated
Normal file
97
composer.lock
generated
Normal file
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "0c82d08a56b9613dcd0f25c1e08ce433",
|
||||
"packages": [
|
||||
{
|
||||
"name": "mirzaev/baza",
|
||||
"version": "3.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.svoboda.works/mirzaev/baza",
|
||||
"reference": "ec2721dc7727ebcd43b780892f3df6831dfff06b"
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.4"
|
||||
},
|
||||
"type": "database",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mirzaev\\baza\\": "mirzaev/baza/system/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arsen Mirzaev Tatyano-Muradovich",
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"homepage": "https://mirzaev.sexy",
|
||||
"role": "Programmer"
|
||||
}
|
||||
],
|
||||
"description": "Lightweight binary database by pure PHP",
|
||||
"homepage": "https://git.svoboda.works/mirzaev/baza",
|
||||
"keywords": [
|
||||
"Plain",
|
||||
"binary",
|
||||
"lightweight"
|
||||
],
|
||||
"support": {
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"issues": "https://git.svoboda.works/mirzaev/baza/issues",
|
||||
"wiki": "https://git.svoboda.works/mirzaev/baza/wiki"
|
||||
},
|
||||
"time": "2025-08-08T14:27:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "svoboda/time",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.svoboda.works/svoboda/time",
|
||||
"reference": "0764960606d56a9f0865ebb07671d30a7d232b6a"
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"svoboda\\time\\": "svoboda/time/system"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arsen Mirzaev Tatyano-Muradovich",
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"homepage": "https://mirzaev.sexy",
|
||||
"role": "Programmer"
|
||||
}
|
||||
],
|
||||
"description": "Time since Svoboda was created",
|
||||
"homepage": "https://git.svoboda.works/svoboda/time",
|
||||
"time": "2025-02-02T11:04:25+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": "^8.4"
|
||||
},
|
||||
"platform-dev": {},
|
||||
"plugin-api-version": "2.6.0"
|
||||
}
|
||||
66
mirzaev/record/system/interfaces/record.php
Normal file
66
mirzaev/record/system/interfaces/record.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace mirzaev\record\interfaces;
|
||||
|
||||
// Svoboda time
|
||||
use svoboda\time\statement as svoboda;
|
||||
|
||||
// Baza database
|
||||
use mirzaev\baza\database,
|
||||
mirzaev\baza\column,
|
||||
mirzaev\baza\record,
|
||||
mirzaev\baza\enumerations\encoding,
|
||||
mirzaev\baza\enumerations\type;
|
||||
|
||||
// Built-in libraries
|
||||
use Exception as exception,
|
||||
RuntimeException as exception_runtime,
|
||||
LogicException as exception_logic,
|
||||
InvalidArgumentException as exception_invalid_argument;
|
||||
|
||||
/**
|
||||
* Active Record
|
||||
*
|
||||
* The "Active Record" architectural pattern
|
||||
*
|
||||
* @see https://en.wikipedia.org/wiki/Active_record_pattern Active Record
|
||||
*
|
||||
* @package mirzaev\record\interfaces
|
||||
*
|
||||
* @method static|false read(callable $filter) Read from the database
|
||||
* @method static|false update() Update the record in the database
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
interface ar
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @throws exception_invalid_argument If not initialized the database columns parameters
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct();
|
||||
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* Search for the record in the database
|
||||
*
|
||||
* @return static|false The record impementator object, if found
|
||||
*/
|
||||
public function read(callable $filter): static|false;
|
||||
|
||||
/**
|
||||
* Update
|
||||
*
|
||||
* Write the record new values into the database
|
||||
*
|
||||
* @return static|false The updated record, if updated (new instance)
|
||||
*/
|
||||
public function update(): static|false;
|
||||
}
|
||||
154
mirzaev/record/system/traits/record.php
Normal file
154
mirzaev/record/system/traits/record.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace mirzaev\record\traits;
|
||||
|
||||
// Svoboda time
|
||||
use svoboda\time\statement as svoboda;
|
||||
|
||||
// Baza database
|
||||
use mirzaev\baza\database,
|
||||
mirzaev\baza\column,
|
||||
mirzaev\baza\record,
|
||||
mirzaev\baza\enumerations\encoding,
|
||||
mirzaev\baza\enumerations\type;
|
||||
|
||||
// Built-in libraries
|
||||
use Exception as exception,
|
||||
RuntimeException as exception_runtime,
|
||||
LogicException as exception_logic,
|
||||
InvalidArgumentException as exception_invalid_argument;
|
||||
|
||||
/**
|
||||
* Active Record
|
||||
*
|
||||
* The "Active Record" architectural pattern
|
||||
*
|
||||
* @see https://en.wikipedia.org/wiki/Active_record_pattern Active Record
|
||||
*
|
||||
* @package mirzaev\record\traits
|
||||
*
|
||||
* @method self __construct(?record $record) Constructor
|
||||
* @method static|false read(callable $filter) Read from the database
|
||||
* @method static|false update() Update the record in the database
|
||||
* @method void __set(string $name, mixed $value = null) Write into the database record property
|
||||
* @method mixed __get(string $name) Read from the database record property
|
||||
* @method bool __isset(string $name) Check that the database record property is initialized
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
trait record
|
||||
{
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* Search for the record in the database
|
||||
*
|
||||
* @return static|false The record impementator object, if found
|
||||
*/
|
||||
public function read(callable $filter): static|false
|
||||
{
|
||||
// Reading from the database
|
||||
$record = $this->database->read(
|
||||
filter: $filter,
|
||||
amount: 1,
|
||||
offset: 0
|
||||
)[0] ?? false;
|
||||
|
||||
if ($record instanceof record) {
|
||||
// Initialized the record
|
||||
|
||||
// Exit (success)
|
||||
return new static($record);
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update
|
||||
*
|
||||
* Write the record new values into the database
|
||||
*
|
||||
* @return static|false The updated record, if updated (new instance)
|
||||
*/
|
||||
public function update(): static|false
|
||||
{
|
||||
// Writing into the database
|
||||
$record = $this->database->read(
|
||||
filter: fn(record $record) => $record->identifier === $this->record->identifier,
|
||||
update: function (record &$record) {
|
||||
$this->record->updated = mirzaev::timestamp();
|
||||
$record = $this->record;
|
||||
},
|
||||
amount: 1,
|
||||
offset: 0
|
||||
)[0] ?? false;
|
||||
|
||||
if ($record instanceof record) {
|
||||
// Initialized the record
|
||||
|
||||
// Exit (success)
|
||||
return new static($record);
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write
|
||||
*
|
||||
* Write into the database record property
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
* @param mixed $value Value of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __set(string $name, mixed $value = null): void
|
||||
{
|
||||
match ($name) {
|
||||
'record' => $this->record = $value,
|
||||
default => $this->record->{$name} = $value
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* Read from the database record property
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return mixed Content of the property, if they are found
|
||||
*/
|
||||
public function __get(string $name): mixed
|
||||
{
|
||||
return match ($name) {
|
||||
'record' => $this->record,
|
||||
default => $this->record->{$name}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for initialization
|
||||
*
|
||||
* Check that the database record property is initialized
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return bool The property is initialized?
|
||||
*/
|
||||
public function __isset(string $name): bool
|
||||
{
|
||||
// Check of initialization of the property and exit (success)
|
||||
return match ($name) {
|
||||
'record' => isset($this->record),
|
||||
default => isset($this->record->{$name})
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user