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