/** * @static * @param array $database_settings * @return AkDbAdapter */ static function &getInstance($database_specifications = AK_DEFAULT_DATABASE_PROFILE, $auto_connect = true, $namespace = null) { $settings_hash = is_string($database_specifications) ? $database_specifications : AkDbAdapter::hash($database_specifications); $static_var_name = 'AkDbAdapter_getInstance_' . $settings_hash; if (!($Connection = Ak::getStaticVar($static_var_name))) { defined('AK_DATABASE_SETTINGS_NAMESPACE') || define('AK_DATABASE_SETTINGS_NAMESPACE', 'database'); $namespace = empty($namespace) ? AK_DATABASE_SETTINGS_NAMESPACE : $namespace; if (empty($database_specifications)) { $database_specifications = Ak::getSettings($namespace, false, $settings_hash); } elseif (is_string($database_specifications)) { $environment_settings = Ak::getSettings($namespace, false, $database_specifications); if (!empty($environment_settings)) { $database_specifications = $environment_settings; } elseif (strstr($database_specifications, '://')) { $database_specifications = AkDbAdapter::getDbSettingsFromDsn($database_specifications); $settings_hash = AK_ENVIRONMENT; } else { global $database_settings; if (isset($database_settings) && !file_exists(AkConfig::getDir('config') . DS . $namespace . '.yml')) { trigger_error(Ak::t("You are still using the old config/config.php database configuration. Please upgrade to use the config/database.yml configuration."), E_USER_NOTICE); } if (!file_exists(AkConfig::getDir('config') . DS . $namespace . '.yml')) { trigger_error(Ak::t("Could not find the database configuration file in %dbconfig.", array('%dbconfig' => AkConfig::getDir('config') . DS . $namespace . '.yml')), E_USER_ERROR); } else { trigger_error(Ak::t("Could not find the database profile '%profile_name' in config/%dbfile.yml.", array('%profile_name' => $database_specifications, '%dbfile' => $namespace)), E_USER_ERROR); } $return = false; return $return; } } elseif (!empty($database_settings[$settings_hash])) { $database_specifications = $database_settings[$settings_hash]; } if (empty($database_specifications)) { trigger_error(Ak::t('Could not find database settings for %namespace.yml/%settings_hash', array('%namespace' => $namespace, '%settings_hash' => $settings_hash)), E_USER_ERROR); } // Compatibility with RoR database.yml format $database_specifications['user'] = isset($database_specifications['user']) ? $database_specifications['user'] : (isset($database_specifications['username']) ? $database_specifications['username'] : ''); $database_specifications['type'] = isset($database_specifications['type']) ? $database_specifications['type'] : $database_specifications['adapter']; $database_specifications['database_name'] = isset($database_specifications['database_name']) ? $database_specifications['database_name'] : (isset($database_specifications['database']) ? $database_specifications['database'] : ''); $class_name = 'Ak' . AkInflector::camelize($database_specifications['type']) . 'DbAdapter'; $adapter_class_file = AK_ACTIVE_RECORD_DIR . DS . 'adapters' . DS . AkInflector::underscore($database_specifications['type']) . '.php'; if (!@(include_once $adapter_class_file)) { trigger_error(Ak::t('Could not find database adapter file on %path', array('%path' => $adapter_class_file)), E_USER_ERROR); } $Connection = new $class_name($database_specifications, $auto_connect); Ak::setStaticVar($static_var_name, $Connection); } return $Connection; }