function mediashare_upgrade_to_2_2_0() { $columns = array_keys(DBUtil::metaColumns('mediashare_mediastore', true)); if (in_array('MSS_DATA', $columns) && !DBUtil::dropColumn('mediashare_mediastore', 'mss_data')) { return false; } if (!mediashareCreateMediaDB()) { return false; } return true; }
/** * migrate old local categories to the categories module */ private function _migratecategories() { // load the admin language file // pull all data from the old table $prefix = System::getVar('prefix'); $sql = "SELECT pn_secname, pn_image, pn_secid FROM {$prefix}_sections"; $result = DBUtil::executeSQL($sql); $categories = array(); for (; !$result->EOF; $result->MoveNext()) { $categories[] = $result->fields; } // get the language file $lang = ZLanguage::getLanguageCode(); // create root category and entry in the categories registry $this->_createdefaultcategory('/__SYSTEM__/Modules/Pages'); // get the category path for which we're going to insert our upgraded categories $rootcat = CategoryUtil::getCategoryByPath('/__SYSTEM__/Modules/Pages'); // migrate our categories $categorymap = array(); foreach ($categories as $category) { $cat = new Categories_DBObject_Category (); $cat->setDataField('parent_id', $rootcat['id']); $cat->setDataField('name', $category[0]); $cat->setDataField('display_name', array($lang => $category[0])); $cat->setDataField('display_desc', array($lang => $category[0])); $cat->setDataField('data1', $category[1]); if (!$cat->validate('admin')) { return false; } $cat->insert(); $cat->update(); $categorymap[$category[2]] = $cat->getDataField('id'); } // migrate page category assignments $sql = "SELECT pn_pageid, pn_secid FROM {$prefix}_pages"; $result = DBUtil::executeSQL($sql); $pages = array(); for (; !$result->EOF; $result->MoveNext()) { $pages[] = array('pageid' => $result->fields[0], '__CATEGORIES__' => array('Main' => $categorymap[$result->fields[1]]), '__META__' => array('module' => 'Pages')); } foreach ($pages as $page) { if (!DBUtil::updateObject($page, 'pages', '', 'pageid')) { return LogUtil::registerError($this->__('Error! Update attempt failed.')); } } // drop old table DBUtil::dropTable('sections'); // finally drop the secid column DBUtil::dropColumn('pages', 'pn_secid'); return true; }
/** * Migrate from version 1.13 to 2.2.0 * * @param string $oldversion The old version from which this upgrade is being processed. * * @return bool True on success; otherwise false. */ public function upgrade113XTablesTo220Tables($oldversion) { if (!DBUtil::changeTable('users_temp')) { return false; } // Get the dbinfo for the new version ModUtil::dbInfoLoad('Users', 'Users'); $nowUTC = new DateTime(null, new DateTimeZone('UTC')); $nowUTCStr = $nowUTC->format(Users_Constant::DATETIME_FORMAT); $serviceManager = ServiceUtil::getManager(); $dbinfoSystem = $serviceManager['dbtables']; $dbinfo113X = Users_tables('1.13'); $dbinfo220 = Users_tables('2.2.0'); $usersOldFields = array( 'user_theme', 'user_viewemail', 'storynum', 'counter', 'hash_method', 'validfrom', 'validuntil', ); $usersOldFieldsDB = array( $dbinfo113X['users_column']['user_theme'], $dbinfo113X['users_column']['user_viewemail'], $dbinfo113X['users_column']['storynum'], $dbinfo113X['users_column']['counter'], $dbinfo113X['users_column']['hash_method'], $dbinfo113X['users_column']['validfrom'], $dbinfo113X['users_column']['validuntil'] ); // Upgrade the tables // Update the users table with new and altered fields. No fields are removed at this point, and no fields // are getting a new data type that is incompatible, so no need to save anything off first. // Also, create the users_verifychg tables at this point. // Merge the global dbtables with the new field information. $tables['users_column'] = $dbinfo220['users_column']; $tables['users_column_def'] = $dbinfo220['users_column_def']; $tables['users_verifychg'] = $dbinfo220['users_verifychg']; $tables['users_verifychg_column'] = $dbinfo220['users_verifychg_column']; $tables['users_verifychg_column_def'] = $dbinfo220['users_verifychg_column_def']; $serviceManager['dbtables'] = array_merge($dbinfoSystem, $tables); // Now change the tables if (!DBUtil::changeTable('users')) { return false; } if (!DBUtil::createTable('users_verifychg')) { return false; } // First users_temp pending email verification records to users_verifychg. $tempColumn = $dbinfo113X['users_temp_column']; $verifyColumn = $dbinfo220['users_verifychg_column']; $usersColumn = $dbinfo220['users_column']; $legalModInfo = ModUtil::getInfoFromName('Legal'); if (($legalModInfo['state'] == ModUtil::STATE_ACTIVE) || ($legalModInfo['state'] == ModUtil::STATE_UPGRADED)) { $legalModuleActive = true; $termsOfUseActive = ModUtil::getVar('Legal', 'termsofuse', false); $privacyPolicyActive = ModUtil::getVar('Legal', 'privacypolicy', false); $agePolicyActive = ($this->getVar('minage', 0) > 0); } else { $legalModuleActive = false; } // Next, users table conversion // We need to convert some information over from the old users table fields, so merge the old field list into // the new one. The order of array_merge parameters is important here! $tables = array('users_column' => array_merge($dbinfo113X['users_column'], $dbinfo220['users_column'])); $serviceManager['dbtables'] = array_merge($dbinfoSystem, $tables); // Do the conversion in PHP we use mb_strtolower, and even if MySQL had an equivalent, there is // no guarantee that another supported DB platform would. $limitNumRows = 100; $limitOffset = 0; $updated = true; $userCount = DBUtil::selectObjectCount('users'); while ($limitOffset < $userCount) { $userArray = DBUtil::selectObjectArray('users', "{$usersColumn['uid']} != 1", '', $limitOffset, $limitNumRows, '', null, null, array('uid', 'uname', 'email', 'pass', 'hash_method', 'user_regdate', 'lastlogin', 'approved_by', 'approved_date')); if (!empty($userArray) && is_array($userArray)) { foreach ($userArray as $key => $userObj) { // force user names and emails to lower case $userArray[$key]['uname'] = mb_strtolower($userArray[$key]['uname']); $userArray[$key]['email'] = mb_strtolower($userArray[$key]['email']); if ($userArray[$key]['user_regdate'] == '1970-01-01 00:00:00') { $userArray[$key]['user_regdate'] = $nowUTCStr; $userArray[$key]['approved_date'] = $nowUTCStr; } else { $userArray[$key]['approved_date'] = $userArray[$key]['user_regdate']; } $userArray[$key]['approved_by'] = 2; // merge hash method for salted passwords, leave salt blank if (!empty($userArray[$key]['pass']) && (strpos($userArray[$key]['pass'], '$$') === false)) { $userArray[$key]['pass'] = (isset($userArray[$key]['hash_method']) ? $userArray[$key]['hash_method'] : '1') . '$$' . $userArray[$key]['pass']; } // Save some disappearing fields as attributes, just in case someone actually used them for // something. But don't overwrite if there already if (!isset($userArray[$key]['__ATTRIBUTES__']) || !is_array($userArray[$key]['__ATTRIBUTES__'])) { $userArray[$key]['__ATTRIBUTES__'] = array(); } foreach ($usersOldFields as $fieldName) { if (($fieldName != 'hash_method') && isset($userArray[$key][$fieldName]) && !empty($userArray[$key][$fieldName]) && !isset($userArray[$key]['__ATTRIBUTES__'][$fieldName])) { $userArray[$key]['__ATTRIBUTES__'][$fieldName] = $userArray[$key][$fieldName]; } } if ($legalModuleActive && ($userArray[$key]['uid'] > 2)) { $userRegDateTime = new DateTime($userArray[$key]['user_regdate'], new DateTimeZone('UTC')); $policyDateTimeStr = $userRegDateTime->format(DATE_ISO8601); if ($termsOfUseActive) { $userArray[$key]['__ATTRIBUTES__']['_Legal_termsOfUseAccepted'] = $policyDateTimeStr; } if ($privacyPolicyActive) { $userArray[$key]['__ATTRIBUTES__']['_Legal_privacyPolicyAccepted'] = $policyDateTimeStr; } if ($agePolicyActive) { $userArray[$key]['__ATTRIBUTES__']['_Legal_agePolicyConfirmed'] = $policyDateTimeStr; } } } } if (!DBUtil::updateObjectArray($userArray, 'users', 'uid', false)) { $updated = false; break; } $limitOffset += $limitNumRows; } if (!$updated) { return false; } $obaColumn = $dbinfoSystem['objectdata_attributes_column']; $limitNumRows = 100; $limitOffset = 0; $updated = true; $userCount = DBUtil::selectObjectCount('users_temp'); // Pass through the users_temp table in chunks of 100 // * ensure unames and email addresses are lower case, while ($limitOffset < $userCount) { $userTempArray = DBUtil::selectObjectArray('users_temp', '', '', $limitOffset, $limitNumRows, '', null, null, array('tid', 'type', 'uname', 'email', 'pass', 'hash_method', 'dynamics', 'comment')); $userArray = array(); if (!empty($userTempArray) && is_array($userTempArray)) { foreach ($userTempArray as $key => $userTempOpj) { // type == 1: User registration pending approval (moderation) if ($userTempArray[$key]['type'] == 1) { $userObj = array(); // Ensure uname and email are lower case $userObj['uname'] = mb_strtolower($userTempArray[$key]['uname']); $userObj['email'] = mb_strtolower($userTempArray[$key]['email']); // Convert pass to salted pass with embedded hash method, leave salt blank $userObj['pass'] = $userTempArray[$key]['hash_method'] . '$$' . $userTempArray[$key]['pass']; $userObj['approved_by'] = 0; $userObj['activated'] = Users_Constant::ACTIVATED_PENDING_REG; if (!empty($userTempArray[$key]['dynamics'])) { $userObj['__ATTRIBUTES__'] = unserialize($userTempArray[$key]['dynamics']); } else { $userObj['__ATTRIBUTES__'] = array(); } if (isset($userObj['dynamics']) && !empty($userObj['dynamics'])) { if (DataUtil::is_serialized($userObj['dynamics'])) { $dynamics = @unserialize($userObj['dynamics']); if (!empty($dynamics) && is_array($dynamics)) { foreach ($dynamics as $key => $value) { $userObj['__ATTRIBUTES__'][$key] = $value; } } } } $userObj['__ATTRIBUTES__']['_Users_isVerified'] = 0; if ($legalModuleActive) { $userRegDateTime = new DateTime($userArray[$key]['user_regdate'], new DateTimeZone('UTC')); $policyDateTimeStr = $userRegDateTime->format(DATE_ISO8601); if ($termsOfUseActive) { $userObj['__ATTRIBUTES__']['_Legal_termsOfUseAccepted'] = $policyDateTimeStr; } if ($privacyPolicyActive) { $userObj['__ATTRIBUTES__']['_Legal_privacyPolicyAccepted'] = $policyDateTimeStr; } if ($agePolicyActive) { $userObj['__ATTRIBUTES__']['_Legal_agePolicyConfirmed'] = $policyDateTimeStr; } } $userArray[] = $userObj; } else { throw new Zikula_Exception_Fatal($this->__f('Unknown users_temp record type: %1$s', array($userTempArray[$key]['type']))); } } } if (!DBUtil::insertObjectArray($userArray, 'users', 'uid', false)) { $updated = false; break; } $limitOffset += $limitNumRows; } if (!$updated) { return false; } // Done upgrading. Let's lose some old fields and tables we no longer need. DBUtil::dropColumn('users', $usersOldFieldsDB); DBUtil::dropTable('users_temp'); // Reset the system tables to the new table definitons, so the rest of the // system upgrade goes smoothly. $dbinfoSystem = $serviceManager['dbtables']; foreach ($dbinfo113X as $key => $value) { unset($dbinfoSystem[$key]); } foreach ($dbinfo220 as $key => $value) { $dbinfoSystem[$key] = $value; } $serviceManager['dbtables'] = $dbinfoSystem; // Update users table for data type change of activated field. if (!DBUtil::changeTable('users')) { return false; } return true; }
/** * migrate old local categories to the categories module */ private function _news_migratecategories() { // load the admin language file // pull all data from the old tables $tables = DBUtil::getTables(); $columns = $tables['news_column']; $sql = "SELECT $columns[catid], $columns[title] FROM {$tables[stories_cat]}"; $result = DBUtil::executeSQL($sql); $categories = array(array(0, 'Articles')); for (; !$result->EOF; $result->MoveNext()) { $categories[] = $result->fields; } $sql = "SELECT $columns[topicid], $columns[topicname], $columns[topicimage], $columns[topictext] FROM {$tables[topics]}"; $result = DBUtil::executeSQL($sql); $topics = array(); for (; !$result->EOF; $result->MoveNext()) { $topics[] = $result->fields; } // get the language file $lang = ZLanguage::getLanguageCode(); // create the Main category and entry in the categories registry $this->_createdefaultcategory('/__SYSTEM__/Modules/News'); // create the Topics category and entry in the categories registry $this->_createtopicscategory('/__SYSTEM__/Modules/Topics'); // get the category path for which we're going to insert our upgraded News categories $rootcat = CategoryUtil::getCategoryByPath('/__SYSTEM__/Modules/News'); // migrate our main categories $categorymap = array(); foreach ($categories as $category) { $cat = new Categories_DBObject_Category(); $cat->setDataField('parent_id', $rootcat['id']); $cat->setDataField('name', $category[1]); $cat->setDataField('display_name', array($lang => $category[1])); $cat->setDataField('display_desc', array($lang => $category[1])); if (!$cat->validate('admin')) { return false; } $cat->insert(); $cat->update(); $categorymap[$category[0]] = $cat->getDataField('id'); } // get the category path for which we're going to insert our upgraded Topics categories $rootcat = CategoryUtil::getCategoryByPath('/__SYSTEM__/Modules/Topics'); // migrate our topic categories $topicsmap = array(); foreach ($topics as $topic) { $cat = new Categories_DBObject_Category(); $data = $cat->getData(); $data['parent_id'] = $rootcat['id']; $data['name'] = $topic[1]; $data['value'] = -1; $data['display_name'] = array($lang => $topic[3]); $data['display_desc'] = array($lang => $topic[3]); $data['__ATTRIBUTES__']['topic_image'] = $topic[2]; $cat->setData ($data); if (!$cat->validate('admin')) { return false; } $cat->insert(); $cat->update(); $topicsmap[$topic[0]] = $cat->getDataField('id'); } // After an upgrade we want the legacy topic template variables to point to the Topic property $this->setVar('topicproperty', 'Topic'); // migrate page category assignments $sql = "SELECT $columns[sid], $columns[catid], $columns[topic] FROM {$tables[stories]}"; $result = DBUtil::executeSQL($sql); $pages = array(); for (; !$result->EOF; $result->MoveNext()) { $pages[] = array('sid' => $result->fields[0], '__CATEGORIES__' => array( 'Main' => $categorymap[$result->fields[1]], 'Topic' => $topicsmap[$result->fields[2]]), '__META__' => array('module' => 'News')); } foreach ($pages as $page) { if (!DBUtil::updateObject($page, 'stories', '', 'sid')) { return LogUtil::registerError($this->__('Error! Could not update the article categories.')); } } // drop old table DBUtil::dropTable('stories_cat'); // we don't drop the topics table - this is the job of the topics module // finally drop the secid column DBUtil::dropColumn('stories', $columns['catid']); DBUtil::dropColumn('stories', $columns['topic']); return true; }