phamodels/bin/padmin

549 lines
13 KiB
PHP
Executable file

#!/usr/bin/php
<?php
if (file_exists(__DIR__.'/../../../autoload.php'))
{
require __DIR__.'/../../../autoload.php';
}
else
{
require __DIR__.'/vendor/autoload.php';
}
use PhangoApp\PhaModels\SQLClass;
use PhangoApp\PhaModels\WebModel;
use PhangoApp\PhaUtils\Utils;
use League\CLImate\CLImate;
Utils::load_config('config');
Utils::load_config('config_i18n');
$options=getopt('', array('model:'));
padminConsole($options);
function padminConsole($options)
{
#$options=get_opts_console('', $arr_opts=array('model:'));
$climate = new League\CLImate\CLImate;
if(!isset($options['model']))
{
//echo "Use: php console.php -m=padmin -c=padmin --model=module/model\n";
$climate->white()->backgroundBlack()->out("Use: padmin --model=path/to/model");
exit(0);
}
$arr_option=explode('/', $options['model']);
settype($arr_option[0], 'string');
settype($arr_option[1], 'string');
#WebModel::$model_path='./modules/';
$options['model']=str_replace('.php', '', $options['model']);
$model_file=$options['model'].'.php';
if(!is_file($model_file))
{
$climate->white()->backgroundRed()->out("Error: cannot find the model file in ".$arr_option[0]."/models/models_".$arr_option[1].".php");
exit(1);
}
WebModel::load_model($options['model']);
//Load classes not defined in WebModel::$model
$arr_classes=get_declared_classes();
foreach($arr_classes as $class)
{
//$parent_class=get_parent_class($class);
$is_son_webmodel=is_subclass_of($class, 'PhangoApp\PhaModels\WebModel');
//echo $class."\n";
//if($parent_class==='PhangoApp\PhaModels\WebModel' && !isset(WebModel::$model_type[$parent_class]))
if($is_son_webmodel)
{
if(!isset(WebModel::$model[strtolower($class)]))
{
WebModel::$model[strtolower($class)]=new $class();
}
}
}
try {
if(count(WebModel::$model)>0)
{
$first_item=current(WebModel::$model);
$first_item->connect_to_db();
}
else
{
$climate->white()->backgroundRed()->out('Error: file don\'t have models');
exit(1);
}
} catch(Exception $e)
{
$climate->white()->backgroundRed()->out($e->getMessage());
exit(1);
}
//print_r(get_declared_classes());
update_table();
$post_install_script=WebModel::$model_path.$arr_option[0].'/install/post_install.php';
$post_install_lock=WebModel::$model_path.$arr_option[0].'/install/lock';
if(file_exists($post_install_script) && !file_exists($post_install_lock))
{
//echo "Executing post_install script...\n";
$climate->white()->backgroundBlack()->out('Executing post_install script...');
include($post_install_script);
if(post_install())
{
if(!file_put_contents($post_install_lock, 'installed'))
{
//echo "Done, but cannot create this file: ".$arr_option[0].'/install/lock'.". Check your permissions and create the file if the script executed satisfally \n";
$climate->white()->backgroundBlack()->out("Done, but cannot create this file: ".$arr_option[0].'/install/lock'.". Check your permissions and create the file if the script executed satisfally");
}
else
{
//echo "Done\n";
$climate->white()->backgroundBlack()->out('Done');
}
}
else
{
//echo "Error, please, check ${post_install_script} file and execute padmin.php again\n";
$climate->white()->backgroundRed()->out("Error, please, check {$post_install_script} file and execute padmin.php again");
}
}
//echo "All things done\n";
$climate->white()->backgroundBlack()->out("All things done");
}
/**
* This Function is used for padmin.php for create new tables and fields based in WebModel class.
*
* @param WebModel $model The model used for create or update a sql table.
*/
function update_table()
{
//include(__DIR__.'/../src/Databases/'.WebModel::$type_db.'.php');
WebModel::$arr_sql_index=array();
WebModel::$arr_sql_set_index=array();
WebModel::$arr_sql_unique=array();
WebModel::$arr_sql_set_unique=array();
WebModel::$arr_sql_fulltext=array();
WebModel::$arr_sql_set_fulltext=array();
$arr_etable=array();
$query=SQLClass::webtsys_query("show tables");
while(list($table)=SQLClass::webtsys_fetch_row($query))
{
$arr_etable[$table]=1;
}
foreach(WebModel::$model as $key => $thing)
{
$arr_table=array();
$allfields=array();
$fields=array();
$types=array();
$defaults=array();
$field="";
$type="";
$null="";
$key_db="";
$default="";
$extra="";
$key_field_old=WebModel::$model[$key]->idmodel;
if(!isset($arr_etable[$key]))
{
//If table not exists make this
echo "Creating table $key\n";
WebModel::$model[$key]->create_table();
}
else
if(isset(WebModel::$model[$key]))
{
//Obtain all fields of model
foreach(WebModel::$model[$key]->components as $kfield => $value)
{
$allfields[$kfield]=1;
}
//unset($allfields['Id'.ucfirst($key)]);
$arr_null['NO']='NOT NULL';
$arr_null['YES']='NULL';
unset($allfields[WebModel::$model[$key]->idmodel]);
$query=SQLClass::webtsys_query("describe `".$key."`");
list($key_field_old, $type, $null, $key_db, $default, $extra)=SQLClass::webtsys_fetch_row($query);
while(list($field, $type, $null, $key_db, $default, $extra)=SQLClass::webtsys_fetch_row($query))
{
$fields[]=$field;
$types[$field]=$type;
$keys[$field]=$key_db;
$defaults[$field]=$default;
$null_set[$field]=$arr_null[$null];
}
foreach($fields as $field)
{
if(isset($allfields[$field]))
{
$type=strtoupper($types[$field]);
unset($allfields[$field]);
//Delete default
$type_sql=preg_replace('/^(.*) DEFAULT.*$/', '$1', WebModel::$model[$key]->components[$field]->get_type_sql());
if($type_sql!=($type.' '.$null_set[$field]))
{
//echo $type_sql.'='.($type.' '.$null_set[$field])."\n";
$query=SQLClass::webtsys_query('alter table `'.$key.'` modify `'.$field.'` '.WebModel::$model[$key]->components[$field]->get_type_sql());
echo "Upgrading ".$field." from ".$key."...\n";
}
//Check if indexed
if(WebModel::$model[$key]->components[$field]->indexed==true && $keys[$field]=='')
{
WebModel::$arr_sql_index[$key][$field]='CREATE INDEX `index_'.$key.'_'.$field.'` ON `'.$key.'`(`'.$field.'`);';
WebModel::$arr_sql_set_index[$key][$field]='';
}
//Check if fulltext for mysql
if(WebModel::$model[$key]->components[$field]->fulltext==true && $keys[$field]=='')
{
WebModel::$arr_sql_fulltext[$key][$field]=' ALTER TABLE `'.$key.'` ADD FULLTEXT (`'.$field.'`)';
WebModel::$arr_sql_set_fulltext[$key][$field]='';
}
//Check if unique
if(WebModel::$model[$key]->components[$field]->unique==true && $keys[$field]=='')
{
WebModel::$arr_sql_unique[$key][$field]=' ALTER TABLE `'.$key.'` ADD UNIQUE (`'.$field.'`)';
WebModel::$arr_sql_set_unique[$key][$field]='';
}
//Set index
if(isset(WebModel::$model[$key]->components[$field]->related_model) && $keys[$field]=='')
{
WebModel::$arr_sql_index[$key][$field]='CREATE INDEX `index_'.$key.'_'.$field.'` ON `'.$key.'`(`'.$field.'`);';
$table_related=WebModel::$model[$key]->components[$field]->related_model->name;
$id_table_related=WebModel::load_id_model_related(WebModel::$model[$key]->components[$field], WebModel::$model);
WebModel::$arr_sql_set_index[$key][$field]='ALTER TABLE `'.$key.'` ADD CONSTRAINT `'.$field.'_'.$key.'IDX` FOREIGN KEY ( `'.$field.'` ) REFERENCES `'.$table_related.'` (`'.$id_table_related.'`) ON DELETE CASCADE ON UPDATE CASCADE;';
}
if(!isset(WebModel::$model[$key]->components[$field]->related_model) && $keys[$field]!='' && WebModel::$model[$key]->components[$field]->indexed==false && WebModel::$model[$key]->components[$field]->unique!=true && WebModel::$model[$key]->components[$field]->fulltext!=true)
{
echo "---Delete index for ".$field." from ".$key."\n";
$query=SQLClass::webtsys_query('DROP INDEX `index_'.$key.'_'.$field.'` ON '.$key);
}
}
else
{
$allfields[$field]=0;
}
}
}
//Check if new id...
if($key_field_old!=WebModel::$model[$key]->idmodel)
{
$query=SQLClass::webtsys_query('alter table `'.$key.'` change `'.$key_field_old.'` `'.WebModel::$model[$key]->idmodel.'` INT NOT NULL AUTO_INCREMENT');
echo "Renaming id for this model to ".WebModel::$model[$key]->idmodel."...\n";
}
//Check if new fields...
foreach($allfields as $new_field => $new)
{
if($allfields[$new_field]==1)
{
$query=SQLClass::webtsys_query('alter table `'.$key.'` add `'.$new_field.'` '.WebModel::$model[$key]->components[$new_field]->get_type_sql());
echo "Adding ".$new_field." to ".$key."...\n";
//Check if indexed
if(WebModel::$model[$key]->components[$new_field]->indexed==true)
{
WebModel::$arr_sql_index[$key][$new_field]='CREATE INDEX `index_'.$key.'_'.$new_field.'` ON `'.$key.'`(`'.$new_field.'`);';
WebModel::$arr_sql_set_index[$key][$new_field]='';
}
if(isset(WebModel::$model[$key]->components[$new_field]->related_model) )
{
/*echo "---Creating index for ".$new_field." from ".$key."\n";
$query=SQLClass::webtsys_query('CREATE INDEX index_'.$key.'_'.$new_field.' ON '.$key.'('.$new_field.')');*/
WebModel::$arr_sql_index[$key][$new_field]='CREATE INDEX `index_'.$key.'_'.$new_field.'` ON `'.$key.'`(`'.$new_field.'`);';
$table_related=WebModel::$model[$key]->components[$new_field]->related_model->name;
$id_table_related=WebModel::load_id_model_related(WebModel::$model[$key]->components[$new_field], WebModel::$model);
WebModel::$arr_sql_set_index[$key][$new_field]='ALTER TABLE `'.$key.'` ADD CONSTRAINT `'.$new_field.'_'.$key.'IDX` FOREIGN KEY ( `'.$new_field.'` ) REFERENCES `'.$table_related.'` (`'.$id_table_related.'`) ON DELETE CASCADE ON UPDATE CASCADE;';
}
}
else
{
//Bug, need fixed.
if($keys[$new_field]!='')
{
$query=SQLClass::webtsys_query('ALTER TABLE `'.$key.'` DROP FOREIGN KEY '.$new_field.'_'.$key.'IDX');
}
//}
$query=SQLClass::webtsys_query('alter table `'.$key.'` drop `'.$new_field.'`');
echo "Deleting ".$new_field." from ".$key."...\n";
}
}
$arr_etable[$key]=0;
}
//Create Indexes...
foreach(WebModel::$arr_sql_index as $model_name => $arr_index)
{
foreach(WebModel::$arr_sql_index[$model_name] as $key_data => $sql_index)
{
echo "---Creating index for ".$key_data." on model ".$model_name."\n";
$query=SQLClass::webtsys_query($sql_index);
if(WebModel::$arr_sql_set_index[$model_name][$key_data]!='')
{
$query=SQLClass::webtsys_query(WebModel::$arr_sql_set_index[$model_name][$key_data]);
}
}
}
//Create Uniques...
foreach(WebModel::$arr_sql_unique as $model_name => $arr_index)
{
foreach(WebModel::$arr_sql_unique[$model_name] as $key_data => $sql_index)
{
echo "---Creating unique for ".$key_data." on model ".$model_name."\n";
$query=SQLClass::webtsys_query($sql_index);
if(WebModel::$arr_sql_set_unique[$model_name][$key_data]!='')
{
$query=SQLClass::webtsys_query(WebModel::$arr_sql_set_unique[$model_name][$key_data]);
}
}
}
//Create Fulltext index...
foreach(WebModel::$arr_sql_fulltext as $model_name => $arr_index)
{
foreach(WebModel::$arr_sql_fulltext[$model_name] as $key_data => $sql_index)
{
echo "---Creating fulltext for ".$key_data." on model ".$model_name."\n";
$query=SQLClass::webtsys_query($sql_index);
if(WebModel::$arr_sql_set_fulltext[$model_name][$key_data]!='')
{
$query=SQLClass::webtsys_query(WebModel::$arr_sql_set_fulltext[$model_name][$key_data]);
}
}
}
}
function load_id_model_related($foreignkeyfield)
{
//global $model;
$table_related=$foreignkeyfield->related_model->name;
$id_table_related='';
if(!isset(WebModel::$model[ $table_related ]->idmodel))
{
//$id_table_related='Id'.ucfirst(PhangoVar::WebModel::$model[$key]->components[$new_field]->related_model);
//Need load the model
if(isset($foreignkeyfield->params_loading_mod['module']) && isset($foreignkeyfield->params_loading_mod['model']))
{
$model=load_model($foreignkeyfield->params_loading_mod);
//obtain id
$id_table_related=WebModel::$model[ $foreignkeyfield->params_loading_mod['model'] ]->idmodel;
}
}
else
{
$id_table_related=WebModel::$model[ $table_related ]->idmodel;
}
if($id_table_related=='')
{
//Set standard...
$id_table_related='Id'.ucfirst($table_related);
}
return $id_table_related;
}
?>