Exemplo n.º 1
0
 /**
  * @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));
 }
Exemplo n.º 2
0
Arquivo: wget.php Projeto: romlg/cms36
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;
}
Exemplo n.º 3
0
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');
}