<?php
namespace PHPFUI;
class ORM
{
public static string $idSuffix = 'Id';
public static string $migrationNamespace = 'App\\Migration';
public static string $namespaceRoot = __DIR__ . '/..';
public static string $recordNamespace = 'App\\Record';
public static string $tableNamespace = 'App\\Table';
private static int | string | null $currentInstance = null;
private static array $instances = [];
private static ?\Psr\Log\AbstractLogger $logger = null;
private static $translationCallback = null;
public static function addConnection(\PHPFUI\ORM\PDOInstance $pdo, string $name = '') : int | string
{
if ($name)
{
self::$currentInstance = $name;
}
else
{
self::$currentInstance = \count(self::$instances);
}
self::$instances[self::$currentInstance] = $pdo;
return self::$currentInstance;
}
public static function beginTransaction() : bool
{
return self::getInstance()->beginTransaction();
}
public static function commit() : bool
{
return self::getInstance()->commit();
}
public static function describeTable(string $table) : array
{
return self::getInstance()->describeTable($table);
}
public static function execute(string $sql, array $input = []) : bool
{
return self::getInstance()->execute($sql, $input);
}
public static function executeStatement(\PDOStatement $statement, array $input = []) : ?\PDOStatement
{
return self::getInstance()->executeStatement($statement, $input);
}
public static function expandResources(array $data) : array
{
if (! self::getInstance()->postGre)
{
return $data;
}
foreach ($data as $key => $value)
{
if (\is_resource($value))
{
$data[$key] = \stream_get_contents($value);
}
}
return $data;
}
public static function getArrayCursor(string $sql = 'select 0 limit 0', array $input = []) : \PHPFUI\ORM\ArrayCursor
{
return self::getInstance()->getArrayCursor($sql, $input);
}
public static function getBaseClassName(string $table) : string
{
$parts = \explode('_', $table);
foreach ($parts as $index => $part)
{
$parts[$index] = \ucfirst($part);
}
return \implode('', $parts);
}
public static function getConnection() : int | string | null
{
return self::$currentInstance;
}
public static function getDataObjectCursor(string $sql = 'select 0 limit 0', array $input = []) : \PHPFUI\ORM\DataObjectCursor
{
return self::getInstance()->getDataObjectCursor($sql, $input);
}
public static function getForeignKeys(string $table) : array
{
return self::getInstance()->getForeignKeys($table);
}
public static function getIndexes(string $table) : array
{
return self::getInstance()->getIndexes($table);
}
public static function getInstance() : \PHPFUI\ORM\PDOInstance
{
if (null === self::$currentInstance)
{
throw new \Exception('You need to call \PHPFUI\ORM::addConnection before accessing database');
}
return self::$instances[self::$currentInstance];
}
public static function getLastError() : string
{
return self::getInstance()->getLastError();
}
public static function getLastErrorCode() : int
{
return self::getInstance()->getLastErrorCode();
}
public static function getLastErrors() : array
{
return self::getInstance()->getLastErrors();
}
public static function getLastParameters() : array
{
return self::getInstance()->getLastParameters();
}
public static function getLastSql() : string
{
return self::getInstance()->getLastSql();
}
public static function getMigrationNamespacePath() : string
{
return self::filePath(self::$namespaceRoot . '/' . self::$migrationNamespace);
}
public static function getRecordCursor(\PHPFUI\ORM\Record $crud, string $sql = 'select 0 limit 0', array $input = []) : \PHPFUI\ORM\RecordCursor
{
return self::getInstance()->getRecordCursor($crud, $sql, $input);
}
public static function getRecordNamespacePath() : string
{
return self::filePath(self::$namespaceRoot . '/' . self::$recordNamespace);
}
public static function getRow(string $sql, array $input = []) : array
{
return self::getInstance()->getRow($sql, $input);
}
public static function getRows(string $sql, array $input = [], int $fetchType = \PDO::FETCH_ASSOC) : array
{
return self::getInstance()->getRows($sql, $input, $fetchType);
}
public static function getTableNamespacePath() : string
{
return self::filePath(self::$namespaceRoot . '/' . self::$tableNamespace);
}
public static function getTables() : array
{
return self::getInstance()->getTables();
}
public static function getValue(string $sql, array $input = []) : string
{
return self::getInstance()->getValue($sql, $input);
}
public static function getValueArray(string $sql, array $input = []) : array
{
return self::getInstance()->getValueArray($sql, $input);
}
public static function lastInsertId(string $name = '', string $table = '') : string
{
$pdo = self::getInstance();
if ($pdo->postGre && $table)
{
$name = $table . '_' . $name . '_seq';
}
return $pdo->lastInsertId($name);
}
public static function log(string $type, string $message, array $context = []) : void
{
if (self::$logger)
{
self::$logger->log($type, $message, $context);
}
}
public static function pdo() : ?\PHPFUI\ORM\PDOInstance
{
return self::getInstance();
}
public static function reportErrors() : void
{
self::getInstance()->reportErrors();
}
public static function rollBack() : bool
{
return self::getInstance()->rollBack();
}
public static function setLogger(\Psr\Log\AbstractLogger $logger) : void
{
self::$logger = $logger;
}
public static function setTranslationCallback($callback) : void
{
self::$translationCallback = $callback;
}
public static function trans(string $text, array $variables = []) : string
{
if (self::$translationCallback)
{
$callback = self::$translationCallback;
return $callback($text, $variables);
}
return $text;
}
public static function useConnection(int | string $connection) : int | string | null
{
$prior = null;
if (\array_key_exists($connection, self::$instances))
{
$prior = self::$currentInstance;
self::$currentInstance = $connection;
}
return $prior;
}
private static function filePath(string $namespace) : string
{
return \str_replace('\\', '/', $namespace);
}
}