Пример #1
0
 public static function run()
 {
     while (true) {
         echo CliUtil::delimiter();
         echo "Choose PHPModel function:\n";
         echo "\t" . self::FUNCTION_EXECUTE_SQL . ": execute new SQL queries from registry\n";
         echo "\t" . self::FUNCTION_CREATE_MODEL . ": create model\n";
         echo "\t" . self::FUNCTION_ADD_MODEL_FIELD . ": add field to existing model\n";
         echo "\t" . self::FUNCTION_MODEL_FIELD_EXTRAS . ": extra operations on model field\n";
         echo "\tENTER: exit\n";
         $command_str = CliUtil::readStdinAnswer();
         switch ($command_str) {
             case self::FUNCTION_EXECUTE_SQL:
                 CLIExecuteSql::executeSqlScreen();
                 break;
             case self::FUNCTION_CREATE_MODEL:
                 CLICreateModel::enterClassNameScreen();
                 break;
             case self::FUNCTION_ADD_MODEL_FIELD:
                 $cli_add_field_obj = new CLIAddFieldToModel();
                 $cli_add_field_obj->addField();
                 break;
             case self::FUNCTION_MODEL_FIELD_EXTRAS:
                 $cli_add_field_obj = new CLIAddFieldToModel();
                 $cli_add_field_obj->extraFieldFunctionsScreen();
                 break;
             default:
                 exit;
         }
     }
 }
Пример #2
0
 public static function selectFileName($folder, $only_files = true)
 {
     while (true) {
         $dirty_arr = scandir($folder);
         // убираем все элементы, которые начинаются с .
         $arr = [];
         $index = 1;
         foreach ($dirty_arr as $dir_item) {
             if (!preg_match('@^\\.@', $dir_item)) {
                 $arr[$index] = $dir_item;
                 $index++;
             }
         }
         echo "\n" . $folder . ":\n";
         foreach ($arr as $index => $item) {
             echo "\t" . str_pad($index, 8, '.') . $item . "\n";
         }
         echo "\nEnter file or directory index:\n";
         $index = CliUtil::readStdinAnswer();
         if (!array_key_exists($index, $arr)) {
             echo "Index not found\n";
             continue;
         }
         $selected_path = $folder . DIRECTORY_SEPARATOR . $arr[$index];
         if (is_dir($selected_path)) {
             if ($only_files) {
                 $folder = $selected_path;
                 continue;
             }
             echo CliUtil::delimiter();
             echo "Selected directory: " . $selected_path . "\n";
             echo "Use it or enter directory?\n\t1 use directory\n\tENTER enter directory\n";
             // TODO: constants
             $answer = CliUtil::readStdinAnswer();
             switch ($answer) {
                 case 1:
                     // TODO: use constant
                     return $selected_path;
                 case '':
                     $folder = $selected_path;
                     break;
                 default:
                     throw new \Exception('Unknown answer');
             }
             continue;
         }
         return $selected_path;
     }
 }
Пример #3
0
 public static function generateClass()
 {
     //
     $cwd = getcwd();
     // TODO: model_namespace_for_path may have leading '/' - remove it?
     $model_filename = $cwd . DIRECTORY_SEPARATOR . self::$model_namespace_for_path . DIRECTORY_SEPARATOR . self::$model_class_name . '.php';
     $model_tablename = mb_strtolower(self::$model_namespace_for_class . "\\" . self::$model_class_name);
     $model_tablename = preg_replace('@\\W@', '_', $model_tablename);
     //
     // creating model class file
     //
     $class_file = self::getClassTemplate();
     // TODO: use common variable replacemnt method
     $class_file = str_replace('TEMPLATECLASS_CLASSNAME', self::$model_class_name, $class_file);
     $class_file = str_replace('TEMPLATECLASS_NAMESPACE', self::$model_namespace_for_class, $class_file);
     $class_file = str_replace('TEMPLATECLASS_TABLENAME', $model_tablename, $class_file);
     $class_file = str_replace('TEMPLATECLASS_DBID', self::$model_db_id, $class_file);
     self::file_force_contents($model_filename, $class_file);
     echo "\nModel file created: " . $model_filename . "\n";
     //
     // altering database sql file
     //
     $class_sql = self::getClassSQL();
     // TODO: use common variable replacemnt method
     $class_sql = str_replace('TEMPLATECLASS_TABLENAME', $model_tablename, $class_sql);
     CLIExecuteSql::addSqlToRegistry(self::$model_db_id, $class_sql);
     echo "\nSQL registry updated\n";
     echo "\nType ENTER to execute SQL queries, Ctrl+C to exit.\n";
     $command_str = CliUtil::readStdinAnswer();
     if ($command_str == '') {
         CLIExecuteSql::executeSqlScreen();
     }
     return;
 }
Пример #4
0
 public static function process_db($db_id)
 {
     // checking DB connectivity
     $db_obj = null;
     try {
         $db_obj = \OLOG\DB\DBFactory::getDB($db_id);
     } catch (\Exception $e) {
         echo $e->getMessage() . "\n\n";
     }
     if (!$db_obj) {
         echo CliUtil::delimiter();
         echo "Can't connect to database " . $db_id . "\n";
         echo "Probable problems:\n";
         echo "- misconfiguration. App config for database:\n";
         //echo var_export(DBFactory::getConfigArr($db_id)) . "\n"; // TODO: fix
         echo "- database server not accessible\n";
         echo "- database not created. It must be created manually.\n";
         exit;
     }
     $executed_queries_sql_arr = [];
     try {
         $executed_queries_sql_arr = \OLOG\DB\DBWrapper::readColumn($db_id, 'select sql_query from ' . self::EXECUTED_QUERIES_TABLE_NAME);
     } catch (\Exception $e) {
         echo CliUtil::delimiter();
         echo "Can not load the executed queries list from " . self::EXECUTED_QUERIES_TABLE_NAME . " table:\n";
         echo $e->getMessage() . "\n\n";
         echo "Probably the " . self::EXECUTED_QUERIES_TABLE_NAME . " table was not created. Choose:\n";
         echo "\tENTER to create table and proceed\n";
         // TODO: constants
         echo "\tany other key to exit\n";
         $command_str = CliUtil::readStdinAnswer();
         // TODO: switch
         if ($command_str == '') {
             // TODO: constants
             \OLOG\DB\DBWrapper::query($db_id, 'create table ' . self::EXECUTED_QUERIES_TABLE_NAME . ' (id int not null auto_increment primary key, created_at_ts int not null, sql_query text) engine InnoDB default charset utf8');
         } else {
             exit;
         }
     }
     $sql_arr = self::loadSqlArrForDB($db_id);
     foreach ($sql_arr as $sql) {
         if (!in_array($sql, $executed_queries_sql_arr)) {
             echo CliUtil::delimiter();
             echo $sql . "\n";
             // TODO: constants
             echo "\n";
             echo "\t" . self::COMMAND_SKIP_QUERY . ": skip query now, do not mark as executed\n";
             echo "\t" . self::COMMAND_IGNORE_QUERY . ": ignore query - mark as executed, but do not execute (you can execute one manually)\n";
             echo "\tENTER execute query\n";
             $command_str = CliUtil::readStdinAnswer();
             switch ($command_str) {
                 case '':
                     \OLOG\DB\DBWrapper::query($db_id, $sql);
                     \OLOG\DB\DBWrapper::query($db_id, 'insert into ' . self::EXECUTED_QUERIES_TABLE_NAME . ' (created_at_ts, sql_query) values (?, ?)', array(time(), $sql));
                     echo "Query executed.\n";
                     break;
                 case self::COMMAND_IGNORE_QUERY:
                     \OLOG\DB\DBWrapper::query($db_id, 'insert into ' . self::EXECUTED_QUERIES_TABLE_NAME . ' (created_at_ts, sql_query) values (?, ?)', array(time(), $sql));
                     echo "Query marked as executed without execution.\n";
                     break;
                 case self::COMMAND_SKIP_QUERY:
                     echo "Query skipped.\n";
                     break;
                 default:
                     //echo "Unknown command.\n";
                     throw new \Exception('unknown command');
                     break;
                     // TODO: repeat entry?
             }
         }
     }
 }
Пример #5
0
 public function addField()
 {
     echo CliUtil::delimiter();
     echo "Choose model class file:\n";
     $this->model_file_path = CLIFileSelector::selectFileName(getcwd());
     echo "\nClass file: " . $this->model_file_path . "\n";
     $class_file_obj = new PHPClassFile($this->model_file_path);
     echo 'Class to be updated: ' . $class_file_obj->class_namespace . "\\" . $class_file_obj->class_name . "\n";
     $this->field_name = $this->askFieldName($class_file_obj);
     /** @var FieldDataType $field_data_type */
     $field_data_type = $this->askDataType();
     $default_value = $this->askDefaultValue($field_data_type);
     //
     //
     //
     $class_field_default_value_str = '';
     $sql_default_value_str = '';
     if ($default_value != '') {
         $class_field_default_value_str = ' = ' . $default_value;
         $sql_default_value_str = ' default ' . $default_value;
     }
     $field_string_for_class = '    const ' . self::constantNameForFieldName($this->field_name) . ' = \'' . $this->field_name . '\';' . "\n";
     $field_string_for_class .= '    protected $' . $this->field_name . $class_field_default_value_str . ';' . "\n";
     $class_file_obj->insertAboveIdField($field_string_for_class);
     $getters_setters_template = self::gettersSettersTemplate();
     $getters_setters_template = self::replaceFieldNamePlaceholders($getters_setters_template, $this->field_name);
     $class_file_obj->insertBelowIdField($getters_setters_template);
     $class_file_obj->save();
     echo "\nModel class file updated\n";
     //
     //
     //
     $sql_field_is_nullable_str = '';
     if ($field_data_type->can_be_null) {
         echo CliUtil::delimiter();
         echo "Choose whether database field is nullable:\n\tn: null\n\tENTER: not null\n";
         // TODO: use constants
         $is_nullable_reply = trim(fgets(STDIN));
         switch ($is_nullable_reply) {
             case 'n':
                 // TODO: use constant
                 $sql_field_is_nullable_str = '';
                 break;
             case '':
                 // TODO: use constant
                 $sql_field_is_nullable_str = ' not null ';
                 break;
             default:
                 throw new \Exception('Unsupported answer');
         }
     }
     //
     // adding sql
     //
     $model_db_id = $this->getDbIdFromClassFile();
     $model_table_name = $this->getTableNameFromClassFile();
     $this->db_table_field_name = $this->field_name;
     $sql = 'alter table ' . $model_table_name . ' add column ' . $this->db_table_field_name . ' ' . $field_data_type->sql_type_name . ' ' . $sql_field_is_nullable_str . ' ' . $sql_default_value_str . '  /* rand' . rand(0, 999999) . ' */;';
     CLIExecuteSql::addSqlToRegistry($model_db_id, $sql);
     echo "\nSQL registry updated\n";
     echo CliUtil::delimiter();
     echo "Press ENTER to execure SQL queries, enter n to skip:\n";
     $command_str = CliUtil::readStdinAnswer();
     if ($command_str == '') {
         CLIExecuteSql::executeSqlScreen();
     }
     $this->extraFieldFunctionsScreen();
 }