From 7783dab80be4d2c7e17f085c6afe5c79cd4f5023 Mon Sep 17 00:00:00 2001 From: Little Fluffy Clouds Date: Sat, 12 Jul 2025 12:18:08 +0300 Subject: [PATCH] implement core class and architecture enum --- mirzaev/baza/system/core.php | 34 +++++++++++++++ mirzaev/baza/system/database.php | 21 +++------ .../baza/system/enumerations/architecture.php | 22 ++++++++++ mirzaev/baza/tests/record.php | 43 +++++++++++-------- 4 files changed, 85 insertions(+), 35 deletions(-) create mode 100644 mirzaev/baza/system/core.php create mode 100644 mirzaev/baza/system/enumerations/architecture.php diff --git a/mirzaev/baza/system/core.php b/mirzaev/baza/system/core.php new file mode 100644 index 0000000..1277a0d --- /dev/null +++ b/mirzaev/baza/system/core.php @@ -0,0 +1,34 @@ + + */ + +final class core +{ + public static function architecture(): ?architecture { + return match(PHP_INT_SIZE) { + 4 => architecture::x86, + 8 => architecture::x86_64, + default => throw new exception_domain('Failed to determinate the system architecture'), + }; + } +} diff --git a/mirzaev/baza/system/database.php b/mirzaev/baza/system/database.php index af560c1..2fd09f2 100755 --- a/mirzaev/baza/system/database.php +++ b/mirzaev/baza/system/database.php @@ -6,6 +6,7 @@ namespace mirzaev\baza; // Files of the project use mirzaev\baza\enumerations\encoding, + mirzaev\baza\enumerations\architecture, mirzaev\baza\enumerations\type; // Built-in libraries @@ -13,16 +14,6 @@ use LogicException as exception_logic, InvalidArgumentException as exception_invalid_argument, RuntimeException as exception_runtime; -/** - * ARCH - * - * Checking for PHP implementation architecture - * - * Using php_uname('m') is another way of doing that - * but it's simpler to check for max integer size - */ -define('ARCH', (PHP_INT_SIZE === 8) ? 64 : 32); - /** * Database * @@ -176,7 +167,7 @@ class database * * @param mixed[] $values Values of the record * - * @throws exceptiin_invalid_argument if the balue type not matches the column values types + * @throws exception_invalid_argument if the balue type not matches the column values types * @throws exception_logic if amount of columns not matches the amount of values * * @return record|null The record instance @@ -227,7 +218,6 @@ class database * Pack the record values * * @param record $record The record - * @const integer ARCH PHP architecture * * @return string Packed values */ @@ -257,7 +247,7 @@ class database * we got to splice 64-bit integer into two separate longs * next to each other in binary representation */ - else if (ARCH === 64 && + else if (core::architecture() === architecture::x86_64 && ($column->type === type::integer || $column->type === type::integer_unsigned)) { @@ -290,7 +280,6 @@ class database * Unpack binary values and implement them as a `record` instance * * @param array $binaries Binary values in the same order as the columns - * @const integer ARCH PHP architecture * * @return record The unpacked record from binary values */ @@ -321,14 +310,14 @@ class database $unpacked[] = $encoded; } /** - * PHP builtin pack() ignores 64-bit integer values +p * PHP builtin pack() ignores 64-bit integer values * found on 64-bit PHP distributions * @see https://www.php.net/manual/en/function.pack.php#109382 * * In case of integer type on 64-bit PHP distributions * we got to reconstruct previosly spliced integer value */ - else if (ARCH === 64 && + else if (core::architecture() === architecture::x86_64 && ($column->type === type::integer || $column->type === type::integer_unsigned)) { diff --git a/mirzaev/baza/system/enumerations/architecture.php b/mirzaev/baza/system/enumerations/architecture.php new file mode 100644 index 0000000..cef1791 --- /dev/null +++ b/mirzaev/baza/system/enumerations/architecture.php @@ -0,0 +1,22 @@ + + */ + +enum architecture: int +{ + case x86 = 32; + case x86_64 = 64; +} diff --git a/mirzaev/baza/tests/record.php b/mirzaev/baza/tests/record.php index 32b81dc..15c93a1 100755 --- a/mirzaev/baza/tests/record.php +++ b/mirzaev/baza/tests/record.php @@ -3,9 +3,11 @@ declare(strict_types=1); use mirzaev\baza\database, + mirzaev\baza\core, mirzaev\baza\record, mirzaev\baza\column, mirzaev\baza\enumerations\encoding, + mirzaev\baza\enumerations\architecture, mirzaev\baza\enumerations\type; // Initializing path to the composer loader file (main project) @@ -34,6 +36,9 @@ require($autoload); // Initializing path to the database file $file = __DIR__ . DIRECTORY_SEPARATOR . 'temporary' . DIRECTORY_SEPARATOR . 'database.baza'; +// Initilized architecture runtime constant +define('ARCHITECTURE', core::architecture()); + echo "Started testing\n\n\n"; // Initializing the counter of actions @@ -53,7 +58,7 @@ if (!file_exists($file) || unlink($file)) { // Initializing the test database /* $database = new database() */ -if (PHP_INT_SIZE === 8) { +if (ARCHITECTURE === architecture::x86_64) { $database = (new database()) ->encoding(encoding::utf8) ->columns( @@ -84,7 +89,7 @@ if (PHP_INT_SIZE === 8) { echo '[' . ++$action . "] Initialized the database\n"; // Initializing the record -if (ARCH === 64) { +if (ARCHITECTURE === architecture::x86_64) { $record = $database->record( 'Arsen', 'Mirzaev', @@ -114,7 +119,7 @@ echo '[' . ++$action . '][' . ++$test . '][' . ($record->name === 'Arsen' ? 'SUC echo '[' . $action . '][' . ++$test . '][' . ($record->second_name === 'Mirzaev' ? 'SUCCESS' : 'FAIL') . "][\"second_name\"] Expected: \"Mirzaev\" (string). Actual: \"$record->second_name\" (" . gettype($record->second_name) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($record->age === 24 ? 'SUCCESS' : 'FAIL') . "][\"age\"] Expected: \"24\" (integer). Actual: \"$record->age\" (" . gettype($record->age) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($record->height === 165.5 ? 'SUCCESS' : 'FAIL') . "][\"height\"] Expected: \"165.5\" (double). Actual: \"$record->height\" (" . gettype($record->height) . ")\n"; -if (ARCH === 64) { +if (ARCHITECTURE === architecture::x86_64) { echo '[' . $action . '][' . ++$test . '][' . ($record->neuron_count === 91000000000 ? 'SUCCESS' : 'FAIL') . "][\"neuron_count\"] Expected: \"91000000000\" (integer). Actual: \"$record->neuron_count\" (" . gettype($record->neuron_count) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($record->motivation === 1.7976931348623E+238 ? 'SUCCESS' : 'FAIL') . "][\"motivation\"] Expected: \"1.7976931348623E+238\" (double). Actual: \"$record->motivation\" (" . gettype($record->motivation) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($record->reputation === 7355608 ? 'SUCCESS' : 'FAIL') . "][\"reputation\"] Expected: \"7355608\" (integer). Actual: \"$record->reputation\" (" . gettype($record->reputation) . ")\n"; @@ -132,7 +137,7 @@ $database->write($record); echo '[' . ++$action . "] Writed the record into the database\n"; // Initializing the second record -if (ARCH === 64) { +if (ARCHITECTURE === architecture::x86_64) { $record_ivan = $database->record( 'Ivan', 'Ivanov', @@ -161,7 +166,7 @@ $database->write($record_ivan); echo '[' . ++$action . "] Writed the record into the database\n"; // Initializing the second record -if (ARCH === 64) { +if (ARCHITECTURE === architecture::x86_64) { $record_margarita = $database->record( 'Margarita', 'Esenina', @@ -199,7 +204,7 @@ try { echo '[' . $action . '][' . ++$test . '][' . (count($records_readed_all) === 3 ? 'SUCCESS' : 'FAIL') . '][amount of readed records] Expected: 3 records. Actual: ' . count($records_readed_all) . " records\n"; echo '[' . $action . '][' . ++$test . '][' . (gettype($records_readed_all[0]) === 'object' ? 'SUCCESS' : 'FAIL') . '][type of readed values] Expected: "object". Actual: "' . gettype($records_readed_all[0]) . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_all[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $records_readed_all[0]::class . "\"\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { echo '[' . $action . '][' . ++$test . '][' . ($records_readed_all[0]->neuron_count === 91000000000 ? 'SUCCESS' : 'FAIL') . ']["neuron_count"] Expected: "91000000000" (integer). Actual: "' . $records_readed_all[0]->neuron_count . '" (' . gettype($records_readed_all[0]->neuron_count) . ")\n"; } @@ -222,7 +227,7 @@ try { echo '[' . $action . '][' . ++$test . '][' . (gettype($record_readed_first[0]) === 'object' ? 'SUCCESS' : 'FAIL') . '][type of readed values] Expected: "object". Actual: "' . gettype($record_readed_first[0]) . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_first[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $record_readed_first[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_first[0]->second_name === 'Mirzaev' ? 'SUCCESS' : 'FAIL') . ']["second_name"] Expected: "Mirzaev" (string). Actual: "' . $record_readed_first[0]->second_name . '" (' . gettype($record_readed_first[0]->second_name) . ")\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { echo '[' . $action . '][' . ++$test . '][' . ($record_readed_first[0]->neuron_count === 91000000000 ? 'SUCCESS' : 'FAIL') . ']["neuron_count"] Expected: "91000000000" (integer). Actual: "' . $record_readed_first[0]->neuron_count . '" (' . gettype($record_readed_first[0]->neuron_count) . ")\n"; } @@ -245,9 +250,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . (gettype($record_readed_second[0]) === 'object' ? 'SUCCESS' : 'FAIL') . '][type of readed values] Expected: "object". Actual: "' . gettype($record_readed_second[0]) . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_second[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $record_readed_second[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_second[0]->second_name === 'Ivanov' ? 'SUCCESS' : 'FAIL') . ']["second_name"] Expected: "Ivanov" (string). Actual: "' . $record_readed_second[0]->second_name . '" (' . gettype($record_readed_second[0]->second_name) . ")\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */ @@ -274,9 +279,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . (gettype($record_readed_filter[0]) === 'object' ? 'SUCCESS' : 'FAIL') . '][type of readed values] Expected: "object". Actual: "' . gettype($record_readed_filter[0]) . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_filter[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $record_readed_filter[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($record_readed_filter[0]->second_name === 'Ivanov' ? 'SUCCESS' : 'FAIL') . ']["second_name"] Expected: "Ivanov" (string). Actual: "' . $record_readed_filter[0]->second_name . '" (' . gettype($record_readed_filter[0]->second_name) . ")\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */ @@ -304,9 +309,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $records_readed_filter_amount[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount[0]->age === 24 ? 'SUCCESS' : 'FAIL') . ']["age"] Expected: "24" (integer). Actual: "' . $records_readed_filter_amount[0]->age . '" (' . gettype($records_readed_filter_amount[0]->age) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount[0]->second_name === 'Mirzaev' ? 'SUCCESS' : 'FAIL') . ']["second_name"] Expected: "Mirzaev" (string). Actual: "' . $records_readed_filter_amount[0]->second_name . '" (' . gettype($records_readed_filter_amount[0]->second_name) . ")\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */ @@ -334,9 +339,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount_offset[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $records_readed_filter_amount_offset[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount_offset[0]->age === 24 ? 'SUCCESS' : 'FAIL') . ']["age"] Expected: "24" (integer). Actual: "' . $records_readed_filter_amount_offset[0]->age . '" (' . gettype($records_readed_filter_amount_offset[0]->age) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_amount_offset[0]->second_name === 'Ivanov' ? 'SUCCESS' : 'FAIL') . ']["second_name"] Expected: "Ivanov" (string). Actual: "' . $records_readed_filter_amount_offset[0]->second_name . '" (' . gettype($records_readed_filter_amount_offset[0]->second_name) . ")\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */ @@ -369,9 +374,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_delete[0] instanceof record ? 'SUCCESS' : 'FAIL') . '][class of readed object values] Expected: "' . record::class . '". Actual: "' . $records_readed_filter_delete[0]::class . "\"\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_delete[0]->name === 'Ivan' ? 'SUCCESS' : 'FAIL') . ']["name"] Expected: "Ivan" (string). Actual: "' . $records_readed_filter_delete[0]->second_name . '" (' . gettype($records_readed_filter_delete[0]->second_name) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . (count($records_readed_filter_delete_readed) === 2 ? 'SUCCESS' : 'FAIL') . '][amount of readed records after deleting] Expected: 2 records. Actual: ' . count($records_readed_filter_delete_readed) . " records\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */ @@ -405,9 +410,9 @@ try { echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_update[0]->height === 165.5 ? 'SUCCESS' : 'FAIL') . ']["height"] Expected: "165.5" (double). Actual: "' . $records_readed_filter_update[0]->height . '" (' . gettype($records_readed_filter_update[0]->height) . ")\n"; echo '[' . $action . '][' . ++$test . '][' . (count($records_readed_filter_update_readed) === 2 ? 'SUCCESS' : 'FAIL') . '][amount of readed records after updating] Expected: 2 records. Actual: ' . count($records_readed_filter_update_readed) . " records\n"; echo '[' . $action . '][' . ++$test . '][' . ($records_readed_filter_update_readed[1]->height === $records_readed_filter_update[0]->height ? 'SUCCESS' : 'FAIL') . "] Height from `update` process response matched height from the `read` preocess response\n"; - if (ARCH === 64) { + if (ARCHITECTURE === architecture::x86_64) { /** - * Due to IEEE 754 double precision format double equility is problematic + * Due to IEEE 754 double precision format double equality is problematic * * @see https://www.php.net/manual/en/language.types.float.php#113703 */