public function up()
 {
     fn_print_r('Hello world!');
     $addons = array('ak_union_web');
     $updater = array();
     foreach (fn_get_translation_languages() as $lang_code => $_data) {
         foreach ($addons as $addon) {
             $addon_scheme = @simplexml_load_file('app/addons/' . $addon . '/addon.xml', '\\Tygh\\ExSimpleXmlElement', LIBXML_NOCDATA);
             $current_langvars = $addon_scheme->xpath("//language_variables/item[@lang='{$lang_code}']");
             foreach ($current_langvars as $key => $value) {
                 if (!empty($value) && !empty($value['id']) && !empty($value['lang'])) {
                     $updater[] = array('value' => (string) $value, 'name' => (string) $value['id'], 'lang_code' => (string) $value['lang']);
                     fn_print_r((string) $value['lang'] . ' --> ' . (string) $value['id'] . ' --> ' . (string) $value);
                 }
             }
         }
     }
     db_query('REPLACE INTO ?:language_values ?m', $updater);
     die;
 }
示例#2
0
            $options['ignore_user_abort'] = ini_get('ignore_user_abort');
            @ignore_user_abort(1);
            $options['ignore_user_abort_after'] = ini_get('ignore_user_abort_after');
            $options['memory_limit'] = ini_get('memory_limit');
            if (defined('SE_MEMORY_LIMIT')) {
                if (substr(ini_get('memory_limit'), 0, -1) < SE_MEMORY_LIMIT) {
                    @ini_set('memory_limit', SE_MEMORY_LIMIT . 'M');
                }
            }
            $options['memory_limit_after'] = ini_get('memory_limit');
        }
    }
    if (isset($_REQUEST['output'])) {
        fn_echo(json_encode($options));
    } else {
        fn_print_r($options);
    }
    die;
}
function fn_se_get_total_items_queue()
{
    $total_items = 0;
    if (fn_allowed_for('ULTIMATE') && Registry::get('runtime.company_id')) {
        $total_items = db_get_field('SELECT COUNT(queue_id) FROM ?:se_queue WHERE company_id = ?i', Registry::get('runtime.company_id'));
    } elseif (!fn_allowed_for('ULTIMATE')) {
        $total_items = db_get_field('SELECT COUNT(queue_id) FROM ?:se_queue WHERE 1');
    }
    return $total_items;
}
function fn_se_get_next_queue($queue_id = 0)
{
示例#3
0
 public static function convertPresets401To402()
 {
     $theme_name = Registry::get('config.base_theme');
     $schema_path = fn_get_theme_path('[themes]/' . $theme_name . '/styles/schema.json', 'C');
     $schema = file_get_contents($schema_path);
     if (!empty($schema)) {
         $schema = json_decode($schema, true);
     }
     db_query('ALTER TABLE ?:bm_layouts CHANGE `preset_id` `preset_id` varchar(64) NOT NULL default ""');
     $presets = db_get_array('SELECT * FROM ?:theme_presets');
     foreach ($presets as $preset) {
         $preset['name'] = self::_formPresetName($preset['name']);
         //We should rename default preset to satori in order to prevent default preset creation.
         if ($preset['name'] == 'default') {
             $preset['name'] = 'satori';
         }
         db_query('UPDATE ?:bm_layouts SET preset_id = ?s WHERE preset_id = ?i', $preset['name'], $preset['preset_id']);
         $preset_path = fn_get_theme_path('[themes]/' . $theme_name . '/styles/data/', 'C');
         if (file_exists($preset_path . $preset['name'] . '.less')) {
             continue;
         }
         $preset_data = unserialize($preset['data']);
         $less = array();
         foreach ($preset_data as $section => $fields) {
             foreach ($fields as $field_id => $value) {
                 switch ($section) {
                     case 'general':
                         $less[$field_id] = empty($value) ? $schema[$section]['fields'][$field_id]['off'] : $schema[$section]['fields'][$field_id]['on'];
                         break;
                     case 'colors':
                         $less[$field_id] = $value;
                         break;
                     case 'fonts':
                         $less[$field_id] = $value['family'];
                         if (!empty($value['size'])) {
                             $field_name = $schema[$section]['fields'][$field_id]['properties']['size']['match'];
                             $field_value = $value['size'] . $schema[$section]['fields'][$field_id]['properties']['size']['unit'];
                             $less[$field_name] = $field_value;
                         }
                         if (!empty($value['style'])) {
                             foreach ($value['style'] as $style_type => $style_value) {
                                 $field_name = $schema[$section]['fields'][$field_id]['properties']['style'][$style_type]['match'];
                                 $field_value = $schema[$section]['fields'][$field_id]['properties']['style'][$style_type]['property'];
                                 $less[$field_name] = $field_value;
                             }
                         }
                         break;
                     case 'backgrounds':
                         $value['transparent'] = isset($value['transparent']) ? $value['transparent'] : false;
                         $value['full_width'] = isset($value['full_width']) ? $value['full_width'] : false;
                         foreach ($value as $bg_name => $bg_value) {
                             switch ($bg_name) {
                                 case 'color':
                                     $field_name = $schema[$section]['fields'][$field_id]['properties']['color']['match'];
                                     $less[$field_name] = $bg_value;
                                     break;
                                 case 'gradient':
                                     $field_name = $schema[$section]['fields'][$field_id]['gradient']['match'];
                                     $less[$field_name] = $bg_value;
                                     break;
                                 case 'image_data':
                                     $less[$schema[$section]['fields'][$field_id]['properties']['pattern']] = !empty($bg_value) ? 'url("' . $bg_value . '")' : 'transparent';
                                     break;
                                 case 'repeat':
                                     $field_name = $schema[$section]['fields'][$field_id]['properties']['repeat'];
                                     if (!empty($field_name)) {
                                         $less[$field_name] = $bg_value;
                                     }
                                     break;
                                 case 'attachment':
                                     $field_name = $schema[$section]['fields'][$field_id]['properties']['attachment'];
                                     if (!empty($field_name)) {
                                         $less[$field_name] = $bg_value;
                                     }
                                     break;
                                 case 'full_width':
                                     if (!isset($schema[$section]['fields'][$field_id]['copies'])) {
                                         break;
                                     }
                                     foreach ($schema[$section]['fields'][$field_id]['copies']['full_width'] as $copies) {
                                         if (!empty($value['full_width'])) {
                                             if (!empty($copies['inverse'])) {
                                                 $less[$copies['match']] = $copies['default'];
                                             } elseif (isset($less[$copies['source']])) {
                                                 $less[$copies['match']] = $less[$copies['source']];
                                             }
                                         } else {
                                             if (empty($copies['inverse'])) {
                                                 $less[$copies['match']] = $copies['default'];
                                             }
                                         }
                                     }
                                     break;
                                 case 'transparent':
                                     if (!isset($schema[$section]['fields'][$field_id]['copies'])) {
                                         break;
                                     }
                                     foreach ($schema[$section]['fields'][$field_id]['copies']['transparent'] as $copies) {
                                         if (!empty($value['transparent'])) {
                                             if (!empty($copies['inverse'])) {
                                                 $less[$copies['match']] = $copies['default'];
                                             } elseif (isset($less[$copies['source']])) {
                                                 $less[$copies['match']] = $less[$copies['source']];
                                             }
                                         } else {
                                             if (empty($copies['inverse'])) {
                                                 $less[$copies['match']] = $copies['default'];
                                             }
                                         }
                                     }
                                     break;
                                 case 'image_name':
                                     break;
                                 default:
                                     fn_print_r('Unprocessed background property: ' . $bg_name);
                             }
                         }
                         break;
                     default:
                         fn_print_r('Error: Section ' . $section . ' was not processed');
                 }
             }
         }
         $less = Less::arrayToLessVars($less);
         file_put_contents(fn_get_theme_path('[themes]/' . $theme_name . '/styles/data/' . $preset['name'] . '.less', 'C'), $less);
     }
     db_query('DROP TABLE IF EXISTS ?:theme_presets');
     return true;
 }
示例#4
0
function fn_seo_link_test()
{
    $options = array('seo_product_type' => array('product_file', 'product_file_nohtml', 'product_category', 'product_category_nohtml'), 'seo_category_type' => array('file', 'category', 'root_category'), 'seo_page_type' => array('file', 'page', 'root_page'), 'seo_other_type' => array('file', 'directory'));
    $urls = array('seo_product_type' => 'products.view?product_id=12', 'seo_category_type' => 'categories.view?category_id=168&page=2', 'seo_page_type' => 'pages.view?page_id=4&page=1', 'seo_other_type' => 'profiles.update');
    foreach ($options as $option_name => $option_values) {
        $url = $urls[$option_name];
        $result = array();
        foreach ($option_values as $value) {
            Registry::set('addons.seo.' . $option_name, $value);
            $result[$value] = fn_url($url);
        }
        fn_print_r($result);
    }
}
示例#5
0
function fn_searchanise_send_search_request($params, $lang_code = CART_LANGUAGE)
{
    $company_id = fn_se_get_company_id();
    $api_key = fn_se_get_api_key($company_id, $lang_code);
    if (empty($api_key)) {
        return;
    }
    $default_params = array('items' => 'true', 'facets' => 'true', 'output' => 'json');
    $params = array_merge($default_params, $params);
    if (empty($params['restrictBy'])) {
        unset($params['restrictBy']);
    }
    if (empty($params['union'])) {
        unset($params['union']);
    }
    $query = http_build_query($params);
    if (fn_se_check_debug()) {
        fn_print_r($params);
    }
    Registry::set('log_cut', true);
    if (strlen($query) > SE_MAX_SEARCH_REQUEST_LENGTH && fn_check_curl()) {
        $received = Http::post(SE_SERVICE_URL . '/search?api_key=' . $api_key, $params, array('timeout' => SE_SEARCH_TIMEOUT));
    } else {
        $params['api_key'] = $api_key;
        $received = Http::get(SE_SERVICE_URL . '/search', $params, array('timeout' => SE_SEARCH_TIMEOUT));
    }
    if (empty($received)) {
        return false;
    }
    $result = json_decode(trim($received), true);
    if (fn_se_check_debug()) {
        fn_print_r($result);
    }
    if (isset($result['error'])) {
        if ($result['error'] == 'NEED_RESYNC_YOUR_CATALOG') {
            fn_se_queue_import($company_id, $lang_code, false);
            return false;
        } elseif ($result['error'] == 'NAVIGATION_DISABLED') {
            fn_se_set_simple_setting('use_navigation', 'N');
        }
    }
    if (empty($result) || !is_array($result) || !isset($result['totalItems'])) {
        return false;
    }
    return $result;
}
示例#6
0
/**
 * Dispathes the execution control to correct controller
 *
 * @return nothing
 */
function fn_dispatch()
{
    Profiler::checkpoint('After init');
    fn_set_hook('before_dispatch');
    $regexp = "/^[a-zA-Z0-9_\\+]+\$/";
    $view =& Registry::get('view');
    $run_controllers = true;
    $external = false;
    $status = CONTROLLER_STATUS_NO_PAGE;
    // Security
    if (Registry::get('config.tweaks.anti_csfr') == true) {
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && (empty($_SESSION['security_hash']) || empty($_REQUEST['security_hash']) || $_REQUEST['security_hash'] != $_SESSION['security_hash'])) {
            die('Access denied: CSRF attack');
        }
    }
    //If $config['http_host'] was different from the domain name, there was redirection to $config['http_host'] value.
    if ((defined('HTTPS') ? Registry::get('config.https_host') : Registry::get('config.http_host')) != REAL_HOST && $_SERVER['REQUEST_METHOD'] == 'GET' && !defined('CONSOLE')) {
        fn_redirect((defined('HTTPS') ? Registry::get('config.https_location') : Registry::get('config.http_location')) . '/' . Registry::get('config.current_url'));
    }
    if (isset($_SERVER['CONTENT_LENGTH']) && ($_SERVER['CONTENT_LENGTH'] > fn_return_bytes(ini_get('upload_max_filesize')) || $_SERVER['CONTENT_LENGTH'] > fn_return_bytes(ini_get('post_max_size')))) {
        $max_size = fn_return_bytes(ini_get('upload_max_filesize')) < fn_return_bytes(ini_get('post_max_size')) ? ini_get('upload_max_filesize') : ini_get('post_max_size');
        $msg = fn_get_lang_var('text_forbidden_uploaded_file_size');
        $msg = str_replace('[size]', $max_size, $msg);
        fn_set_notification('E', fn_get_lang_var('error'), $msg);
        fn_redirect($_SERVER['HTTP_REFERER'], false);
    }
    // If URL contains session ID, remove it
    if (!empty($_REQUEST[SESS_NAME]) && $_SERVER['REQUEST_METHOD'] == 'GET') {
        fn_redirect(fn_query_remove(Registry::get('config.current_url'), SESS_NAME));
    }
    if (!preg_match($regexp, CONTROLLER) || !preg_match($regexp, MODE)) {
        $status = CONTROLLER_STATUS_NO_PAGE;
        $run_controllers = false;
    }
    // If demo mode is enabled, check permissions FIX ME - why did we need one more user login check?
    if (AREA == 'A') {
        if (Registry::get('config.demo_mode') == true) {
            $run_controllers = fn_check_permissions(CONTROLLER, MODE, 'demo');
            if ($run_controllers == false) {
                fn_set_notification('W', fn_get_lang_var('demo_mode'), fn_get_lang_var('demo_mode_content_text'));
                if (defined('AJAX_REQUEST')) {
                    exit;
                }
                $status = CONTROLLER_STATUS_REDIRECT;
                $_REQUEST['redirect_url'] = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : INDEX_SCRIPT;
            }
        } elseif (!empty($_SESSION['auth']['usergroup_ids']) || defined('COMPANY_ID')) {
            $run_controllers = fn_check_permissions(CONTROLLER, MODE, 'admin', '', $_REQUEST);
            if ($run_controllers == false) {
                if (defined('AJAX_REQUEST')) {
                    $ajax =& Registry::get('ajax');
                    $force_redirection = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
                    //$ajax->assign('force_redirection', $force_redirection);
                    $_info = defined('DEVELOPMENT') ? ' ' . CONTROLLER . '.' . MODE : '';
                    fn_set_notification('W', fn_get_lang_var('warning'), fn_get_lang_var('access_denied') . $_info, true);
                    exit;
                }
                $status = CONTROLLER_STATUS_DENIED;
            }
        }
    }
    // Check if request was rewritten and not handled
    // In this case this means that request was incorrect
    if (isset($_REQUEST['sef_rewrite'])) {
        $status = CONTROLLER_STATUS_NO_PAGE;
        $run_controllers = false;
    }
    if (AREA == 'A' && Registry::get('settings.General.secure_admin') == 'Y' && !defined('HTTPS') && $_SERVER['REQUEST_METHOD'] != 'POST' && !defined('AJAX_REQUEST') && empty($_REQUEST['keep_location']) && !defined('CONSOLE')) {
        fn_redirect(Registry::get('config.https_location') . '/' . Registry::get('config.current_url'));
    } elseif (AREA == 'C' && $_SERVER['REQUEST_METHOD'] != 'POST' && !defined('AJAX_REQUEST')) {
        $secure_controllers = fn_get_secure_controllers();
        // if we are not on https but controller is secure, redirect to https
        if (isset($secure_controllers[CONTROLLER]) && $secure_controllers[CONTROLLER] == 'active' && !defined('HTTPS')) {
            fn_redirect(Registry::get('config.https_location') . '/' . Registry::get('config.current_url'));
        }
        // if we are on https and the controller is insecure, redirect to http
        if (!isset($secure_controllers[CONTROLLER]) && defined('HTTPS') && Registry::get('settings.General.keep_https') != 'Y') {
            fn_redirect(Registry::get('config.http_location') . '/' . Registry::get('config.current_url'));
        }
    }
    if (AREA == 'A') {
        fn_init_last_view($_REQUEST);
    }
    $controllers_cascade = array();
    $controllers_list = array('init');
    if ($run_controllers == true) {
        $controllers_list[] = CONTROLLER;
        $controllers_list = array_unique($controllers_list);
    }
    foreach ($controllers_list as $ctrl) {
        $core_controllers = fn_init_core_controllers($ctrl);
        list($addon_controllers) = fn_init_addon_controllers($ctrl);
        if (empty($core_controllers) && empty($addon_controllers)) {
            $controllers_cascade = array();
            $status = CONTROLLER_STATUS_NO_PAGE;
            break;
        }
        if (count($core_controllers) + count($addon_controllers) > 1) {
            die('Duplicate controller ' . CONTROLLER . fn_print_r(array_merge($core_controllers, $addon_controllers), 1));
        }
        $core_pre_controllers = fn_init_core_controllers($ctrl, GET_PRE_CONTROLLERS);
        $core_post_controllers = fn_init_core_controllers($ctrl, GET_POST_CONTROLLERS);
        list($addon_pre_controllers) = fn_init_addon_controllers($ctrl, GET_PRE_CONTROLLERS);
        list($addon_post_controllers, $addons) = fn_init_addon_controllers($ctrl, GET_POST_CONTROLLERS);
        // we put addon post-controller to the top of post-controller cascade if current addon serves this request
        if (count($addon_controllers)) {
            $addon_post_controllers = fn_reorder_post_controllers($addon_post_controllers, $addon_controllers[0]);
        }
        $controllers_cascade = array_merge($controllers_cascade, $addon_pre_controllers, $core_pre_controllers, $core_controllers, $addon_controllers, $core_post_controllers, $addon_post_controllers);
        if (empty($controllers_cascade)) {
            die("No controllers for: {$controller}");
        }
    }
    if (MODE == 'add') {
        $tpl = 'update.tpl';
    } elseif (strpos(MODE, 'add_') === 0) {
        $tpl = str_replace('add_', 'update_', MODE) . '.tpl';
    } else {
        $tpl = MODE . '.tpl';
    }
    $view =& Registry::get('view');
    if ($view->template_exists('views/' . CONTROLLER . '/' . $tpl)) {
        // try to find template in base views
        $view->assign('content_tpl', 'views/' . CONTROLLER . '/' . $tpl);
    } elseif (defined('LOADED_ADDON_PATH') && $view->template_exists('addons/' . LOADED_ADDON_PATH . '/views/' . CONTROLLER . '/' . $tpl)) {
        // try to find template in addon views
        $view->assign('content_tpl', 'addons/' . LOADED_ADDON_PATH . '/views/' . CONTROLLER . '/' . $tpl);
    } elseif (!empty($addons)) {
        // try to find template in addon views that extend base views
        foreach ($addons as $addon => $_v) {
            if ($view->template_exists('addons/' . $addon . '/views/' . CONTROLLER . '/' . $tpl)) {
                $view->assign('content_tpl', 'addons/' . $addon . '/views/' . CONTROLLER . '/' . $tpl);
                break;
            }
        }
    }
    foreach ($controllers_cascade as $item) {
        $_res = fn_run_controller($item);
        // 0 - status, 1 - url
        $external = !empty($_res[2]) ? $_res[2] : false;
        $url = !empty($_res[1]) ? $_res[1] : '';
        // Status could be changed only if we allow to run controllers despite of init controller
        if ($run_controllers == true) {
            $status = !empty($_res[0]) ? $_res[0] : CONTROLLER_STATUS_OK;
        }
        if ($status == CONTROLLER_STATUS_OK && !empty($url)) {
            $redirect_url = $url;
        } elseif ($status == CONTROLLER_STATUS_REDIRECT && !empty($url)) {
            $redirect_url = $url;
            break;
        } elseif ($status == CONTROLLER_STATUS_DENIED || $status == CONTROLLER_STATUS_NO_PAGE) {
            break;
        }
    }
    if (AREA == 'A') {
        fn_init_view_tools($_REQUEST);
    }
    // In console mode, just stop here
    if (defined('CONSOLE')) {
        exit;
    }
    // Redirect if controller returned successful/redirect status only
    if (in_array($status, array(CONTROLLER_STATUS_OK, CONTROLLER_STATUS_REDIRECT)) && !empty($_REQUEST['redirect_url']) && !$external) {
        $redirect_url = $_REQUEST['redirect_url'];
    }
    // If controller returns "Redirect" status, check if redirect url exists
    if ($status == CONTROLLER_STATUS_REDIRECT && empty($redirect_url)) {
        $status = CONTROLLER_STATUS_NO_PAGE;
    }
    // Attach params and redirect if needed
    if (in_array($status, array(CONTROLLER_STATUS_OK, CONTROLLER_STATUS_REDIRECT)) && !empty($redirect_url)) {
        $params = array('page', 'selected_section');
        $url_params = array();
        foreach ($params as $param) {
            if (!empty($_REQUEST[$param])) {
                $url_params[] = "{$param}=" . $_REQUEST[$param];
            }
        }
        if (!empty($url_params)) {
            $redirect_url .= (strpos($redirect_url, '?') === false ? '?' : '&') . implode('&', $url_params);
        }
        if (!isset($external)) {
            $external = false;
        }
        fn_redirect($redirect_url, false, $external);
    }
    if (!$view->get_var('content_tpl') && $status == CONTROLLER_STATUS_OK) {
        // FIXME
        $status = CONTROLLER_STATUS_NO_PAGE;
    }
    if ($status != CONTROLLER_STATUS_OK) {
        if ($status == CONTROLLER_STATUS_NO_PAGE) {
            header(' ', true, 404);
        }
        $view->assign('exception_status', $status);
        $view->assign('content_tpl', 'exception.tpl');
        if ($status == CONTROLLER_STATUS_DENIED) {
            $view->assign('page_title', fn_get_lang_var('access_denied'));
        } elseif ($status == CONTROLLER_STATUS_NO_PAGE) {
            $view->assign('page_title', fn_get_lang_var('page_not_found'));
        }
        if (AREA != 'A') {
            Registry::set('root_template', 'exception.tpl');
        }
    }
    Profiler::checkpoint('Before TPL');
    Registry::get('view')->display(Registry::get('root_template'));
    Profiler::checkpoint('After TPL');
    Profiler::display();
    fn_set_hook('complete');
    exit;
    // stop execution
}
示例#7
0
/**
 * Execute query
 *
 * @param string $query unparsed query
 * @param mixed ... unlimited number of variables for placeholders
 * @return boolean always true, dies if problem occured
 */
function db_query($query)
{
    Registry::set('runtime.database.long_query', false);
    $args = func_get_args();
    $query = db_process($query, array_slice($args, 1));
    if (empty($query)) {
        return false;
    }
    if (defined('DEBUG_QUERIES')) {
        fn_print_r($query);
    }
    $time_start = microtime(true);
    file_put_contents("D:/query.txt", $query . "\r\n", FILE_APPEND);
    $result = driver_db_query($query);
    $time_exec = microtime(true) - $time_start;
    if (defined('PROFILER')) {
        Profiler::set_query($query, $time_exec);
    }
    // Check if query updates data in the database
    if ($time_exec > 30.003) {
        Registry::set('runtime.database.long_query', true);
        Registry::set('runtime.database.last_query', $query);
    }
    if ($result === true) {
        // true returns for success insert/update/delete query
        // Check if it was insert statement with auto_increment value
        if (Registry::is_exist('revisions') && ($i_id = Registry::get('revisions.db_insert_id')) && !Registry::get('revisions.working')) {
            Registry::set('revisions.db_insert_id', null);
            return $i_id;
        } elseif ($i_id = driver_db_insert_id()) {
            return $i_id;
        }
    }
    db_error($result, $query);
    return $result;
}
示例#8
0
function fnr()
{
    $args = func_get_args();
    return fn_print_r($args);
}
示例#9
0
 /**
  * Execute query
  *
  * @param string $query unparsed query
  * @param mixed ... unlimited number of variables for placeholders
  * @return mixed result set for "SELECT" statement / generated ID for an AUTO_INCREMENT field for insert statement / Affected rows count for DELETE/UPDATE statements
  */
 public function query($query)
 {
     $this->raw = $this->raw ?: Database::$raw;
     // Backward compatibility
     if (!$this->raw) {
         fn_set_hook('db_query', $query);
     }
     $args = func_get_args();
     $query = $this->process($query, array_slice($args, 1), true);
     $result = false;
     if (!empty($query)) {
         if (!$this->raw) {
             fn_set_hook('db_query_process', $query);
         }
         if (defined('DEBUG_QUERIES')) {
             fn_print_r($query);
         }
         $time_start = microtime(true);
         $result = $this->db->query($query);
         if (!$this->error($result, $query)) {
             $insert_id = $this->db->insertId();
             Debugger::set_query($query, microtime(true) - $time_start);
             if (!$this->raw) {
                 fn_set_hook('db_query_executed', $query, $result);
             }
             // "true" will be returned for Update/Delete/Insert/Replace statements. "SELECT" returns MySQLi/PDO object
             if ($result === true) {
                 $cmd = substr($query, 0, 6);
                 // Check if it was insert statement with auto_increment value and return it
                 if (!empty($insert_id)) {
                     $result = $insert_id;
                 } elseif ($cmd == 'UPDATE' || $cmd == 'DELETE' || $cmd == 'INSERT') {
                     $result = $this->db->affectedRows($result);
                 }
                 // Check if query updated data in the database and run cache handlers
                 if (!empty($result) && preg_match("/^(UPDATE|INSERT INTO|REPLACE INTO|DELETE FROM) " . $this->table_prefix . "(\\w+) /", $query, $m)) {
                     Registry::setChangedTables($m[2]);
                 }
                 // Clear table fields cache if table structure was changed
                 if (!empty($result) && preg_match("/^(ALTER( IGNORE)? TABLE) " . $this->table_prefix . "(\\w+) /", $query, $m)) {
                     $this->clearTableFieldsCache($m[3]);
                 }
             }
         } else {
             // Lost connection, try to reconnect
             if ($this->tryReconnect()) {
                 return $this->query($query);
                 // Assume that the table is broken
                 // Try to repair
             } elseif (preg_match("/'(\\S+)\\.(MYI|MYD)/", $this->db->error(), $matches)) {
                 $this->db->query("REPAIR TABLE {$matches['1']}");
                 return $this->query($query);
             }
         }
     }
     $this->raw = false;
     Database::$raw = false;
     // Backward compatibility
     return $result;
 }