'.$msg.'');
break;
case 'tables_missing':
$res['status']='tables_missing';
$res['color'] = 'orange';
$res['message']= fs_r('FireStats tables are not installed');
break;
case 'db_installed':
$res['status']='ok';
$res['color'] = 'blue';
$res['message']= fs_r('FireStats is installed');
break;
case 'other_db_detected':
$res['status']='other_db_detected';
$res['color'] = 'orange';
$res['message']= fs_r('Another FireStats database detected');
break;
case 'db_created':
$res['status'] = 'ok';
$res['color'] = 'blue';
$res['message'] = fs_r('New database created successfuly');
break;
default:
$res['message'] = sprintf(fs_r('Unexpected error code %s'),$error_code);
}
return $res;
}
function fs_test_db_connection($host, $username, $password, $db_name, $table_prefix)
{
if (!fs_is_admin()) return fs_get_db_response("access_denied","Access denied : fs_test_db_connection");
require_once(FS_ABS_PATH."/lib/ezsql/shared/ez_sql_core.php");
require_once(FS_ABS_PATH."/lib/ezsql/mysql/ez_sql_mysql.php");
$conn = new fs_ezSQL_mysql($username,$password, $db_name, $host);
$conn->hide_errors();
if (!$conn->connect($username,$password,$host, false))
{
return fs_get_db_response('db_connect_error', $conn->last_error);
}
if (($mysql_version = $conn->get_var("select version()")) === false)
{
return fs_get_db_response('db_access_error', $conn->last_error);
}
if ($conn->query("use `$db_name`") === false)
{
return fs_get_db_response('db_missing', $db_name);
}
if ($conn->query("show tables") === false)
{
return fs_get_db_response('db_access_error', $conn->last_error);
}
$version_table = $table_prefix.'firestats_version';
$sql = "SHOW TABLES LIKE '$version_table'";
$results = $conn->query($sql);
if ($results === FALSE)
{
return fs_get_db_response('db_access_error', $conn->last_error);
}
if ($results == 0)
{
return fs_get_db_response('tables_missing');
}
fs_load_config();
if(!fs_same_config($host, $username, $password, $db_name, $table_prefix))
{
return fs_get_db_response('other_db_detected');
}
return fs_get_db_response('db_installed');
}
function fs_same_config($host, $user, $pass, $dbname, $table_prefix)
{
global $fs_config;
return $fs_config['DB_NAME'] == $dbname &&
$fs_config['DB_PREFIX'] == $table_prefix &&
$fs_config['DB_PASS'] == $pass &&
$fs_config['DB_HOST'] == $host &&
$fs_config['DB_USER'] == $user;
}
function fs_save_config_file($host, $user, $pass, $dbname, $table_prefix)
{
if (!fs_is_admin()) return "Access denied : fs_save_config_file";
if (file_exists(dirname(__FILE__)."/fs-config.php"))
{
global $fs_config;
if ($fs_config['DB_NAME'] == $dbname &&
$fs_config['DB_PREFIX'] == $table_prefix &&
$fs_config['DB_USER'] == $user &&
$fs_config['DB_PASS'] == $pass &&
$fs_config['DB_HOST'] == $host)
{
// identical, no need to save (or bitch about file not being writable)
return;
}
}
if (!fs_config_writeable())
{
return fs_get_config_write_error_message($host, $user, $pass, $dbname, $table_prefix);
}
ob_start();
$file = fopen(dirname(__FILE__)."/fs-config.php", "w");
$output = ob_get_clean();
if ($file === false)
{
return $output;
}
else
{
ob_start();
$res = fwrite($file, fs_get_config($host, $user, $pass, $dbname, $table_prefix));
$output = ob_get_clean();
fclose($file);
if ($res === false)
{
return $output;
}
}
}
function fs_get_config($host, $user, $pass, $dbname, $table_prefix)
{
if ($host == '') $host = 'localhost';
return
"
";
}
function fs_create_new_database($host, $admin_user, $admin_pass, $user, $pass, $dbname, $table_prefix)
{
if (!fs_is_admin()) return fs_get_db_response("access_denied","Access denied : fs_create_new_database");
require_once(FS_ABS_PATH."/lib/ezsql/shared/ez_sql_core.php");
require_once(FS_ABS_PATH."/lib/ezsql/mysql/ez_sql_mysql.php");
require_once dirname(__FILE__)."/db-setup.php";
if ($user == '' || $pass == '')
{
$user = $admin_user;
$pass = $admin_pass;
}
$conn = new fs_ezSQL_mysql($admin_user,$admin_pass, $dbname, $host);
$conn->hide_errors();
if (!fs_config_writeable())
{
$a = array();
$a['status'] = 'error';
$a['message'] = fs_get_config_write_error_message($host, $user, $pass, $dbname, $table_prefix);
$a['color'] = 'red';
return $a;
}
if (!$conn->connect($admin_user,$admin_pass,$host, false))
{
return fs_get_db_response('db_connect_error', $conn->last_error);
}
$db = $conn->query("SHOW DATABASES LIKE '$dbname'");
if ($db=== false)
{
return fs_get_db_response('db_access_error', $conn->last_error);
}
$existed = $db == 1;
if ($conn->query("CREATE DATABASE IF NOT EXISTS `$dbname`") === false)
{
return fs_get_db_response('db_create_error', $conn->last_error);
}
if ($conn->query("GRANT SELECT, INSERT, UPDATE,
DELETE, CREATE, ALTER, INDEX,
DROP, CREATE TEMPORARY TABLES
ON `$dbname`.*
TO `$user` IDENTIFIED BY '$pass';") === false)
{
$last_error = $conn->last_error;
if (!$existed)
{
$conn->query("DROP DATABASE `$dbname`");
}
return fs_get_db_response('user_create_error', $last_error);
}
$r = fs_save_config_file($host,$user,$pass,$dbname,$table_prefix);
if ($r != '')
{
if (!$existed)
{
$conn->query("DROP DATABASE `$dbname`");
}
return fs_get_db_response('config_save_error', $conn->last_error);
}
ob_start();
$install_res = fs_install_into($user,$pass,$dbname,$host);
$output = ob_get_clean();
if (!$install_res)
{
$last_error = $conn->last_error;
if (!$existed)
{
$conn->query("DROP DATABASE `$dbname`");
}
return fs_get_db_response('tables_create_error', $last_error.($output ? ', Output: '.$output : ''));
}
$conn->disconnect();
return fs_get_db_response('db_created', $conn->last_error);
}
function fs_config_writeable()
{
return (!file_exists(dirname(__FILE__).'/fs-config.php') && is_writeable(dirname(__FILE__)))
|| is_writeable(dirname(__FILE__).'/fs-config.php');
}
function fs_get_config_source_desc()
{
$db_config_type = fs_get_db_config_type();
switch ($db_config_type)
{
case FS_DB_CONFIG_UNAVAILABLE:
$cfg_source = fs_r('Not configured');
break;
case FS_DB_CONFIG_FILE:
$cfg_source = fs_r('FireStats configuration file');
break;
case FS_DB_CONFIG_WORDPRESS:
$cfg_source = fs_r('Wordpress configuration file');
break;
case FS_DB_CONFIG_EXTERNAL:
$cfg_source = fs_r('External configuration');
break;
}
return $cfg_source;
}
function fs_get_db_config_type()
{
global $OVERRIDE_CONFIG;
if (isset($OVERRIDE_CONFIG) && $OVERRIDE_CONFIG) return FS_DB_CONFIG_EXTERNAL;
if (file_exists(dirname(__file__)."/fs-config.php")) return FS_DB_CONFIG_FILE;
if (fs_in_wordpress() && fs_full_installation()) return FS_DB_CONFIG_WORDPRESS;
return FS_DB_CONFIG_UNAVAILABLE;
}
function fs_should_show_use_wp_button()
{
$in_wordpress = fs_in_wordpress() && fs_full_installation();
$db_config_type = fs_get_db_config_type();
return $in_wordpress && $db_config_type != FS_DB_CONFIG_WORDPRESS;
}
function fs_load_config()
{
// allow overring the global configuration fs_config by an external source.
global $OVERRIDE_CONFIG;
if (isset($OVERRIDE_CONFIG) && $OVERRIDE_CONFIG) return;
$db_config_type = fs_get_db_config_type();
if ($db_config_type == FS_DB_CONFIG_FILE)
{
// note:
// this is not require_once on purpose!
// we need this to be included even if it was included before.
require(dirname(__FILE__).'/fs-config.php');
}
else
if ($db_config_type == FS_DB_CONFIG_WORDPRESS)
{
require_once(fs_get_wp_config_path());
$fs_config['DB_NAME']=DB_NAME;
if (!fs_is_wpmu())
{
global $table_prefix;
$db_prefix = isset($table_prefix) ? $table_prefix : '';
}
else
{
global $wpmuBaseTablePrefix;
$db_prefix = isset($wpmuBaseTablePrefix) ? $wpmuBaseTablePrefix : '';
}
$fs_config['DB_PREFIX'] = $db_prefix;
$fs_config['DB_USER'] =DB_USER;
$fs_config['DB_PASS'] = DB_PASSWORD;
$fs_config['DB_HOST'] = DB_HOST;
$GLOBALS['fs_config'] = $fs_config;
}
else
{
// load default values
$fs_config['DB_NAME'] = 'firestats';
$fs_config['DB_PREFIX'] = '';
$fs_config['DB_USER'] = '';
$fs_config['DB_PASS'] = '';
$fs_config['DB_HOST'] = 'localhost';
$GLOBALS['fs_config'] = $fs_config;
}
}
function fs_get_config_write_error_message($host, $user, $pass, $dbname, $table_prefix)
{
$cfg_file = dirname(__FILE__)."/fs-config.php";
$download = "".fs_r('file')."";
$header = sprintf(fs_r("Configuration file %s is not writable, you can either:"),$cfg_file);
$line1 = sprintf(fs_r("Fix the problem by making it writable"));
$line2 = sprintf(fs_r("download the %s and upload it into %s"),$download, FS_ABS_PATH."/php");
return "$header