/** * @covers DirManager::inst * @covers DirManager::relDirPath * @covers DirManager::absDirPath */ public function testInst() { $inst = DirManager::inst(DirManagerTestHelper::dirsAbsPath()); $this->assertEquals(last_char($inst->absDirPath()), DIR_SEPARATOR); $this->assertEquals(last_char($inst->relDirPath()), DIR_SEPARATOR); $this->assertEquals(first_char($inst->relDirPath()), DIR_SEPARATOR); $this->assertEquals($inst->absDirPath(), DirManagerTestHelper::dirsAbsPath()); $this->assertTrue(strlen($inst->absDirPath()) > strlen($inst->relDirPath())); $this->assertTrue(ends_with($inst->absDirPath(), $inst->relDirPath())); //Создание в конструкторе $inst = DirManager::inst(DirManagerTestHelper::dirsAbsPath()); $this->assertTrue(!$inst->isDir(DirManagerTestHelper::TMP)); $this->assertTrue($inst === DirManager::inst(DirManagerTestHelper::dirsAbsPath())); $inst = DirManager::inst(DirManagerTestHelper::dirsAbsPath(), DirManagerTestHelper::TMP); $this->assertTrue($inst->isDir()); $this->assertTrue($inst === DirManager::inst(DirManagerTestHelper::dirsAbsPath(), DirManagerTestHelper::TMP)); }
function &new_wget($text, $url, $mod_rewrite_enabled, $id_array) { debug_no_info(); global $log_file; $result = new wget_result(); $web_sufix = array(".html", ".php", ".htm"); $address_symbol = array(".", "#"); $separators = array("''", '""', "()", ">", " "); $hrefs = array("href=", "src=", "background-image: url", "background: url", "window.open("); $download_file_sufix = array(".gif", ".jpg", ".doc", ".xls", ".js", ".zip", ".css", ".swf"); $parse_file_sufix = array(".html", ".htm"); //получаем имя хоста в виде http://host.domain $host = del_from_left($url, strlen("http://")); $buff = explode("/", $host); $host = "http://" . $buff[0]; // Надо заменить конструкицю вида onclick="openImage(this.href);return false;" $text = preg_replace("/(onclick=\"openImage\\(this.href\\);return false;\") href=\"(.*)/", " href=\"/scripts/popup.php?img=\\2", $text); //echo "$host\n\n\n\n\n\n"; //получаем ссылку на серве: $server_link = del_from_left($url, strlen($host)); //получаем рабочую директорию на серве, если не включен мод-реврайт if ($mod_rewrite_enabled) { $path_for_relative = $host . '/'; $clean_url = "/"; } else { //ищем гадские символы . ? # которые портят адресную строку foreach ($address_symbol as $symbol) { if (strpos($server_link, $symbol)) { $positions[] = strpos($server_link, $symbol) - 1; } } if (sizeof($positions) > 1) { $min = $positions[0]; foreach ($positions as $pos) { if ($pos < $min) { $min = $pos; } } } elseif (sizeof($positions) == 1) { $min = $positions[0]; } else { $min = strlen($server_link); } //нашли первое вхождение гадского символа - и получили урл без него $clean_url = del_from_right($server_link, strlen($server_link) - $min - 1); if ($clean_url == $server_link) { //небыло гадских символов - числый урл if (last_char($clean_url) != '/') { $clean_url = $server_link . "/"; } } else { if (isset($tmp)) { unset($tmp); } //удаляем весь хлам из конца строки до последнего слэша while ($tmp != '/') { $tmp = last_char($clean_url); $clean_url = del_from_right($clean_url, 1); } //доваляем только что стертый слэш ;] $clean_url = $clean_url . '/'; } $path_for_relative = $host . $clean_url; } //обнуляем хлам unset($tmp); unset($pos); unset($min); //обработка урла закончена - начинаем делать мозги с заменой ссылок. foreach ($separators as $sep) { if (strlen($sep) == 2) { $double_sep[] = $sep; } else { $single_sep[] = $sep; } } //debug //echo "found ".sizeof($double_sep)." double separators and ".sizeof($single_sep)." single separators<br>"; foreach ($hrefs as $href_name) { $buff = explode($href_name, $text); //начинаем перебор всех ссылок for ($i = 1; $i < sizeof($buff); $i++) { //для начала найдем какой из разделителей встречается первым //проверяем начинается ли строка с одного из двойных разделителей unset($current_sep); foreach ($double_sep as $sep) { if (first_char($buff[$i]) == first_char($sep)) { $current_sep = $sep; } } //а если не начинается - выбираем одинарный разделитель if (!isset($current_sep)) { $single_sep_pos = strlen($buff[$i]); foreach ($single_sep as $sep) { if (strpos($buff[$i], $sep) && $single_sep_pos > strpos($buff[$i], $sep)) { $single_sep_pos = strpos($buff[$i], $sep); $current_sep = $sep; } } } //разделитель выбран - начинаем получение кода ссылки //откуда начинается код ссылки if (strlen($current_sep) == 2) { $pos_start = 1; } else { $pos_start = 0; } //где заканчивается код ссылки $tmp = del_from_left($buff[$i], 1); $pos_end = strpos($tmp, last_char($current_sep)); $src_link = substr($buff[$i], $pos_start, $pos_end); //ссылка из кода и ее позиции получены, начинаем преобразование в ссылку для cd //echo $src_link."\n\n"; if (first_char($src_link) == '/') { //первый символ ссылки - слэш - ссылка абсолютная в пределах домена $cd_link = $src_link; $full_link = $host . $cd_link; } elseif (if_prefix($src_link, 'http://')) { //ссылка совсем абсолютная if (if_prefix($src_link, $host)) { //ссылка совсем абсолютная но ведет на наш домен $cd_link = del_from_left($src_link, strlen($host)); $full_link = $src_link; } else { //ссылка совсем абсолютная и ведет наружу - обрезаем $cd_link = 'index.html'; $full_link = ''; } } elseif (substr($src_link, 0, strlen('../images/')) == '../images/') { $src_link = substr($src_link, strlen('../')); $cd_link = $clean_url . $src_link; $full_link = $host . $cd_link; } else { //ссылка относительная, подставляем рабочий каталог $cd_link = $clean_url . $src_link; $full_link = $host . $cd_link; } if (strpos($url, '.css') !== false) { // Заменяем в css-файле пути к картинкам с /images на ../images if (first_char($src_link) == '/') { $cd_link = '/..' . $src_link; $full_link = $host . $src_link; } else { if (substr($src_link, 0, strlen('images/')) == 'images/') { $cd_link = '/../' . $src_link; $full_link = $host . '/' . $src_link; } } } //echo $cd_link."\n"; //проверяем куда эта ссылка - если на файл - добавляем в список файлов на закачкуы $need = false; $is_cd = ""; if ($cd_link != '#') { if (strpos($cd_link, 'popup.php') !== false) { } else { foreach ($download_file_sufix as $suf) { if (if_sufix($cd_link, $suf)) { $result->download_name[] = $cd_link; $result->download_link[] = $full_link; $need = true; $cd_link = del_from_left($cd_link, 1); } } foreach ($parse_file_sufix as $suf) { if (if_sufix($cd_link, $suf)) { $result->parse_name[] = $cd_link; $result->parse_link[] = $full_link; $need = true; $cd_link = del_from_left($cd_link, 1); } } } if (!$need) { if (substr($src_link, 0, 3) == "/cd") { $src_link = substr($src_link, 3); $is_cd = "/cd"; } if (substr($src_link, 0, 2) == "cd") { $src_link = substr($src_link, 2); $is_cd = "cd"; } if (substr($src_link, 0, 1) == "/") { $src_link = substr($src_link, 1); } if (substr($cd_link, 0, 3) == "cd/") { $cd_link = substr($cd_link, 3); } if (substr($cd_link, 0, 3) == "/cd") { $cd_link = substr($cd_link, 3); } if ($cd_link == "/") { $cd_link = "index.html"; } else { $match = false; if (strpos($cd_link, 'popup.php') !== false) { $match = true; } else { $cur_id = id_by_path($cd_link); if ($cur_id && in_array($cur_id, $id_array)) { $match = true; } } // Если это ссылка с параметрами (и эта ссылка включена в презентацию), то получаем и ее тоже в отдельный файл, а ссылку переименовываем по имени файла if (strpos($src_link, '?') !== false) { $_temp = explode('?', $src_link); $cur_id = id_by_path($_temp[0]); if (strpos($cd_link, 'popup.php') !== false || $cur_id && in_array($cur_id, $id_array)) { mysql_query("insert into tree_cd_links (url,done) values ('{$src_link}',0)"); $match = true; } } //echo $cd_link." -->"; if (!$match) { $cd_link = '#'; } else { if ($cd_link[0] == '/') { $cd_link = substr($cd_link, 1); } $cd_link = str_replace(array('?', '/'), '_', $cd_link); if (substr($cd_link, -1) == '_') { $cd_link = substr($cd_link, 0, strlen($cd_link) - 1); } $cd_link .= ".html"; } //echo $cd_link." ($match) \r\n"; } if (!if_prefix($cd_link, "javascript")) { $result->href_name[] = $cd_link; $result->href_link[] = $full_link; } //fputs($log_file,$cd_link." ====>>>> $match<br>"); } } if (strlen($current_sep) == 2) { $link_in_code = first_char($current_sep) . $src_link . last_char($current_sep); $new_link_in_code = first_char($current_sep) . $cd_link . last_char($current_sep); } else { $link_in_code = $src_link . $current_sep; $new_link_in_code = $cd_link . $current_sep; } if (!isset($is_cd)) { $is_cd = ''; } if ($is_cd) { $link_in_code = $is_cd . $link_in_code; } $tmp = del_from_left($buff[$i], strlen($link_in_code)); if ($tmp[0] == '"' || $tmp[0] == "'") { $tmp = substr($tmp, 1); } $buff[$i] = $new_link_in_code . $tmp; $text = implode($href_name, $buff); } } $result->text = $text; return $result; }
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'); }