/** * Retrieve current MYSQL process list * */ protected function fetch_query_status() { $xml = new vB_AJAX_XML_Builder($this->registry, 'text/xml', vB_Template_Runtime::fetchStyleVar('charset')); $xml->add_group('processes'); $xml->add_tag('query_status', $this->phrase['core']['query_status_title']); $processes = $this->db->query_read("\n\t\t\tSHOW FULL PROCESSLIST\n\t\t"); $found = false; while ($process = $this->db->fetch_array($processes)) { if ($process['db'] == $this->registry->config['Database']['dbname'] and $process['User'] == $this->registry->config['MasterServer']['username'] and $process['Info'] != 'SHOW FULL PROCESSLIST' and $process['Command'] == 'Query' and preg_match('/^(\\s+)?### vBulletin Database Alter ###/s', $process['Info'])) { $process['Info'] = preg_replace("/^(\\s+)?### vBulletin Database Alter ###/s", "", $process['Info']); $found = true; $totalseconds = intval($process['Time']); $hours = floor($seconds / 3600); $totalseconds -= $hours * 3600; $minutes = floor($totalseconds / 60); $totalseconds -= $minutes * 60; $seconds = $totalseconds; $xml->add_tag('process', construct_phrase($this->phrase['core']['process_x_y_z'], str_pad($hours, 2, "0", STR_PAD_LEFT), str_pad($minutes, 2, "0", STR_PAD_LEFT), str_pad($seconds, 2, "0", STR_PAD_LEFT), htmlspecialchars_uni($process['State']), htmlspecialchars_uni($process['Info']))); } } if (!$found) { $xml->add_tag('noprocess', $this->phrase['core']['no_processes_found']); } $xml->close_group('processes'); $xml->print_xml(); }
/** * This function iterate over a large result set, only processing records in * batches to keep the memory usage reasonable. After a batch has been collected, * a reference to this object is passed to a callback function. That function * will update any columns necessary. This function will the save the changes * and start on a new batch. * * Callback function first argument must be a reference to a vB_DataManager_Multiple object. * Additional arguments should be passed to this function in an array. * * @param string|resource A query result resource or a string containing the query to execute * @param callback The function to call to make changes to the records * @param integer Number of records to process in a batch * @param array Any additional arguments to pass to the callback function */ function batch_iterate($records, $callback, $batch_size = 500, $args = array()) { if (is_string($records)) { $records = $this->dbobject->query_read($records); } $intargs = array(&$this); foreach (array_keys($args) as $argkey) { $intargs[] =& $args["{$argkey}"]; } $counter = 0; while ($record = $this->dbobject->fetch_array($records)) { // this if is seperate because otherwise, if we had // count($records) % $batch_size == 0, $this->children would be empty // so we couldn't call post_save_once(). if ($counter % $batch_size == 0) { $this->reset(); } $this->add_existing($record); $counter++; if ($counter % $batch_size == 0) { call_user_func_array($callback, $intargs); $this->save(true, false); } } if ($this->children and $counter % $batch_size != 0) { call_user_func_array($callback, $intargs); $this->save(true, false); } $master =& $this->children[reset($this->primary_ids)]; if ($master) { $master->post_save_once(); } }
/** * Everything that comes after the install - no reason to break this up into chunks at present * */ public function post_install() { // dependencies checked, install code run. Now clear out the old product info; // settings should be retained in memory already delete_product($this->productinfo['productid'], false, true); $codes =& $this->productobj['codes']['code']; if (!isset($codes[0])) { $codes = array($codes); } if (is_array($codes)) { // we've now run all the codes, if execution is still going // then it's going to complete fully, so insert the codes foreach ($codes as $code) { /* insert query */ $this->db->query_write("\n\t\t\t\t\tINSERT INTO " . TABLE_PREFIX . "productcode\n\t\t\t\t\t\t(productid, version, installcode, uninstallcode)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t('" . $this->db->escape_string($this->productinfo['productid']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($code['version']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($code['installcode']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($code['uninstallcode']) . "')\n\t\t\t\t"); } } if (is_array($this->productobj['dependencies']['dependency'])) { $dependencies =& $this->productobj['dependencies']['dependency']; if (!isset($dependencies[0])) { $dependencies = array($dependencies); } // dependencies met, codes run -- now we can insert the dependencies into the DB foreach ($dependencies as $dependency) { /* insert query */ $this->db->query_write("\n\t\t\t\t\tINSERT INTO " . TABLE_PREFIX . "productdependency\n\t\t\t\t\t\t(productid, dependencytype, parentproductid, minversion, maxversion)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t('" . $this->db->escape_string($this->productinfo['productid']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($dependency['dependencytype']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($dependency['parentproductid']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($dependency['minversion']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($dependency['maxversion']) . "')\n\t\t\t\t"); } } /* insert query */ $this->db->query_write("\n\t\t\tINSERT INTO " . TABLE_PREFIX . "product\n\t\t\t\t(productid, title, description, version, active, url, versioncheckurl)\n\t\t\tVALUES\n\t\t\t\t('" . $this->db->escape_string($this->productinfo['productid']) . "',\n\t\t\t\t'" . $this->db->escape_string($this->productinfo['title']) . "',\n\t\t\t\t'" . $this->db->escape_string($this->productinfo['description']) . "',\n\t\t\t\t'" . $this->db->escape_string($this->productinfo['version']) . "',\n\t\t\t\t" . intval($this->active) . ",\n\t\t\t\t'" . $this->db->escape_string($this->productinfo['url']) . "',\n\t\t\t\t'" . $this->db->escape_string($this->productinfo['versioncheckurl']) . "')\n\t\t"); // ############## import templates if (!empty($this->productobj['templates']['template']) and is_array($this->productobj['templates']['template'])) { $querybits = array(); $querytemplates = 0; $templates =& $this->productobj['templates']['template']; if (!isset($templates[0])) { $templates = array($templates); } foreach ($templates as $template) { $title = $this->db->escape_string($template['name']); $template['template'] = $this->db->escape_string($template['value']); $template['username'] = $this->db->escape_string($template['username']); $template['templatetype'] = $this->db->escape_string($template['templatetype']); $template['date'] = intval($template['date']); if ($template['templatetype'] != 'template') { // template is a special template $querybits[] = "(-1, '{$template['templatetype']}', '{$title}', '{$template['template']}', '', {$template['date']}, '{$template['username']}', '" . $this->db->escape_string($template['version']) . "', '" . $this->db->escape_string($this->productinfo['productid']) . "')"; } else { // template is a standard template $querybits[] = "(-1, '{$template['templatetype']}', '{$title}', '" . $this->db->escape_string(compile_template($template['value'])) . "', '{$template['template']}', {$template['date']}, '{$template['username']}', '" . $this->db->escape_string($template['version']) . "', '" . $this->db->escape_string($this->productinfo['productid']) . "')"; } if (++$querytemplates % 20 == 0) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "template\n\t\t\t\t\t\t\t(styleid, templatetype, title, template, template_un, dateline, username, version, product)\n\t\t\t\t\t\tVALUES\n\t\t\t\t\t\t\t" . implode(',', $querybits) . "\n\t\t\t\t\t"); $querybits = array(); } if (!defined('SUPPRESS_KEEPALIVE_ECHO')) { echo ' '; vbflush(); } } // insert any remaining templates if (!empty($querybits)) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "template\n\t\t\t\t\t\t(styleid, templatetype, title, template, template_un, dateline, username, version, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t" . implode(',', $querybits) . "\n\t\t\t\t"); } unset($querybits); $rebuild['templates'] = true; } if (is_array($this->productobj['templates_mobile']['template'])) { $querybits = array(); $querytemplates = 0; $templates =& $this->productobj['templates_mobile']['template']; if (!isset($templates[0])) { $templates = array($templates); } foreach ($templates as $template) { $title = $this->db->escape_string($template['name']); $template['template'] = $this->db->escape_string($template['value']); $template['username'] = $this->db->escape_string($template['username']); $template['templatetype'] = $this->db->escape_string($template['templatetype']); $template['date'] = intval($template['date']); if ($template['templatetype'] != 'template') { // template is a special template $querybits[] = "(-2, '{$template['templatetype']}', '{$title}', '{$template['template']}', '', {$template['date']}, '{$template['username']}', '" . $this->db->escape_string($template['version']) . "', '" . $this->db->escape_string($this->productinfo['productid']) . "')"; } else { // template is a standard template $querybits[] = "(-2, '{$template['templatetype']}', '{$title}', '" . $this->db->escape_string(compile_template($template['value'])) . "', '{$template['template']}', {$template['date']}, '{$template['username']}', '" . $this->db->escape_string($template['version']) . "', '" . $this->db->escape_string($this->productinfo['productid']) . "')"; } if (++$querytemplates % 20 == 0) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "template\n\t\t\t\t\t\t\t(styleid, templatetype, title, template, template_un, dateline, username, version, product)\n\t\t\t\t\t\tVALUES\n\t\t\t\t\t\t\t" . implode(',', $querybits) . "\n\t\t\t\t\t"); $querybits = array(); } if (!defined('SUPPRESS_KEEPALIVE_ECHO')) { echo ' '; vbflush(); } } // insert any remaining templates if (!empty($querybits)) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "template\n\t\t\t\t\t\t(styleid, templatetype, title, template, template_un, dateline, username, version, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t" . implode(',', $querybits) . "\n\t\t\t\t"); } unset($querybits); $rebuild['templates'] = true; } // ############## import stylevars if (!empty($this->productobj['stylevardfns']['stylevargroup']) and is_array($this->productobj['stylevardfns']['stylevargroup'])) { xml_import_stylevar_definitions($this->productobj['stylevardfns'], $this->productinfo['productid'], -1); } if (!empty($this->productobj['stylevars']['stylevar']) and is_array($this->productobj['stylevars']['stylevar'])) { xml_import_stylevars($this->productobj['stylevars'], -1); } if (is_array($this->productobj['stylevardfns_mobile']['stylevargroup'])) { xml_import_stylevar_definitions($this->productobj['stylevardfns_mobile'], $this->productinfo['productid'], -2); } if (is_array($this->productobj['stylevars_mobile']['stylevar'])) { xml_import_stylevars($this->productobj['stylevars_mobile'], -2); } // ############## import hooks/plugins if (is_array($this->productobj['plugins']['plugin'])) { $plugins =& $this->productobj['plugins']['plugin']; if (!isset($plugins[0])) { $plugins = array($plugins); } foreach ($plugins as $plugin) { $plugin['product'] = $this->productinfo['productid']; unset($plugin['devkey']); $this->db->query_write(fetch_query_sql($plugin, 'plugin')); } $rebuild['plugins'] = true; } // ############## import phrases if (is_array($this->productobj['phrases']['phrasetype'])) { require_once DIR . '/includes/adminfunctions_language.php'; $master_phrasetypes = array(); $master_phrasefields = array(); foreach (fetch_phrasetypes_array(false) as $phrasetype) { $master_phrasefields["{$phrasetype['fieldname']}"] = true; } $phrasetypes =& $this->productobj['phrases']['phrasetype']; if (!isset($phrasetypes[0])) { $phrasetypes = array($phrasetypes); } foreach ($phrasetypes as $phrasetype) { if (empty($phrasetype['phrase'])) { continue; } if ($phrasetype['fieldname'] == '' or !preg_match('#^[a-z0-9_]+$#i', $phrasetype['fieldname'])) { continue; } $fieldname = $master_phrasefields["{$phrasetype['fieldname']}"]; if (!$fieldname) { $this->db->query_write("\n\t\t\t\t\t\tINSERT IGNORE INTO " . TABLE_PREFIX . "phrasetype\n\t\t\t\t\t\t\t(fieldname, title, editrows, product)\n\t\t\t\t\t\tVALUES\n\t\t\t\t\t\t\t('" . $this->db->escape_string($phrasetype['fieldname']) . "',\n\t\t\t\t\t\t\t'" . $this->db->escape_string($phrasetype['name']) . "',\n\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "')\n\t\t\t\t\t"); // need to add the column to the language table as well require_once DIR . '/includes/class_dbalter.php'; $this->db_alter = new vB_Database_Alter_MySQL($this->db); if ($this->db_alter->fetch_table_info('language')) { $this->db_alter->add_field(array('name' => "phrasegroup_{$phrasetype['fieldname']}", 'type' => 'mediumtext')); } } $phrases =& $phrasetype['phrase']; if (!isset($phrases[0])) { $phrases = array($phrases); } $sql = array(); foreach ($phrases as $phrase) { $sql[] = "\n\t\t\t\t\t\t(-1,\n\t\t\t\t\t\t'" . $this->db->escape_string($phrasetype['fieldname']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($phrase['name']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($phrase['value']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($phrase['username']) . "',\n\t\t\t\t\t\t" . intval($phrase['date']) . ",\n\t\t\t\t\t\t'" . $this->db->escape_string($phrase['version']) . "')\n\t\t\t\t\t"; } /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "phrase\n\t\t\t\t\t\t(languageid, fieldname, varname, text, product, username, dateline, version)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t" . implode(',', $sql)); } $rebuild['phrases'] = true; } // ############## import settings if (is_array($this->productobj['options']['settinggroup'])) { $settinggroups =& $this->productobj['options']['settinggroup']; if (!isset($settinggroups[0])) { $settinggroups = array($settinggroups); } foreach ($settinggroups as $group) { if (empty($group['setting'])) { continue; } // create the setting group if it doesn't already exist /*insert query*/ $this->db->query_write("\n\t\t\t\t\tINSERT IGNORE INTO " . TABLE_PREFIX . "settinggroup\n\t\t\t\t\t\t(grouptitle, displayorder, volatile, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t('" . $this->db->escape_string($group['name']) . "',\n\t\t\t\t\t\t" . intval($group['displayorder']) . ",\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "')\n\t\t\t\t"); $settings =& $group['setting']; if (!isset($settings[0])) { $settings = array($settings); } $setting_bits = array(); foreach ($settings as $setting) { if (isset($this->registry->options["{$setting['varname']}"])) { $newvalue = $this->registry->options["{$setting['varname']}"]; } else { $newvalue = $setting['defaultvalue']; } $setting_bits[] = "(\n\t\t\t\t\t\t'" . $this->db->escape_string($setting['varname']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($group['name']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string(trim($newvalue)) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string(trim($setting['defaultvalue'])) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string(trim($setting['datatype'])) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($setting['optioncode']) . "',\n\t\t\t\t\t\t" . intval($setting['displayorder']) . ",\n\t\t\t\t\t\t" . intval($setting['advanced']) . ",\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'" . $this->db->escape_string($setting['validationcode']) . "',\n\t\t\t\t\t\t" . intval($setting['blacklist']) . ",\n\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "'\n\t)"; } /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "setting\n\t\t\t\t\t\t(varname, grouptitle, value, defaultvalue, datatype, optioncode, displayorder, advanced, volatile, validationcode, blacklist, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t" . implode(",\n\t", $setting_bits)); } $rebuild['options'] = true; } // ############## import admin help if (!empty($this->productobj['helptopics']['helpscript']) and is_array($this->productobj['helptopics']['helpscript'])) { $help_scripts =& $this->productobj['helptopics']['helpscript']; if (!isset($help_scripts[0])) { $help_scripts = array($help_scripts); } foreach ($help_scripts as $help_script) { // Deal with single entry if (!is_array($help_script['helptopic'][0])) { $help_script['helptopic'] = array($help_script['helptopic']); } $help_sql = array(); foreach ($help_script['helptopic'] as $topic) { $helpsql[] = "\n\t\t\t\t\t\t('" . $this->db->escape_string($help_script['name']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($topic['act']) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($topic['opt']) . "',\n\t\t\t\t\t\t" . intval($topic['disp']) . ",\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "')\n\t\t\t\t\t"; } if (!empty($helpsql)) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "adminhelp\n\t\t\t\t\t\t\t(script, action, optionname, displayorder, volatile, product)\n\t\t\t\t\t\tVALUES\n\t\t\t\t\t\t\t" . implode(",\n\t", $helpsql)); } } } // ############## import cron if (!empty($this->productobj['cronentries']['cron']) and is_array($this->productobj['cronentries']['cron'])) { require_once DIR . '/includes/functions_cron.php'; $cron_entries =& $this->productobj['cronentries']['cron']; if (!isset($cron_entries[0])) { $cron_entries = array($cron_entries); } foreach ($cron_entries as $cron) { $cron['varname'] = preg_replace('#[^a-z0-9_]#i', '', $cron['varname']); if (!$cron['varname']) { continue; } $cron['active'] = $cron['active'] ? 1 : 0; $cron['loglevel'] = $cron['loglevel'] ? 1 : 0; $scheduling = $cron['scheduling']; $scheduling['weekday'] = intval($scheduling['weekday']); $scheduling['day'] = intval($scheduling['day']); $scheduling['hour'] = intval($scheduling['hour']); $scheduling['minute'] = explode(',', preg_replace('#[^0-9,-]#i', '', $scheduling['minute'])); if (count($scheduling['minute']) == 0) { $scheduling['minute'] = array(0); } else { $scheduling['minute'] = array_map('intval', $scheduling['minute']); } /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "cron\n\t\t\t\t\t\t(weekday, day, hour, minute, filename, loglevel, active, varname, volatile, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t({$scheduling['weekday']},\n\t\t\t\t\t\t{$scheduling['day']},\n\t\t\t\t\t\t{$scheduling['hour']},\n\t\t\t\t\t\t'" . $this->db->escape_string(serialize($scheduling['minute'])) . "',\n\t\t\t\t\t\t'" . $this->db->escape_string($cron['filename']) . "',\n\t\t\t\t\t\t{$cron['loglevel']},\n\t\t\t\t\t\t{$cron['active']},\n\t\t\t\t\t\t'" . $this->db->escape_string($cron['varname']) . "',\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "')\n\t\t\t\t"); $cronid = $this->db->insert_id(); // replace either inserts, or deletes+inserts if ($cronid) { build_cron_item($cronid); } $rebuild['cron'] = true; } } // ############## import faq if (!empty($this->productobj['faqentries']['faq']) and is_array($this->productobj['faqentries']['faq'])) { $faq_entries =& $this->productobj['faqentries']['faq']; if (!isset($faq_entries[0])) { $faq_entries = array($faq_entries); } $sql = array(); foreach ($faq_entries as $faq) { $sql[] = "\n\t\t\t\t\t('" . $this->db->escape_string($faq['faqname']) . "',\n\t\t\t\t\t'" . $this->db->escape_string($faq['faqparent']) . "',\n\t\t\t\t\t" . intval($faq['displayorder']) . ",\n\t\t\t\t\t1,\n\t\t\t\t\t'" . $this->db->escape_string($this->productinfo['productid']) . "')\n\t\t\t\t"; } if ($sql) { /*insert query*/ $this->db->query_write("\n\t\t\t\t\tREPLACE INTO " . TABLE_PREFIX . "faq\n\t\t\t\t\t\t(faqname, faqparent, displayorder, volatile, product)\n\t\t\t\t\tVALUES\n\t\t\t\t\t\t" . implode(',', $sql) . "\n\t\t\t\t"); } } $this->productinfo['process'] = VB_AREA; $this->productinfo['username'] = '******' . VB_AREA; import_navigation($this->productobj, $this->productinfo); $products = fetch_product_list(true); // Check if the plugin system is disabled. If it is, enable it if this product isn't installed. if (!$this->registry->options['enablehooks'] and !$products[$this->productinfo['productid']]) { $this->db->query_write("\n\t\t\t\tUPDATE " . TABLE_PREFIX . "setting\n\t\t\t\tSET value = '1'\n\t\t\t\tWHERE varname = 'enablehooks'\n\t\t\t"); $rebuild['options'] = true; } // Now rebuild everything we need... if ($rebuild['plugins']) { vBulletinHook::build_datastore($this->db); if ($this->active) { $plugin_data = $this->db->query_read("\n\t\t\t\t\tSELECT *\n\t\t\t\t\tFROM " . TABLE_PREFIX . "datastore\n\t\t\t\t\tWHERE title IN ('pluginlist', 'pluginlistadmin')\n\t\t\t\t"); while ($plugin_info = $this->db->fetch_array($plugin_data)) { if ($plugin_info['title'] == 'pluginlist') { $this->registry->pluginlist = unserialize($plugin_info['data']); } else { if ($plugin_info['title'] == 'pluginlistadmin') { $this->registry->pluginlistadmin = unserialize($plugin_info['data']); } } } // enable any hooks -- this is mainly necessary for importing templates (template_safe_functions hook) if (!defined('DISABLE_HOOKS') and VB_AREA != 'Upgrade') { if (!empty($this->registry->pluginlistadmin) and is_array($this->registry->pluginlistadmin)) { $this->registry->pluginlist = array_merge($this->registry->pluginlist, $this->registry->pluginlistadmin); unset($this->registry->pluginlistadmin); } vBulletinHook::set_pluginlist($this->registry->pluginlist, $vbulletin->options['hookerrors']); } } } if ($rebuild['templates']) { if ($error = build_all_styles(0, 0, '', false, 'standard')) { return $error; } if ($error = build_all_styles(0, 0, '', false, 'mobile')) { return $error; } } if ($rebuild['phrases']) { require_once DIR . '/includes/adminfunctions_language.php'; build_language(); } if ($rebuild['options']) { build_options(); } if ($rebuild['cron']) { require_once DIR . '/includes/functions_cron.php'; build_cron_next_run(); } build_product_datastore(); build_activitystream_datastore(); // build bitfields to remove/add this products bitfields vB_Bitfield_Builder::save($this->db); // reload block types $blockmanager = vB_BlockManager::create($this->registry); $blockmanager->reloadBlockTypes(); print_dots_stop(); $this->productinfo['need_merge'] = ($rebuild['templates'] and $installed_version); return $this->productinfo; }
/** * Fetches the existing data for the selected user * * @return array Array of [selector][property] = value */ function fetch_existing() { $usercss_result = $this->dbobject->query_read("\n\t\t\tSELECT * FROM " . TABLE_PREFIX . "usercss\n\t\t\tWHERE userid = " . $this->userid . "\n\t\t\tORDER BY selector\n\t\t"); $existing = array(); while ($usercss = $this->dbobject->fetch_array($usercss_result)) { $existing["{$usercss['selector']}"]["{$usercss['property']}"] = $usercss['value']; } $this->dbobject->free_result($usercss_result); return $existing; }
public function NewPM(vB_DataManager_PM &$pmdm) { if ($this->vbulletin->options['dle_onoff'] && $this->vbulletin->options['dle_pm']) { $user_from = $pmdm->pmtext['fromusername']; $to_user = $pmdm->pmtext['touserarray']; $subj = $pmdm->pmtext['title']; $text = $pmdm->pmtext['message']; $send = "<b>Это сообщение было отправленно c форума следующим пользователям: </b>"; $text = $this->_parseBB($text); // $text = preg_replace('#<!--.*?-->#si', "", $text); if (DLE_CHARSET && DLE_CHARSET != $this->vbulletin->userinfo['lang_charset']) { $user_from = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $user_from); $to_user = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $to_user); $subj = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $subj); $text = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $text); // $send = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $send); } if (strtolower($this->vbulletin->userinfo['lang_charset']) != 'utf-8') { $send = iconv('utf-8', $this->vbulletin->userinfo['lang_charset'], $send); } $to_user = unserialize($to_user); $this->_db_connect(); $subj = $this->db->escape_string($subj); $text = $this->db->escape_string($text); $user_from = $this->db->escape_string($user_from); if (empty($to_user['cc'])) { if (!empty($to_user['bcc'])) { $to_user_a = $to_user['bcc']; } else { $this->_db_disconnect(); return; } } else { $to_user_a = $to_user['cc']; } $to_user_name = array(); foreach ($to_user_a as $user) { if (DLE_CHARSET && DLE_CHARSET != $this->vbulletin->userinfo['lang_charset']) { $user = iconv($this->vbulletin->userinfo['lang_charset'], DLE_CHARSET, $user); } $to_user_name[] = $this->db->escape_string($user); } $result_users = $this->db->query_read("SELECT user_id, name FROM " . USERPREFIX . "_users WHERE name IN('" . implode("','", $to_user_name) . "')"); if ($this->db->num_rows($result_users)) { $i = 0; $send_user_array = $users_id = array(); $values = ''; while ($value = $this->db->fetch_array($result_users)) { $users_id[] = $value['user_id']; if (in_array($value['user_id'], $send_user_array)) { continue; } if ($i != 0) { $send .= ", "; $values .= ", "; } $send .= "<a href=\"{$config['http_home_url']}index.php?subaction=userinfo&user={$value['name']}\" >{$value['name']}</a>"; $values .= "('{$subj}', '{$text}', '{$value['user_id']}', '{$user_from}', '{$pmdm->pmtext['dateline']}', 'no', 'inbox')"; $send_user_array[] = $value['user_id']; $i++; } $this->db->query_write("INSERT INTO " . USERPREFIX . "_pm (subj, text, user, user_from, date, pm_read, folder) VALUES {$values}"); $this->db->query_write("UPDATE " . USERPREFIX . "_users SET pm_all=pm_all+1, pm_unread=pm_unread+1 WHERE user_id IN('" . implode("','", $users_id) . "')"); if ($pmdm->info['savecopy']) { $user = $users_id[0]; if ($user) { if ($i > 1) { $text = $this->db->escape_string($send) . "<hr></br></br>" . $text; } $this->db->query_write("INSERT INTO " . USERPREFIX . "_pm (subj, text, user, user_from, date, pm_read, folder) values ('{$subj}', '{$text}', '{$user}', '{$user_from}', '{$pmdm->pmtext['dateline']}', 'yes', 'outbox')"); $this->db->query_write("UPDATE " . USERPREFIX . "_users SET pm_all=pm_all+1 where name='{$user_from}'"); } } } $this->_db_disconnect(); } }
/** * Fetches the existing data for the selected user * * @return array Array of [selector][property] = value */ function fetch_existing() { $usercss_result = $this->dbobject->query_read(" SELECT * FROM " . TABLE_PREFIX . "usercss WHERE userid = " . $this->userid . " ORDER BY selector "); $existing = array(); while ($usercss = $this->dbobject->fetch_array($usercss_result)) { $existing["$usercss[selector]"]["$usercss[property]"] = $usercss['value']; } $this->dbobject->free_result($usercss_result); return $existing; }
/** * Verify CSS dir can be written to * * @param int Styleid to check - -1 to check all * * @return boolean */ protected function verify_cssdir($styleid = -1) { if ($this->setuptype == 'install' or !$this->registry->options['storecssasfile']) { return true; } if ($styleid != -1) { if (!$this->verify_write_cssdir($styleid, 'ltr') or !$this->verify_write_cssdir($styleid, 'rtl')) { return false; } } $childsets = $this->db->query_read("\n\t\t\tSELECT styleid, title, parentlist\n\t\t\tFROM " . TABLE_PREFIX . "style\n\t\t\tWHERE parentid = {$styleid}\n\t\t"); while ($childset = $this->db->fetch_array($childsets)) { if (!$this->verify_cssdir($childset['styleid'])) { return false; } } return true; }
/** * Builds the priority array for an arbitrary content type * */ protected function set_priorities($contenttype) { $forum_priorities = $this->dbobject->query_read_slave("SELECT sourceid, prioritylevel FROM " . TABLE_PREFIX . "contentpriority WHERE contenttypeid = '{$contenttype}'"); if (!isset($this->custom_priority[$contenttype])) { $this->custom_priority[$contenttype] = array(); } while ($f_pri = $this->dbobject->fetch_array($forum_priorities)) { if (!isset($this->custom_priority[$contenttype][$f_pri['sourceid']])) { $this->custom_priority[$contenttype][$f_pri['sourceid']] = array(); } $this->custom_priority[$contenttype][$f_pri['sourceid']]['priority'] = $f_pri['prioritylevel']; } }