/** * Процесс выполняет периодические задачи cron * * @param array $argv */ function executeProcess(array $argv) { $SYNC_DIR = 'd:/Zona Downloads/Архив пранкоты/'; $lists = DirManager::inst(__DIR__)->getDirContent('m3u', PsConst::EXT_M3U); $filesCopied = DirItem::inst(__DIR__, 'all_copied', 'list')->remove()->touch(); $filesSkipped = DirItem::inst(__DIR__, 'all_skipped', 'list')->remove()->touch(); $destDir = DirManager::inst(__DIR__, 'dest')->clearDir()->makePath(); /* @var $list DirItem */ foreach ($lists as $name => $list) { $name = mb_convert_encoding($name, 'UTF-8', 'cp1251'); dolog("+ {$name}"); foreach ($list->getFileLines() as $newFile) { $newFile = mb_convert_encoding($newFile, 'UTF-8', 'UTF-8'); if (starts_with($newFile, '#')) { dolog(" - {$newFile}"); continue; //--- } $absPath = next_level_dir($SYNC_DIR, $newFile); $absPath = iconv('UTF-8', 'cp1251', $absPath); $isFile = is_file($absPath); dolog(" + {$newFile} ? {}", var_export($isFile, true)); if (!$isFile) { $filesSkipped->writeLineToFile($absPath); continue; //--- } $fileName = iconv('UTF-8', 'cp1251', basename($newFile)); copy($absPath, $destDir->absFilePath(null, $fileName)); $filesCopied->writeLineToFile($absPath); } //print_r($list->getFileLines()); } }
public function testDolog() { global $_log_fh; $tmpfile = tempnam('/tmp', 'LTS'); if (file_exists($tmpfile)) { unlink($tmpfile); } $config = null; if (is_object(Config::$inst)) { $config = clone Config::$inst; } Config::set('log', 'file', $tmpfile); Config::set('log', 'level', LOG_INFO); Config::set('log', 'date_format', 'mdY'); Config::set('log', 'format', '[%s] %s - %s'); dolog('test info', LOG_INFO); _closelog(); $log = file_get_contents($tmpfile); $this->assertEquals(18, strpos($log, 'test info')); unlink($tmpfile); //restore original config if (is_object($config)) { Config::$inst = $config; } $_log_fh = false; }
function doTest() { global $HOST; global $TOTAL; global $HREFS; global $REQUESTS_CNT; $RESULTS = array(); $j = 0; foreach ($HREFS as $href => $name) { ++$j; $href = ensure_starts_with($href, '/'); $path = "http://{$HOST}{$href}"; $sec = Secundomer::inst(); for ($index = 0; $index <= $REQUESTS_CNT; $index++) { if ($index == 0) { //Пропустим первый вызов, на случай кеширования file_get_contents($path); continue; } $sec->start(); file_get_contents($path); $sec->stop(); ++$TOTAL; } dolog(pad_zero_left($j, 2) . '/' . count($HREFS) . " [{$path}] - " . $sec->getAverage() . ' (' . $sec->getTotalTime() . '/' . $sec->getCount() . ')'); $RESULTS[$path] = str_replace('.', ',', round($sec->getAverage(), 2)); } asort($RESULTS, SORT_DESC); $RESULTS = array_reverse($RESULTS, true); return $RESULTS; }
/** * OpenLSS - Lighter Smarter Simpler * * This file is part of OpenLSS. * * OpenLSS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * OpenLSS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the * GNU Lesser General Public License along with OpenLSS. * If not, see <http://www.gnu.org/licenses/>. */ function run($cmd, &$return = null) { $output = ''; $cmd = '/usr/bin/sudo /bin/bash -c "' . addslashes($cmd) . '"'; exec($cmd, $output, $return); $output = implode("\n", $output); dolog($cmd . ': ' . $output); return $output; }
function updateServer($auth_area, &$return) { $cmd = 'sudo /usr/local/rwhoisd/bin/rwhois_indexer -v -A ' . $auth_area . ' -C network -s txt -c /usr/local/rwhoisd/etc/rwhoisd/rwhoisd.conf'; dolog('about to run: ' . $cmd); exec($cmd, $output); $output = implode("\n", $output); dolog('updated server with output: ' . $output); return $output; }
/** * Процесс строит скрипты для вставки ячеек в БД * * @param array $argv */ function executeProcess(array $argv) { $DM = DirManager::inst(array(__DIR__, 'output')); $customNum = $argv[1]; dolog('Processing mosaic demo, custom num={}', $customNum); /* @var $dir DirItem */ foreach ($DM->getDirContent(null, DirItemFilter::DIRS) as $dir) { if (is_inumeric($customNum) && $customNum != $dir->getName()) { continue; //---- } $imgDM = DirManager::inst($dir->getAbsPath()); $imgDI = end($imgDM->getDirContent(null, DirItemFilter::IMAGES)); $map = $imgDM->getDirItem(null, 'map', 'txt')->getFileAsProps(); $demoDM = DirManager::inst($imgDM->absDirPath(), 'demo'); $demoDM->clearDir(); dolog("Building map for: [{}].", $imgDI->getRelPath()); //CELLS BINDING $dim = $imgDM->getDirItem(null, 'settings', 'txt')->getFileAsProps(); $dim = $dim['dim']; $dim = explode('x', $dim); $cw = 1 * $dim[0]; $ch = 1 * $dim[1]; $sourceImg = SimpleImage::inst()->load($imgDI); $w = $sourceImg->getWidth(); $h = $sourceImg->getHeight(); $destImg = SimpleImage::inst()->create($w, $h, MosaicImage::BG_COLOR); dolog("Img size: [{$w} x {$h}]."); check_condition($w > 0 && !($w % $cw), 'Bad width'); check_condition($h > 0 && !($h % $ch), 'Bad height'); $totalCells = count($map); $lengtn = strlen("{$totalCells}"); //dolog("Cells cnt: [$xcells x $ycells], total: $totalCells."); //СТРОИМ КАРТИНКИ $secundomer = Secundomer::startedInst(); //$encoder = new PsGifEncoder(); for ($cellCnt = 0; $cellCnt <= $totalCells; $cellCnt++) { $name = pad_zero_left($cellCnt, $lengtn); $copyTo = $demoDM->absFilePath(null, $name, 'jpg'); if ($cellCnt > 0) { $cellParams = $map[$cellCnt]; $cellParams = explode('x', $cellParams); $xCell = $cellParams[0]; $yCell = $cellParams[1]; $x = ($xCell - 1) * $cw; $y = ($yCell - 1) * $ch; $destImg->copyFromAnother($sourceImg, $x, $y, $x, $y, $cw, $ch); } $destImg->save($copyTo); dolog("[{$totalCells}] {$copyTo}"); } //$encoder->saveToFile($demoDM->absFilePath(null, 'animation')); $secundomer->stop(); dolog('Execution time: ' . $secundomer->getTotalTime()); } }
function print_stack(Exception $exception) { dolog(''); dolog("ERROR occured: " . $exception->getMessage()); foreach ($exception->getTrace() as $num => $stackItem) { $str = $num . '# ' . (array_key_exists('file', $stackItem) ? $stackItem['file'] : '') . ' (' . (array_key_exists('line', $stackItem) ? $stackItem['line'] : '') . ')'; dolog(pad_left('', $num, ' ') . $str); } die(1); }
function executeProcess(array $argv) { dolog('try to get lock'); $taken = PsLock::lock('mylock-wait', true); dolog('lock ' . ($taken ? 'taken' : 'not taken')); if ($taken) { sleep(10); PsLock::unlock(); dolog('lock released'); } }
function __exception_handler($e) { if (php_sapi_name() != 'cli') { echo '<h1>Error</h1><p>' . $e->getMessage() . '</p><pre>' . $e . '</pre>'; exit($e->getCode()); } try { if (is_callable('dolog')) { dolog($e->getMessage() . "\n" . $e, LOG_ERROR); exit($e); } } catch (Exception $le) { echo $le; } exit($e); }
function executeProcess(array $argv) { $rebuses = DirItem::inst(__DIR__, 'rebuses.txt')->getTextFileAdapter(); $MR = PsMathRebus::inst(); $result = array(); foreach ($rebuses->getLines() as $rebus) { if (starts_with($rebus, '#')) { continue; //--- } $rebus = $MR->normalize($rebus); switch ($MR->rebusState($rebus)) { case PsMathRebus::STATE_HAS_ANSWERS: dolog("Take rebus answers: {$rebus}"); $result[$rebus] = $MR->rebusAnswers($rebus); break; case PsMathRebus::STATE_NO_ANSWERS: dolog("Skipping rebus: {$rebus}"); $result[$rebus] = array(); break; case PsMathRebus::STATE_NOT_REGISTERED: dolog("Processing rebus: {$rebus}"); $result[$rebus] = PsMathRebusSolver::solve($rebus); break; } } $ansDI = DirItem::inst(__DIR__, 'answers.txt'); $ansDI->remove(); foreach ($result as $rebus => $answers) { $ansDI->writeLineToFile($rebus); foreach ($answers as $answer) { $ansDI->writeLineToFile($answer); } $ansDI->writeLineToFile(); } /* * Если передан параметр копирования, то скопируем файл после обработки */ if (1 == array_get_value(1, $argv, 0)) { dolog('Copy from [{}] to [{}]', $ansDI->getRelPath(), $MR->getAnswersDI()->getRelPath()); $ansDI->copyTo($MR->getAnswersDI()->getAbsPath()); } }
function executeProcess(array $argv) { PsConnectionPool::assertDisconnectied(); /* * СОЗДАЁМ SQL * * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД. * Все данные из "редактируемых" таблиц также загружаются из этой БД. */ $DB = DirManager::inst(__DIR__ . '/temp'); $SDK = DirManager::inst(__DIR__ . '/temp/sdk'); //Почистим файлы для удаления dolog('Clearing not .sql/.txt from temp dir'); /* @var $item DirItem */ foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) { if (!$item->checkExtension(array(PsConst::EXT_TXT, PsConst::EXT_SQL))) { dolog('[-] {}', $item->remove()->getRelPath()); } } dolog(); /* * SDK */ //dolog('Processing objects.sql'); /* @var $DIR DirManager */ foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) { dolog(); dolog('***************************************************************'); dolog('>>> Processing scope [{}], dir: [{}]', $scope, $DM->absDirPath()); $SCHEMA = $DM->getDirItem(null, 'schema.sql'); if (!$SCHEMA->isFile()) { dolog('schema.sql is not exists, skipping'); continue; //--- } $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects'); /* * Очищаем папку, в которой будет содержимое для автосгенерированных файлов */ $DM_AUTO = DirManager::inst($DM_SYSOBJECTS->absDirPath(), 'auto')->clearDir(); /* * Создадим ссылку на файл с данными, выгруженными из таблиц */ $DI_AUTO_DATA = $DM_AUTO->getDirItem(null, 'data.sql'); /* * Сначала сделаем триггеры на таблицы, от которых зависит кеш и к которым привязаны фолдинги. */ LOGBOX_INIT(); LOGBOX('Making cache and folding table triggers'); $DM_AUTO_TRIGGERS = $DM_AUTO->getDirItem('triggers')->makePath(); $DI_AUTO_TRIGGERS_SQL = $DM_AUTO->getDirItem(null, 'triggers', 'sql')->getSqlFileBuilder(); $triggerPattern = $SDK->getDirItem('sysobjects/patterns', 'ta_iud_pattern.sql')->getFileContents(); //BUILDIAN AND ADDING TRIGGERS foreach (PsTriggersAware::getTriggeredTables($scope) as $table) { foreach (PsTriggersAware::getActions() as $action) { $actions = PsTriggersAware::getTriggerActions($table, $scope, $action); if (empty($actions)) { continue; //--- } $name = 'ta' . strtolower(first_char($action)) . '_' . $table; $trigger = str_replace('<%NAME%>', $name, $triggerPattern); $trigger = str_replace('<%TABLE%>', $table, $trigger); $trigger = str_replace('<%ACTION%>', $action, $trigger); $trigger = str_replace('<%CALL%>', implode("\n", $actions), $trigger); dolog("+ {$name}"); foreach ($actions as $_action) { dolog($_action); } $DI_AUTO_TRIGGERS_SQL->appendFile($DM_AUTO_TRIGGERS->getDirItem(null, $name, 'sql')->putToFile($trigger)); } } //Все автоматически сгенерированные триггеры положим в отдельный файл $DI_AUTO_TRIGGERS_SQL->save(); $autoTriggers = DirManager::inst($DM_AUTO_TRIGGERS->getAbsPath())->getDirContent(null, PsConst::EXT_SQL); dolog('Triggers made: {}', count($autoTriggers)); /* * objects.sql */ $OBJECTS_SQL = $DM_AUTO->getDirItem(null, 'objects.sql')->getSqlFileBuilder(); /* * Добавляем автосгенерированные триггеры */ LOGBOX('Processing objects.sql'); if (empty($autoTriggers)) { dolog('No auto triggers'); } else { dolog('Adding {} auto triggers', count($autoTriggers)); $OBJECTS_SQL->appendMlComment('AUTO TRIGGERS SECTION'); /* @var $triggerDi DirItem */ foreach ($autoTriggers as $triggerDi) { dolog('+ {}', $triggerDi->getName()); $OBJECTS_SQL->appendFile($triggerDi); } } /* * Получаем строки с включениями */ $ALL = $DM_SYSOBJECTS->getDirItem(null, 'all.txt')->getFileLines(false); if (empty($ALL)) { dolog('No includes'); } else { dolog('Adding {} includes from all.txt', count($ALL)); $OBJECTS_SQL->appendMlComment('INCLUDES SECTION'); foreach ($ALL as $include) { dolog('+ {}', $include); $OBJECTS_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include)); } } $OBJECTS_SQL->save(); /* * Создаём скрипты инициализации для схем */ foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) { if (PsConnectionParams::has($connection, $scope)) { $props = PsConnectionParams::get($connection, $scope); $database = $props->database(); if (empty($database)) { continue; //Не задана БД - пропускаем (для root) } LOGBOX('Making schema script for {}', $props); $SCHEMA_SQL = $DM_AUTO->getDirItem('schemas', $database, 'sql')->makePath()->getSqlFileBuilder(); //DROP+USE $SCHEMA_SQL->clean(); $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};"); $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;"); $SCHEMA_SQL->appendLine("USE {$database};"); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema.sql')); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto', 'objects.sql')); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK'); } //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SCHEMA); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($OBJECTS_SQL->getDi()); //CREATE USER $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';"; $SCHEMA_SQL->appendMlComment('Grants'); $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password())); /* * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini */ if ($connection == PsConnectionParams::CONN_TEST) { dolog('Making physical schema {}', $props); $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT); dolog('Root connection props: {}', $rootProps); $rootProps->execureShell($SCHEMA_SQL->getDi()); dolog('Connecting to [{}]', $props); PsConnectionPool::configure($props); $tables = PsTable::all(); /* * Нам нужно определить новый список таблиц SDK, чтобы по ним * провести валидацию новых db.ini. * * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и * можем положиться на него. Если мы подготавливаем SDK-шный db.ini, * но новый список таблиц возмём из развёрнутой тестовой БД. */ $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : DbIni::getSdkTables(); if ($scope == ENTITY_SCOPE_PROJ) { //Уберём из всех таблиц - SDK`шные array_remove_keys($tables, $sdkTableNames); } $scopeTableNames = array_keys($tables); sort($scopeTableNames); /* * Составим список таблиц. * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились. */ $tablesDi = $DM_AUTO->getDirItem(null, 'tables.txt')->putToFile(implode("\n", $scopeTableNames)); dolog('Tables: {} saved to {}', print_r($scopeTableNames, true), $tablesDi->getAbsPath()); /* * Загружаем полный список таблиц схемы и на основе имеющихся db.ini файлов строим новые, добавляя/удаляя * таблицы, добавленные/удалённые из схемы. */ $dbIniProps = PsDbIniHelper::makeDbIniForSchema($scope, $tables); dolog('db.ini props: {}', print_r($dbIniProps, true)); $dbIniErrors = PsDbIniHelper::validateAndSaveDbIniTableProps($scope, $dbIniProps, $sdkTableNames); if ($dbIniErrors) { PsUtil::raise('db.ini errors for {}: {}', $scope, print_r($dbIniErrors, true)); } /* * Для проекта выгружаем данные, хранящиеся в файлах */ if ($scope == ENTITY_SCOPE_PROJ) { dolog('Exporting tables data from files'); $DM_AUTO->getDirItem('data')->makePath(); $AUTO_DATA_SQL = $DI_AUTO_DATA->touch()->getSqlFileBuilder(); //Пробегаемся по таблицам foreach (DbIni::getTables() as $tableName) { $table = PsTable::inst($tableName); if ($table->isFilesync()) { $fileData = $table->exportFileAsInsertsSql(); if ($fileData) { dolog(' + {}', $tableName); $AUTO_DATA_SQL->appendFile($DM_AUTO->getDirItem('data', $tableName, 'sql')->putToFile($fileData)); } else { dolog(' - {}', $tableName); } } } $AUTO_DATA_SQL->save(); /* * Вставим данные в тестовую схему */ dolog('Inserting data to test schema.'); $props->execureShell($DI_AUTO_DATA); } /* * Теперь ещё создадим тестовые объекты. * Мы уверены, что для SDK тестовая часть есть всегда. */ $TEST_SCHEMA_SQL = $DM_AUTO->getDirItem('test', 'schema', 'sql')->makePath()->getSqlFileBuilder(); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK TEST PART'); //Добавим секцию в лог $TEST_SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $TEST_SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto/test', 'schema.sql')); //Добавим секцию в лог $TEST_SCHEMA_SQL->appendMlComment('<<< SDK'); } $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema.sql'), false); $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data.sql'), false); $TEST_SCHEMA_SQL->save(); /* * На тестовой схеме прогоняем скрипты с тестовыми данными */ dolog('Making test schema objects.'); $props->execureShell($TEST_SCHEMA_SQL->getDi()); } #end conn== TEST /* * Если были сгенерированы данные из файлов - добавляем их */ if ($DI_AUTO_DATA->isFile() && $DI_AUTO_DATA->getSize() > 0) { dolog('Append data inserts to {}', $SCHEMA_SQL->getDi()->getName()); $SCHEMA_SQL->appendFile($DI_AUTO_DATA); } //SAVE .sql $SCHEMA_SQL->save(); } } } dolog('Database schemas successfully exported'); }
<?php require_once '../ToolsResources.php'; $CALLED_FILE = __FILE__; dolog(__FILE__ . ' called in ' . time()); file_append_contents(file_path(__DIR__, 'called.log'), time() . "\n");
/** * Процесс строит скрипты разворачивания БД * * @param array $argv */ function executeProcess(array $argv) { /* * СОЗДАЁМ SQL * * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД. */ $DB = DirManager::inst(__DIR__ . '/temp'); $SDK = DirManager::inst(__DIR__ . '/temp/ps-sdk'); //Почистим файлы, которые нам не интересны $cleanExt = array(PsConst::EXT_TXT, PsConst::EXT_SQL); dolog('Clearing not {} files from temp dir', array_to_string($cleanExt)); /* @var $item DirItem */ foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) { if (!$item->checkExtension($cleanExt)) { dolog('[-] {}', $item->remove()->getRelPath()); } } //Пробежимся по скоупам и выполним обработку /* @var $DIR DirManager */ foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) { dolog(); dolog('***************************** SCOPE [{}] *****************************', $scope); dolog('Working directory: [{}]', $DM->absDirPath()); $SCHEMA = $DM->getDirItem(null, 'schema', PsConst::EXT_SQL); if (!$SCHEMA->isFile()) { dolog('schema.sql is not exists, skipping'); continue; //--- } //Директория с системными объектами $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects'); //Директория, в которой будет содержимое для автосгенерированных файлов $DM_BUILD = DirManager::inst($DM->absDirPath(), 'build')->clearDir(); //Создадим ссылку на файл с объектами $DM_BUILD_ALL_SQL = $DM_BUILD->getDirItem(null, 'all', PsConst::EXT_SQL)->getSqlFileBuilder(); //Строим objects.sql dolog('Processing all.sql'); /* * Получаем строки с включениями в objects.sql */ $ALL_LINES = $DM_SYSOBJECTS->getDirItem(null, 'all', PsConst::EXT_TXT)->getFileLines(false); if (empty($ALL_LINES)) { dolog('No includes'); } else { dolog('Adding {} includes from all.txt', count($ALL_LINES)); foreach ($ALL_LINES as $include) { dolog('+ {}', $include); $DM_BUILD_ALL_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include)); } } // << Сохраняем objects.sql $DM_BUILD_ALL_SQL->save(); /* * Создаём скрипты инициализации для схем */ dolog('Processing default connection names: {}', array_to_string(array_values(PsConnectionParams::getDefaultConnectionNames()))); foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) { //На момент обработки скоупа мы не должны быть подключены никуда PsConnectionPool::assertDisconnectied(); //Для данного скоупа не задан коннект? Пропускаем... if (PsConnectionParams::CONN_ROOT == $connection) { dolog('Skip {}', $connection); continue; //--- } if (!PsConnectionParams::has($connection, $scope)) { dolog('No connection properties for {}', $connection); continue; //--- } //Поработаем с настройками $props = PsConnectionParams::get($connection, $scope); $database = $props->database(); if (empty($database)) { continue; //Не задана БД - пропускаем (для root) } dolog('Making schema script for {}', $props); $SCHEMA_DI = $DM_BUILD->getDirItem('schemas', $database, PsConst::EXT_SQL)->makePath(); check_condition(!$SCHEMA_DI->isFile(), 'Schema file for database "{}" is already exists. Dublicate database names?', $database); $SCHEMA_SQL = $SCHEMA_DI->getSqlFileBuilder(); //DROP+USE $SCHEMA_SQL->clean(); $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};"); $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;"); $SCHEMA_SQL->appendLine("USE {$database};"); //CREATE USER $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';"; $SCHEMA_SQL->appendMlComment('Create user with grants'); $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password())); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema', PsConst::EXT_SQL)); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('build', 'all', PsConst::EXT_SQL)); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK'); } //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SCHEMA); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($DM_BUILD_ALL_SQL->getDi()); /* * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini */ if ($connection != PsConnectionParams::CONN_TEST) { //Всё, сохраняем скрипт, работа закончена $SCHEMA_SQL->save(); continue; //--- } /* * На тестовой схеме прогоняем скрипт */ dolog('Making physical schema {}', $props); $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT); dolog('Root connection props: {}', $rootProps); $rootProps->execureShell($SCHEMA_SQL->getDi()); dolog('Connecting to [{}]', $props); PsConnectionPool::configure($props); $tables = PsTable::all(); /* * Нам нужно определить новый список таблиц SDK, чтобы по ним * провести валидацию новых db.ini. * * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и * можем положиться на него. Если мы подготавливаем SDK-шный db.ini, * но новый список таблиц возмём из развёрнутой тестовой БД. */ $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : $SDK->getDirItem('build', 'tables', PsConst::EXT_TXT)->getFileLines(); if ($scope == ENTITY_SCOPE_PROJ) { //Уберём из всех таблиц - SDK`шные array_remove_keys($tables, $sdkTableNames); } $scopeTableNames = array_keys($tables); sort($scopeTableNames); /* * Составим список таблиц. * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились. */ $TABLES_DI = $DM_BUILD->getDirItem(null, 'tables', PsConst::EXT_TXT)->touch()->putToFile(implode("\n", $scopeTableNames)); dolog('Tables saved to {}: {}', $TABLES_DI->getRelPath(), print_r($scopeTableNames, true)); /* * Выгрузим данные из таблиц в файл, чтобы убедиться, что всё корректно вставилось. */ if ($scopeTableNames) { dolog("Exporting '{}' schema tables data to file", $database); $DATA_DI_SQL = $DM_BUILD->getDirItem(null, 'data', PsConst::EXT_SQL)->getSqlFileBuilder(); $DATA_DI_SQL->clean(); //Пробегаемся по таблицам foreach ($scopeTableNames as $tableName) { $fileData = PsTable::inst($tableName)->exportAsSqlString(); if ($fileData) { dolog(' + {} [not empty]', $tableName); $DATA_DI_SQL->appendMlComment('+ table ' . $tableName); $DATA_DI_SQL->appendLine($fileData); } else { dolog(' - {} [empty]', $tableName); } } $DATA_DI_SQL->save(); } /* * Теперь ещё создадим тестовые объекты. * Для каждого скоупа свои тестовые данные, так что таблицы можно называть одинаково. */ dolog('Add test part'); $SCHEMA_SQL->appendMlComment('Test part'); /* if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK TEST PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK TEST PART'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'schema', PsConst::EXT_SQL)); //ADD TEST DATA $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'data', PsConst::EXT_SQL)); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK TEST PART'); } */ $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema', PsConst::EXT_SQL), false); $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data', PsConst::EXT_SQL), false); $SCHEMA_SQL->save(); #end conn== TEST /* * Всё, сохраняем финальный скрипт */ //SAVE .sql $SCHEMA_SQL->save(); //Переразвернём тестовую схему с тестовыми таблицами dolog("Rebuilding checma '{}'", $database); $rootProps->execureShell($SCHEMA_SQL->getDi()); //Отключимся от схемы PsConnectionPool::disconnect(); } } dolog('Database schemas successfully exported'); }
continue; } $rebus = $MR->normalize($rebus); switch ($MR->rebusState($rebus)) { case PsMathRebus::STATE_HAS_ANSWERS: dolog("Take rebus answers: {$rebus}"); $result[$rebus] = $MR->rebusAnswers($rebus); break; case PsMathRebus::STATE_NO_ANSWERS: dolog("Scipping rebus: {$rebus}"); $result[$rebus] = array(); break; case PsMathRebus::STATE_NOT_REGISTERED: dolog("Processing rebus: {$rebus}"); $result[$rebus] = PsMathRebusSolver::solve($rebus); break; } } $ansDI = DirItem::inst(__DIR__, 'answers.txt'); $ansDI->remove(); foreach ($result as $rebus => $answers) { $ansDI->writeLineToFile($rebus); foreach ($answers as $answer) { $ansDI->writeLineToFile($answer); } $ansDI->writeLineToFile(); } if (getCmdParam(1) == 1) { dolog('Copy from [' . $ansDI->getRelPath() . '] to [' . $MR->getAnswersDI()->getRelPath() . ']'); $ansDI->copyTo($MR->getAnswersDI()->getAbsPath()); }
dolog("Img size: [{$w} x {$h}]."); check_condition($w > 0 && !($w % $cw), 'Bad width'); check_condition($h > 0 && !($h % $ch), 'Bad height'); $xcells = $w / $cw; $ycells = $h / $ch; $totalCells = $xcells * $ycells; dolog("Cells cnt: [{$xcells} x {$ycells}], total: {$totalCells}."); $generator = new MosaicCellsGenerator($totalCells); $secundomer = Secundomer::startedInst(); $sqlDI = $outDm->getDirItem(null, 'fill', 'sql'); $mapDI = $outDm->getDirItem(null, 'map', 'txt'); $sqlImg = "delete from ps_img_mosaic_parts where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "delete from ps_img_mosaic_answers where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "delete from ps_img_mosaic where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "insert into ps_img_mosaic (id_img, w, h, cx, cy, cw, ch) values ({$id}, {$w}, {$h}, {$xcells}, {$ycells}, {$cw}, {$ch});"; $sqlDI->writeLineToFile($sqlImg); for ($cellCnt = 1; $cellCnt <= $totalCells; $cellCnt++) { $cellNum = $generator->getCellNum(); $xCell = $cellNum % $xcells; $xCell = $xCell == 0 ? $xcells : $xCell; $yCell = ($cellNum - $xCell) / $xcells + 1; $sqlCell = "insert into ps_img_mosaic_parts (id_img, n_part, x_cell, y_cell) values ({$id}, {$cellCnt}, {$xCell}, {$yCell});"; $sqlDI->writeLineToFile($sqlCell); $mapDI->writeLineToFile($cellCnt . '=' . $xCell . 'x' . $yCell); } $secundomer->stop(); dolog('Execution time: ' . $secundomer->getTotalTime()); }
function doTest($className, $methodName, array $params, $expected) { $method = "{$className}::{$methodName}"; $actual = call_user_func_array($method, $params); dolog("{}({})='{}', Expected='{}'", $method, join(', ', $params), $actual, $expected); check_condition($actual == $expected, "{$actual} != {$expected}"); }
private static function _cleanHostname($hostname = '') { $orig_hn = $hostname; $c = 1; while ($c > 0) { str_replace('..', '.', $hostname, $c); } $hostname = trim($hostname, '. '); if ($hostname != $orig_hn) { dolog('Hostname ' . $orig_hn . ' auto-repaired to ' . $hostname); } return $hostname; }
LOGBOX('Set consts'); $props = DirItem::inst(__DIR__, 'consts.txt')->getFileAsProps(); dolog(print_r($props, true)); PsGlobals::inst()->updateProps($props); /* * УДАЛИМ ТЕСТОВЫЕ ДИРЕКТОРИИ */ LOGBOX('Remove test dirs'); $dirs = DirManager::inst()->getDirContentFull(null, DirItemFilter::DIRS); $testDirNames = array('temp', 'orig', '4use', 'tests', 'testcase'); $testDirStartsWith = array('!'); /* @var $dir DirItem */ foreach ($dirs as $dir) { if (in_array($dir->getName(), $testDirNames) || starts_with($dir->getName(), $testDirStartsWith)) { $path = $dir->getAbsPath(); dolog('Removing: ' . $path); DirManager::inst($path)->clearDir(null, true); } } /* * УДАЛИМ АРХИВЫ */ LOGBOX('Remove archivs'); $archivs = DirManager::inst()->getDirContentFull(null, DirItemFilter::ARCHIVES); /* @var $dir DirItem */ foreach ($archivs as $arc) { dolog('Removing: ' . $arc->getAbsPath()); $arc->remove(); } dolog("\nFile actions successfully finished\n");
throw new Exception('password required'); } if (empty($data['auth_area'])) { throw new Exception('auth area required'); } if (empty($data['net_block'])) { throw new Exception('net block required'); } //auth if (!isset($config['user'][$data['user']])) { throw new Exception('user doesnt exist'); } if ($data['password'] != $config['user'][$data['user']]) { throw new Exception('password invalid'); } } catch (Exception $e) { dolog('ERROR: ' . $e->getMessage()); exit; } $auth_area = $data['auth_area']; $auth_area_dashed = str_replace('/', '-', $data['auth_area']); $net_block = $data['net_block']; $net_block_dashed = str_replace('/', '-', $data['net_block']); //del the org file $org_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/org/' . $net_block_dashed . '.txt'; unlink($org_file); //del the network file $net_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/network/' . $net_block_dashed . '.txt'; unlink($net_file); //update server updateServer($auth_area);
/** * Процесс строит скрипты для вставки ячеек в БД * * @param array $argv */ function executeProcess(array $argv) { $DM = DirManager::inst(__DIR__); //Перенесём картинки в директорию со всеми картинками /* @var $img DirItem */ foreach ($DM->getDirContent(null, DirItemFilter::IMAGES) as $img) { $img->copyTo($DM->absFilePath('source', $img->getName())); $img->remove(); } //Очистим директорию с выходными файлами $DM->clearDir('output'); $DM->makePath('output'); //Пробегаемся по картинкам, разбиваем их на ячейки и строим sql для вставки /* @var $img DirItem */ foreach ($DM->getDirContent('source', DirItemFilter::IMAGES) as $img) { $id = $img->getNameNoExt(); //Обрабатываем только картинки с целыми кодами if (is_inumeric($id)) { dolog("Processing img [{$img->getRelPath()}]."); $id = 1 * $id; } else { dolog("Skip img [{$img->getRelPath()}], name is not numeric."); continue; //--- } //Начало обработки $outDm = DirManager::inst(array(__DIR__, 'output'), $id); //Скопируем картинку $img->copyTo($outDm->absFilePath(null, $img->getName())); //Вычислим размеры ячейки $cw = 10; $ch = 10; $dim = $DM->getDirItem('source', $id, 'txt')->getFileAsProps(false); $dim = $dim['dim']; if ($dim) { $dim = explode('x', $dim); $cw = 1 * $dim[0]; $ch = 1 * $dim[1]; } //Скопируем свойства, с которыми она создавалась $outDm->getDirItem(null, 'settings', 'txt')->putToFile('dim=' . $cw . 'x' . $ch); dolog("Cell dimensions: [{$cw} x {$ch}]."); //Размеры картинки получим у самой картинки $w = $img->getImageAdapter()->getWidth(); $h = $img->getImageAdapter()->getHeight(); dolog("Img size: [{$w} x {$h}]."); check_condition($w > 0 && !($w % $cw), 'Bad width'); check_condition($h > 0 && !($h % $ch), 'Bad height'); $xcells = $w / $cw; $ycells = $h / $ch; $totalCells = $xcells * $ycells; dolog("Cells cnt: [{$xcells} x {$ycells}], total: {$totalCells}."); $generator = new MosaicCellsGenerator($totalCells); $secundomer = Secundomer::startedInst(); $sqlDI = $outDm->getDirItem(null, 'fill', 'sql'); $mapDI = $outDm->getDirItem(null, 'map', 'txt'); $sqlImg = "delete from ps_img_mosaic_parts where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "delete from ps_img_mosaic_answers where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "delete from ps_img_mosaic where id_img={$id};"; $sqlDI->writeLineToFile($sqlImg); $sqlImg = "insert into ps_img_mosaic (id_img, w, h, cx, cy, cw, ch) values ({$id}, {$w}, {$h}, {$xcells}, {$ycells}, {$cw}, {$ch});"; $sqlDI->writeLineToFile($sqlImg); for ($cellCnt = 1; $cellCnt <= $totalCells; $cellCnt++) { $cellNum = $generator->getCellNum(); $xCell = $cellNum % $xcells; $xCell = $xCell == 0 ? $xcells : $xCell; $yCell = ($cellNum - $xCell) / $xcells + 1; $sqlCell = "insert into ps_img_mosaic_parts (id_img, n_part, x_cell, y_cell) values ({$id}, {$cellCnt}, {$xCell}, {$yCell});"; $sqlDI->writeLineToFile($sqlCell); $mapDI->writeLineToFile($cellCnt . '=' . $xCell . 'x' . $yCell); } $secundomer->stop(); dolog('Execution time: ' . $secundomer->getTotalTime()); } }
<?php require_once '../ToolsResources.php'; $CALLED_FILE = __FILE__; dolog('try to get lock'); $taken = PsLock::lock('mylock-nowait', false); dolog('lock ' . ($taken ? 'taken' : 'not taken')); if ($taken) { sleep(10); PsLock::unlock(); dolog('lock released'); }
Postal-Code: {$zip} Country-Code: {$country} Phone: {$phone} Created: {$time} Updated: {$time} Updated-By: {$hostmaster} CODE; $network = <<<CODE ID: net-{$net_block} Auth-Area: {$auth_area} Network-Name: {$company}-{$net_block} IP-Network: {$net_block} Organization: {$org_name} Tech-Contact: {$tech_contact} Admin-Contact: {$tech_contact} Created: {$time} Updated: {$time} Updated-By: {$hostmaster} CODE; //write the org file $org_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/org/' . $net_block_dashed . '.txt'; dolog('adding new org file (' . $org_file . '): ' . "\n" . $org); unlink($org_file); file_put_contents($org_file, $org); //write the network file $net_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/network/' . $net_block_dashed . '.txt'; dolog('adding new network file (' . $net_file . '): ' . "\n" . $network); unlink($net_file); file_put_contents($net_file, $network); //update server updateServer($auth_area);
public static function url_stat($path, $flags) { $opts = static::parsePath($path); try { $wrapper = new static(); $wrapper->reset(); $wrapper->populateInfo($opts); $stat = $wrapper->stat($wrapper->stream_stat()); return $stat; } catch (Exception $e) { dolog(self::getPrefix(false) . ' [url_stat] ' . $e->getMessage(), LOG_WARN); return false; } }