Skip to content

Commit

Permalink
Enum problems resolved.
Browse files Browse the repository at this point in the history
  • Loading branch information
AzadDevX committed Mar 18, 2024
1 parent d5d3bf7 commit 13fec99
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 18 deletions.
9 changes: 9 additions & 0 deletions phptest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php
// get 64

enum Status {
case active;
case deactive;
}

var_dump(Status::active->name);
2 changes: 1 addition & 1 deletion src/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class Connection extends Database {

public $Version = "v2.1.1";
public $Version = "v2.1.2";
private $ProjectStartAt;
private $MemoryUsage;
public $HashID;
Expand Down
11 changes: 4 additions & 7 deletions src/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ protected static function PreparingGet($Rows,$TableName) {
$value = $EncrypetName::Decrypt($value);
}
if (isset($ColumnData['enum'])) {
$value = constant("{$ColumnData['enum']}::{$value}");
$value = Enums::ValueToEnum($TableName,$key,$value);
}
if(!isset($ColumnData['enum']) && method_exists(new $ColumnData['type'],"Get")) {
$DB = new $ColumnData['type']();
Expand All @@ -75,21 +75,18 @@ protected static function PreparationValues ($key,$value,$table_name) {

# ----- Check Enum
if(isset($ColumnData['enum'])) {
if (!$value instanceof $ColumnData['enum']) {
throw new Exception\DataType("The value you entered does not match the enum set for the column.");
}
$value = $value->value;
$value = Enums::EnumToValue($table_name,$key,$value);
}

# ---- is valid method (in type)
if(method_exists($ColumnData['type'],"is_valid")) {
if(isset($ColumnData['type']) && method_exists($ColumnData['type'],"is_valid")) {
$DB = new $ColumnData['type']();
if(!$DB->is_valid($value)) {
throw new Exception\DataType("The entered value is not acceptable for type class.");
}
}
# ---- Set method (in type)
if(method_exists($ColumnData['type'],"Set")) {
if(isset($ColumnData['type']) && method_exists($ColumnData['type'],"Set")) {
$DB = new $ColumnData['type']();
$value = $DB->Set($value);
}
Expand Down
10 changes: 7 additions & 3 deletions src/Databases/Mysql/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public static function MakeTable($table_obj) {
$Foreign_Query = null;
$primary_key = null;
array_walk($table_obj->Columns,function($ColumnData,$ColumnName) use (&$Query,&$primary_key,&$Foreign_Query) {
if ($ColumnData['type']->Primary == true) { $primary_key = $ColumnName; }
if ($ColumnData['type']->Primary ?? false == true) { $primary_key = $ColumnName; }
if (isset($ColumnData["foreign"])) { $Foreign_Query = ", FOREIGN KEY (".$ColumnName.") REFERENCES ".$ColumnData["foreign"]["table"]."(".$ColumnData["foreign"]["column"].")"; }
$Query .= self::DataTypeTable ($ColumnName,$ColumnData).", ";
});
Expand Down Expand Up @@ -78,7 +78,11 @@ public static function Where ($key,$value,$Conditions) {
private static function DataTypeTable ($ColumnName,$ColumnData) {
$Query = "`".$ColumnName."` ";
if (isset($ColumnData["enum"])) {
$Case = array_column($ColumnData["enum"]::cases(),'name');
if (isset($ColumnData['enum']::cases()[0]->value)) {
$Case = array_column($ColumnData["enum"]::cases(),'value');
} else {
$Case = array_column($ColumnData["enum"]::cases(),'name');
}
$Case = array_map(fn ($value) => "'".$value."'",$Case);
$Query .= " ENUM (".implode(",",$Case).")";
} else {
Expand All @@ -95,7 +99,7 @@ private static function DataTypeTable ($ColumnName,$ColumnData) {
if (isset($ColumnData['not_null']) and $ColumnData['not_null'] == true) {
$Query .= " NOT NULL ";
}
if (method_exists($ColumnData["type"],"AddToQueryTable")) {
if (isset($ColumnData["type"]) && method_exists($ColumnData["type"],"AddToQueryTable")) {
$Query .= " ".$ColumnData["type"]->AddToQueryTable();
}
return $Query;
Expand Down
40 changes: 40 additions & 0 deletions src/Enums.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Azad\Database;

class Enums extends Database {
public static function ValueToEnum($table,$column,$value) {
$ColumnData = parent::$Tables[parent::$MyHash][$table]['columns'][$column];
if (isset($ColumnData['enum'])) {
if (isset($ColumnData['enum']::cases()[0]->value)) {
$value = $ColumnData['enum']::tryFrom($value);
} else {
$value = constant("{$ColumnData['enum']}::{$value}");
}
}
return $value;
}
public static function EnumToValue($table,$column,$enum) {
$ColumnData = parent::$Tables[parent::$MyHash][$table]['columns'][$column];
if (isset($ColumnData['enum'])) {
if (!$enum instanceof $ColumnData['enum']) {
throw new \Azad\Database\Exception\DataType("The values of the enum class do not match the database data.");
}
if (isset($ColumnData['enum']::cases()[0]->value)) {
$value = $enum->value;
} else {
$value = $enum->name;
}
}
return $value;
}

}

/*
*/
5 changes: 4 additions & 1 deletion src/Table/Columns/Get.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ protected static function where_data($data,$TableName) {
}
$value = $EncrypetName::Encrypt($value);
}
if(method_exists($ColumnData['type'],"Set")) {
if (isset($ColumnData['enum'])) {
$value = \Azad\Database\Enums::EnumToValue($TableName,$key,$value);
}
if(isset($ColumnData['type']) && method_exists($ColumnData['type'],"Set")) {
$DB = new $ColumnData['type']();
$value = $DB->Set($value);
}
Expand Down
5 changes: 5 additions & 0 deletions src/Table/Columns/Update/Row.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ public function Push () {
if ($this->IFResult == false) {
return false;
}


$NewData = array_merge($this->Data,parent::$UpdateData);
foreach($NewData as $key=>$value) {
$NewData[$key] = \Azad\Database\Enums::ValueToEnum($this->Table,$key,$value);
}

if(parent::$SystemConfig[parent::$MyHash]['RAM'] == true) {
parent::SaveToRam ($this->Table,[$NewData]);
Expand Down
2 changes: 2 additions & 0 deletions src/Table/Columns/Update/Rows.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,13 @@ public function Push () {
$Data[$DKey][$Key] = parent::$UpdateData[$Key]['value'] - $Value;
}
}
$Data[$DKey][$Key] = \Azad\Database\Enums::ValueToEnum($this->Table,$Key,$Data[$DKey][$Key]);
}
$Query = parent::MakeQuery()::Edit($this->Table,$Data[$DKey],parent::where_data($OldDataForWhere,$this->Table));
if($this->Query($Query) != true) {
throw new Exception("Failed Update - Query: ".$Query);
}

}
return new \Azad\Database\Table\Columns\ReturnData($this->Table,$Data,parent::$MyHash);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Table/Insert.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public function __construct($TableName,$Hash) {
$this->TableName = $TableName;
$this->Hash = $Hash;
array_walk(parent::$Tables[$Hash][$TableName]['short_types'],function ($value,$key) {
if(method_exists(new $value(),"InsertMe")) {
if(is_object($value) && method_exists(new $value(),"InsertMe")) {
$DB = new $value();
$this->Key($key)->Value($DB->InsertMe());
}
Expand Down
10 changes: 6 additions & 4 deletions src/Table/Make.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,14 @@ final protected function Enum (string $enum_class) {
if (!isset($enum_class::cases()[0])) {
throw new Exception("Your enum has no cases.");
}
if (!isset($enum_class::cases()[0]->value)) {
throw new Exception("You need to set the data type for the enum.");
if (isset($enum_class::cases()[0]->value)) {
$this->Columns[$this->Name]['type'] = gettype($enum_class::cases()[0]->value) == "string"?new \Azad\Database\Types\Varchar():new \Azad\Database\Types\Integer();
$this->ShortKeyType[$this->Name] = $this->Columns[$this->Name]['type'];
} else {
$this->ShortKeyType[$this->Name] = "enum";
}

$this->Columns[$this->Name]['enum'] = $enum_class;
$this->Columns[$this->Name]['type'] = gettype($enum_class::cases()[0]->value) == "string"?new \Azad\Database\Types\Varchar():new \Azad\Database\Types\Integer();
$this->ShortKeyType[$this->Name] = $this->Columns[$this->Name]['type'];
return $this;
}

Expand Down
6 changes: 5 additions & 1 deletion test.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@
$Find = $Users->Select("*")->WHERE("user_id",1);
$Data = $Find->LastRow();

var_dump($Data->Result['status']->value); // 1

var_dump($Data->Result['status']->value ?? "no value"); // 1
var_dump($Data->Result['status']->name); // "Active"
var_dump($Data->Result['status']->toPersian()); // فعال
var_dump($Data->Result['status'] == MyProject\Enums\UserStatus::Active); // true

$New = $Data->Update
->Key("status")->Value(MyProject\Enums\UserStatus::Disable)
->Push();

/*
Expand Down

0 comments on commit 13fec99

Please sign in to comment.