public function initialise($options) { // Get the options as a JObject for easier handling. $options = JArrayHelper::toObject($options, 'JObject'); // Load the back-end language files so that the DB error messages work $jlang = JFactory::getLanguage(); // Pre-load en-GB in case the chosen language files do not exist $jlang->load('joomla', JPATH_ADMINISTRATOR, 'en-GB', true); // Load the selected language $jlang->load('joomla', JPATH_ADMINISTRATOR, $options->language, true); // Ensure a database type was selected. if (empty($options->db_type)) { $this->setError(JText::_('INSTL_DATABASE_INVALID_TYPE')); return false; } // Ensure that a valid hostname and user name were input. if (empty($options->db_host) || empty($options->db_user)) { $this->setError(JText::_('INSTL_DATABASE_INVALID_DB_DETAILS')); return false; } // Ensure that a database name was input. if (empty($options->db_name)) { $this->setError(JText::_('INSTL_DATABASE_EMPTY_NAME')); return false; } // Validate database table prefix. if (!preg_match('#^[a-zA-Z]+[a-zA-Z0-9_]*$#', $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_PREFIX_INVALID_CHARS')); return false; } // Validate length of database table prefix. if (strlen($options->db_prefix) > 15) { $this->setError(JText::_('INSTL_DATABASE_FIX_TOO_LONG')); return false; } // Validate length of database name. if (strlen($options->db_name) > 64) { $this->setError(JText::_('INSTL_DATABASE_NAME_TOO_LONG')); return false; } // If the database is not yet created, create it. if (empty($options->db_created)) { // Get a database object. try { $db = JInstallationHelperDatabase::getDbo($options->db_type, $options->db_host, $options->db_user, $options->db_pass, null, $options->db_prefix, false); // Check database version. $db_version = $db->getVersion(); $type = $options->db_type; } catch (RuntimeException $e) { $this->setError(JText::sprintf('INSTL_DATABASE_COULD_NOT_CONNECT', $e->getMessage())); return false; } if (!$db->isMinimumVersion()) { $this->setError(JText::sprintf('INSTL_DATABASE_INVALID_' . strtoupper($type) . '_VERSION', $db_version)); return false; } if ($type == ('mysql' || 'mysqli')) { // @internal MySQL versions pre 5.1.6 forbid . / or \ or NULL if (preg_match('#[\\\\/\\.\\0]#', $options->db_name) && !version_compare($db_version, '5.1.6', '>=')) { $this->setError(JText::sprintf('INSTL_DATABASE_INVALID_NAME', $db_version)); return false; } } // @internal Check for spaces in beginning or end of name if (strlen(trim($options->db_name)) != strlen($options->db_name)) { $this->setError(JText::_('INSTL_DATABASE_NAME_INVALID_SPACES')); return false; } // @internal Check for asc(00) Null in name if (strpos($options->db_name, chr(00)) !== false) { $this->setError(JText::_('INSTL_DATABASE_NAME_INVALID_CHAR')); return false; } // Try to select the database try { $db->select($options->db_name); } catch (RuntimeException $e) { // If the database could not be selected, attempt to create it and then select it. if ($this->createDatabase($db, $options->db_name)) { $db->select($options->db_name); } else { $this->setError(JText::sprintf('INSTL_DATABASE_ERROR_CREATE', $options->db_name)); return false; } } // Set the character set to UTF-8 for pre-existing databases. $this->setDatabaseCharset($db, $options->db_name); // Should any old database tables be removed or backed up? if ($options->db_old == 'remove') { // Attempt to delete the old database tables. if (!$this->deleteDatabase($db, $options->db_name, $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_ERROR_DELETE')); return false; } } else { // If the database isn't being deleted, back it up. if (!$this->backupDatabase($db, $options->db_name, $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_ERROR_BACKINGUP')); return false; } } // Set the appropriate schema script based on UTF-8 support. if ($type == 'mysqli' || $type == 'mysql') { $schema = 'sql/mysql/joomla.sql'; } elseif ($type == 'sqlsrv' || $type == 'sqlazure') { $schema = 'sql/sqlazure/joomla.sql'; } else { $schema = 'sql/' . $type . '/joomla.sql'; } // Check if the schema is a valid file if (!JFile::exists($schema)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', JText::_('INSTL_DATABASE_NO_SCHEMA'))); return false; } // Attempt to import the database schema. if (!$this->populateDatabase($db, $schema)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', $this->getError())); return false; } // Attempt to update the table #__schema. $files = JFolder::files(JPATH_ADMINISTRATOR . '/components/com_admin/sql/updates/mysql/', '\\.sql$'); if (empty($files)) { $this->setError(JText::_('INSTL_ERROR_INITIALISE_SCHEMA')); return false; } $version = ''; foreach ($files as $file) { if (version_compare($version, JFile::stripExt($file)) < 0) { $version = JFile::stripExt($file); } } $query = $db->getQuery(true); $query->insert('#__schemas'); $query->columns(array($db->quoteName('extension_id'), $db->quoteName('version_id'))); $query->values('700, ' . $db->quote($version)); $db->setQuery($query); try { $db->execute(); } catch (RuntimeException $e) { $this->setError($e->getMessage()); return false; } // Attempt to refresh manifest caches $query = $db->getQuery(true); $query->select('*'); $query->from('#__extensions'); $db->setQuery($query); try { $extensions = $db->loadObjectList(); } catch (RuntimeException $e) { $this->setError($e->getMessage()); $return = false; } JFactory::$database = $db; $installer = JInstaller::getInstance(); foreach ($extensions as $extension) { if (!$installer->refreshManifestCache($extension->extension_id)) { $this->setError(JText::sprintf('INSTL_DATABASE_COULD_NOT_REFRESH_MANIFEST_CACHE', $extension->name)); return false; } } // Load the localise.sql for translating the data in joomla.sql/joomla_backwards.sql $dblocalise = 'sql/' . ($type == 'mysqli' ? 'mysql' : $type) . '/localise.sql'; if (JFile::exists($dblocalise)) { if (!$this->populateDatabase($db, $dblocalise)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', $this->getError())); return false; } } $dblocalise_sql = 'sql/' . ($type == 'sqlsrv' ? 'sqlazure' : $type) . '/localise.sql'; if (JFile::exists($dblocalise_sql)) { if (!$this->populateDatabase($db, $dblocalise_sql)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', $this->getError())); return false; } } // Handle default backend language setting. This feature is available for localized versions of Joomla 1.5. $app = JFactory::getApplication(); $languages = $app->getLocaliseAdmin($db); if (in_array($options->language, $languages['admin']) || in_array($options->language, $languages['site'])) { // Build the language parameters for the language manager. $params = array(); // Set default administrator/site language to sample data values: $params['administrator'] = 'en-GB'; $params['site'] = 'en-GB'; if (in_array($options->language, $languages['admin'])) { $params['administrator'] = $options->language; } if (in_array($options->language, $languages['site'])) { $params['site'] = $options->language; } $params = json_encode($params); // Update the language settings in the language manager. $db->setQuery('UPDATE ' . $db->quoteName('#__extensions') . ' SET ' . $db->quoteName('params') . ' = ' . $db->Quote($params) . ' WHERE ' . $db->quoteName('element') . '=\'com_languages\''); try { $db->execute(); } catch (RuntimeException $e) { $this->setError($e->getMessage()); $return = false; } } } return true; }
function initialise($options) { // Get the options as a JObject for easier handling. $options = JArrayHelper::toObject($options, 'JObject'); // Load the back-end language files so that the DB error messages work $jlang = JFactory::getLanguage(); // Pre-load en-GB in case the chosen language files do not exist $jlang->load('joomla', JPATH_ADMINISTRATOR, 'en-GB', true); // Load the selected language $jlang->load('joomla', JPATH_ADMINISTRATOR, $options->language, true); // Ensure a database type was selected. if (empty($options->db_type)) { $this->setError(JText::_('INSTL_DATABASE_INVALID_TYPE')); return false; } // Ensure that a valid hostname and user name were input. if (empty($options->db_host) || empty($options->db_user)) { $this->setError(JText::_('INSTL_DATABASE_INVALID_DB_DETAILS')); return false; } // Ensure that a database name was input. if (empty($options->db_name)) { $this->setError(JText::_('INSTL_DATABASE_EMPTY_NAME')); return false; } // Validate database table prefix. if (!preg_match('#^[a-zA-Z]+[a-zA-Z0-9_]*$#', $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_PREFIX_INVALID_CHARS')); return false; } // Validate length of database table prefix. if (strlen($options->db_prefix) > 15) { $this->setError(JText::_('INSTL_DATABASE_FIX_TOO_LONG')); return false; } // Validate length of database name. if (strlen($options->db_name) > 64) { $this->setError(JText::_('INSTL_DATABASE_NAME_TOO_LONG')); return false; } // If the database is not yet created, create it. if (empty($options->db_created)) { // Get a database object. try { $db = JInstallationHelperDatabase::getDbo($options->db_type, $options->db_host, $options->db_user, $options->db_pass, null, $options->db_prefix, false); } catch (JDatabaseException $e) { $this->setError(JText::sprintf('INSTL_DATABASE_COULD_NOT_CONNECT', $e->getMessage())); return false; } // Check database version. $db_version = $db->getVersion(); if (($position = strpos($db_version, '-')) !== false) { $db_version = substr($db_version, 0, $position); } if (!version_compare($db_version, '5.0.4', '>=')) { $this->setError(JText::sprintf('INSTL_DATABASE_INVALID_MYSQL_VERSION', $db_version)); return false; } // @internal MySQL versions pre 5.1.6 forbid . / or \ or NULL if (preg_match('#[\\\\/\\.\\0]#', $options->db_name) && !version_compare($db_version, '5.1.6', '>=')) { $this->setError(JText::sprintf('INSTL_DATABASE_INVALID_NAME', $db_version)); return false; } // @internal Check for spaces in beginning or end of name if (strlen(trim($options->db_name)) != strlen($options->db_name)) { $this->setError(JText::_('INSTL_DATABASE_NAME_INVALID_SPACES')); return false; } // @internal Check for asc(00) Null in name if (strpos($options->db_name, chr(00)) !== false) { $this->setError(JText::_('INSTL_DATABASE_NAME_INVALID_CHAR')); return false; } // Try to select the database try { $db->select($options->db_name); } catch (JDatabaseException $e) { // If the database could not be selected, attempt to create it and then select it. if ($this->createDatabase($db, $options->db_name)) { $db->select($options->db_name); } else { $this->setError(JText::sprintf('INSTL_DATABASE_ERROR_CREATE', $options->db_name)); return false; } } // Set the character set to UTF-8 for pre-existing databases. $this->setDatabaseCharset($db, $options->db_name); // Should any old database tables be removed or backed up? if ($options->db_old == 'remove') { // Attempt to delete the old database tables. if (!$this->deleteDatabase($db, $options->db_name, $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_ERROR_DELETE')); return false; } } else { // If the database isn't being deleted, back it up. if (!$this->backupDatabase($db, $options->db_name, $options->db_prefix)) { $this->setError(JText::_('INSTL_DATABASE_ERROR_BACKINGUP')); return false; } } // Set the appropriate schema script based on UTF-8 support. $type = $options->db_type; if ($type == 'mysqli' || $type == 'mysql') { $schema = 'sql/' . ($type == 'mysqli' ? 'mysql' : $type) . '/playjoom.sql'; } elseif ($type == 'sqlsrv' || $type == 'sqlazure') { $schema = 'sql/' . ($type == 'sqlsrv' ? 'sqlazure' : $type) . '/playjoom.sql'; } // Check if the schema is a valid file if (!JFile::exists($schema)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', JText::_('INSTL_DATABASE_NO_SCHEMA'))); return false; } // Attempt to import the database schema. if (!$this->populateDatabase($db, $schema)) { $this->setError(JText::sprintf('INSTL_ERROR_DB', $this->getError())); return false; } } // Check for errors. if (JError::isError($db)) { $this->setError(JText::sprintf('INSTL_DATABASE_COULD_NOT_CONNECT', (string) $db)); return false; } // Check for database errors. if ($err = $db->getErrorNum()) { $this->setError(JText::sprintf('INSTL_DATABASE_COULD_NOT_CONNECT', $db->getErrorNum())); return false; } return true; }