Files
nibiru-framework.com/core/c/table.php

449 lines
12 KiB
PHP
Executable File

<?php
namespace Nibiru;
/**
* Created by PhpStorm.
* User: kasdorf
* Date: 17.01.18
* Time: 15:52
*/
class Table
{
const CONFIG_SECTION = "GENERATOR";
const DB_CONFIG_SECTION = "DATABASE";
const DB_CONFIG_TEMPLATE = "modeltemplate";
const DB_CONFIG_BASENAME = "basename";
const DB_CONFIG_DRIVER = "driver";
const DB_CONFIG_SECTION_MODEL = "folder-out";
const DB_CONFIG_SECTION_DB = "config-section";
const DB_DRIVER_POSTGRESS = "psql";
const DB_DRIVER_MYSQL = "mysql";
const DB_OVERWRITE_MODELS = "database.overwrite";
const ADAPTER_POSTGRES = "Postgres";
const ADAPTER_POSTGRESQL = "Postgresql";
const ADAPTER_MYSQL = "MySQL";
const ADAPTER_PDO = "Pdo";
const PARAMETERS = array(
'--table',
'--help',
'--folder-out',
'--config-section'
);
private $_table = "";
private $_database = "";
private $_folder_out = "";
private $_tables = array();
private $_fields = array();
private $_db_namespace = "";
private $_params = array();
private $_template_file = "";
private $_model_template = "";
private $_config_section = "";
private $_database_driver = "";
private $_folder_namespace = "";
public function __construct( $argv )
{
//get parameters
if(is_array($argv))
{
foreach ($argv as $entry)
{
$this->_setParams($entry);
}
}
$this->displayHelp();
$this->_setConfigSection();
$this->_setDatabaseDriver();
$this->_setDatabase();
$this->_setDbNamespace();
$this->_setFolderNamespace();
$this->_setFolderOut();
$this->_setTable();
$this->_setTemplateFile( Config::getInstance()->getConfig()[self::CONFIG_SECTION][self::DB_CONFIG_TEMPLATE] );
$this->_setModelTemplate();
$this->_setTables();
}
protected function displayHelp()
{
if(array_key_exists('help', $this->getParams()))
{
echo "--------------------------------------------------------------------\n";
echo "\e[48;5;0mAutogenerator for the database model classes in order to gain access\n";
echo "\e[48;5;0mto the database. The following parameters are required: \n";
echo "\e[16;5;0m--------------------------------------------------------------------\n";
echo "\n";
echo "--table=TABLENAME\n";
echo "( will generate only that table and overwrite the Model file )\n";
echo "\n";
echo "--help\n";
echo "( will display this help, and not execute any further )\n";
echo "\n";
echo "--folder-out=PATH-TO-MODEL-FOLDER\n";
echo "( will output the files into that folder )\n";
echo "\n";
echo "--config-section=CONFIGSECTION\n";
echo "( is attached to the settings.env.ini file and\n";
echo "reads that configuration to connect to the database )\n\n";
echo "--------------------------------------------------------------------\n";
echo "\e[48;5;0m \n";
echo "\e[16;5;0m--------------------------------------------------------------------\n";
die();
}
}
/**
* @return string
*/
protected function getFolderNamespace(): string
{
return $this->_folder_namespace;
}
/**
* @desc will convert the folder name to hungarian notation
*/
private function _setFolderNamespace( ): void
{
if(strstr($this->getDatabase(), '-'))
{
$parts = explode('-', $this->getDatabase());
foreach($parts as $part)
{
$this->_folder_namespace .= ucfirst($part);
}
}
if(strstr($this->getDatabase(), '_'))
{
$parts = explode('_', $this->getDatabase());
foreach($parts as $part)
{
$this->_folder_namespace .= ucfirst($part);
}
}
if(!$this->getFolderNamespace())
{
$this->_folder_namespace = $this->getDatabase();
}
}
/**
* @return string
*/
protected function getDatabaseDriver(): string
{
return $this->_database_driver;
}
/**
* @param string $database_driver
*/
private function _setDatabaseDriver(): void
{
$this->_database_driver = Config::getInstance()->getConfig()[$this->getConfigSection()][self::DB_CONFIG_DRIVER];
}
/**
* @return string
*/
protected function getConfigSection()
{
return $this->_config_section;
}
/**
* @param string $config_section
*/
private function _setConfigSection( )
{
if(array_key_exists('config-section', $this->getParams()))
{
$this->_config_section = $this->getParams()['config-section'];
}
else
{
if(Config::getInstance()->getConfig()[self::CONFIG_SECTION][self::DB_CONFIG_SECTION_DB])
{
$this->_config_section = Config::getInstance()->getConfig()[self::CONFIG_SECTION][self::DB_CONFIG_SECTION_DB];
}
else
{
$this->_config_section = self::DB_CONFIG_SECTION;
}
}
}
/**
* @return string
*/
protected function getDatabase()
{
return $this->_database;
}
/**
* @param string $database
*/
private function _setDatabase( )
{
$this->_database = Config::getInstance()->getConfig()[$this->getConfigSection()][self::DB_CONFIG_BASENAME];
}
/**
* @return string
*/
protected function getFolderOut()
{
return $this->_folder_out;
}
/**
* @param string $folder_out
*/
private function _setFolderOut( )
{
if(array_key_exists(self::DB_CONFIG_SECTION, $this->getParams()))
{
$this->_folder_out = $this->getParams()[self::DB_CONFIG_SECTION_MODEL] . $this->getFolderNamespace();
}
else
{
$this->_folder_out = __DIR__ . Config::getInstance()->getConfig()[self::CONFIG_SECTION][self::DB_CONFIG_SECTION_MODEL] . $this->getFolderNamespace();
}
}
/**
* @return array
*/
protected function getTables()
{
return $this->_tables;
}
/**
* @param array $tables
*/
private function _setTables( )
{
if($this->getDatabaseDriver()==self::DB_DRIVER_POSTGRESS)
{
if(Config::getInstance()->getConfig()[self::CONFIG_SECTION]['odbc'])
{
Postgres::settingsSection( $this->getConfigSection() );
$result = Postgres::query(
'SELECT table_name
FROM information_schema.tables
WHERE table_schema=\'public\'
AND table_type=\'BASE TABLE\';'
);
foreach ($result as $entry)
{
$this->_setFields($entry["table_name"]);
$this->_tables[$entry["table_name"]] = $this->getFields();
}
}
else
{
Postgresql::settingsSection( $this->getConfigSection() );
$result = Postgresql::query(
'SELECT table_name
FROM information_schema.tables
WHERE table_schema=\'public\'
AND table_type=\'BASE TABLE\';'
);
foreach ($result as $entry)
{
$this->_setFields($entry["table_name"]);
$this->_tables[$entry["table_name"]] = $this->getFields();
}
}
}
if($this->getDatabaseDriver()==self::DB_DRIVER_MYSQL)
{
Pdo::settingsSection( $this->getConfigSection() );
$result = Pdo::queryString('SHOW TABLES;');
foreach ($result as $entry)
{
$this->_setFields(array_shift($entry));
$this->_tables[array_shift($entry)] = $this->getFields();
}
}
}
/**
* @return string
*/
protected function getDbNamespace()
{
return $this->_db_namespace;
}
/**
* @param string $db_namespace
*/
private function _setDbNamespace( )
{
$this->_db_namespace = ucfirst($this->getDatabase());
}
/**
* @return string
*/
protected function getModelTemplate()
{
return $this->_model_template;
}
/**
* @param string $model_template
*/
private function _setModelTemplate( )
{
try
{
if(file_exists($this->getTemplateFile()))
{
$this->_model_template = file_get_contents($this->getTemplateFile());
}
else
{
throw new \Exception('ERROR: no Template file found, please provide one like in the example!');
}
} catch (\Exception $e)
{
echo "\n" . $e->getMessage() . "\n";
}
}
/**
* @return string
*/
public function getTable()
{
return $this->_table;
}
/**
* @param string $table
*/
private function _setTable( )
{
if(array_key_exists('table', $this->getParams()))
{
$this->_table = $this->getParams()['table'];
}
}
/**
* @return array
*/
protected function getFields()
{
return $this->_fields;
}
/**
* @param array $fields
*/
private function _setFields( $table )
{
$this->_fields = array();
if($this->getDatabaseDriver()==self::DB_DRIVER_POSTGRESS)
{
if(Config::getInstance()->getConfig()[self::CONFIG_SECTION]['odbc'])
{
Postgres::settingsSection( $this->getConfigSection() );
$result = Postgres::query(
'SELECT *
FROM information_schema.columns
WHERE table_schema = \'public\'
AND table_name = \'' . $table . '\''
);
foreach( $result as $field )
{
$this->_fields[] = $field['column_name'];
}
}
else
{
Postgresql::settingsSection( $this->getConfigSection() );
$result = Postgresql::query(
'SELECT *
FROM information_schema.columns
WHERE table_schema = \'public\'
AND table_name = \'' . $table . '\''
);
foreach( $result as $field )
{
$this->_fields[] = $field['column_name'];
}
}
}
if($this->getDatabaseDriver()==self::DB_DRIVER_MYSQL)
{
Pdo::settingsSection( $this->getConfigSection() );
$result = Pdo::queryString('DESCRIBE ' . $table . ';' );
foreach($result as $field)
{
$this->_fields[] = $field['Field'];
}
}
}
/**
* @return array
*/
protected function getParams()
{
return $this->_params;
}
/**
* @param array $params
*/
private function _setParams( $param )
{
$keyvalue = explode('--', $param);
if(array_key_exists(1, $keyvalue))
{
$keyvalue = explode("=", $keyvalue[1]);
if(array_key_exists(1, $keyvalue))
{
$this->_params[$keyvalue[0]] = $keyvalue[1];
}
else
{
$this->_params[$keyvalue[0]] = false;
}
}
}
/**
* @return string
*/
protected function getTemplateFile()
{
return $this->_template_file;
}
/**
* @param string $template_file
*/
private function _setTemplateFile( $template_file )
{
if(file_exists(__DIR__ . "/" . $template_file))
{
$this->_template_file = __DIR__ . "/" . $template_file;
}
}
}