0);
private static $_sql;
private static $config;
/**
* constructor
* This does nothing with the DBA class
*/
private function __construct() {
// Rien a faire
} // construct
/**
* query
* This is the meat of the class this does a query, it emulates
* The mysql_query function
*/
public static function query($sql) {
// Run the query
$resource = mysql_query($sql,self::dbh());
debug_event('Query',$sql,'6');
// Save the query, to make debug easier
self::$_sql = $sql;
self::$stats['query']++;
// Do a little error checking here and try to recover from some forms of failure
if (!$resource) {
switch (mysql_errno(self::dbh())) {
case '2006':
case '2013':
case '2055':
debug_event('DBH','Lost connection to database server, trying to re-connect and hope nobody noticed','1');
self::disconnect();
// Try again
$resource = mysql_query($sql,self::dbh());
break;
default:
debug_event('DBH',mysql_error(self::dbh()) . ' ['. mysql_errno(self::dbh()) . ']','1');
break;
} // end switch on error #
} // if failed query
return $resource;
} // query
/**
* read
* This is a wrapper for query, it's so that in the future if we ever wanted
* to split reads and writes we could
*/
public static function read($sql) {
return self::query($sql);
} // read
/**
* write
* This is a wrapper for a write query, it is so that we can split out reads and
* writes if we want to
*/
public static function write($sql) {
return self::query($sql);
} // write
/**
* escape
* This runs a escape on a variable so that it can be safely inserted
* into the sql
*/
public static function escape($var) {
$string = mysql_real_escape_string($var,self::dbh());
return $string;
} // escape
/**
* fetch_assoc
* This emulates the mysql_fetch_assoc and takes a resource result
* we force it to always return an array, albeit an empty one
* The optional finish parameter affects whether we automatically clean
* up the result set after the last row is read.
*/
public static function fetch_assoc($resource, $finish = true) {
$result = mysql_fetch_assoc($resource);
if (!$result) {
if ($finish) {
self::finish($resource);
}
return array();
}
return $result;
} // fetch_assoc
/**
* fetch_row
* This emulates the mysql_fetch_row and takes a resource result
* we force it to always return an array, albeit an empty one
* The optional finish parameter affects whether we automatically clean
* up the result set after the last row is read.
*/
public static function fetch_row($resource, $finish = true) {
$result = mysql_fetch_row($resource);
if (!$result) {
if ($finish) {
self::finish($resource);
}
return array();
}
return $result;
} // fetch_row
/**
* num_rows
* This emulates the mysql_num_rows function which is really
* just a count of rows returned by our select statement, this
* doesn't work for updates or inserts
*/
public static function num_rows($resource) {
if ($resource) {
$result = mysql_num_rows($resource);
if ($result) {
return $result;
}
}
return 0;
} // num_rows
/**
* seek
* This resets the row pointer to the specified position
*/
public static function seek($resource, $row) {
return mysql_data_seek($resource, $row);
}
/**
* finish
* This closes a result handle and clears the memory associated with it
*/
public static function finish($resource) {
// Clear the result memory
mysql_free_result($resource);
} // finish
/**
* affected_rows
* This emulates the mysql_affected_rows function
*/
public static function affected_rows($resource) {
$result = mysql_affected_rows($resource);
if (!$result) {
return '0';
}
return $result;
} // affected_rows
/**
* _connect
* This connects to the database, used by the DBH function
*/
private static function _connect() {
$username = Config::get('database_username');
$hostname = Config::get('database_hostname');
$password = Config::get('database_password');
$dbh = mysql_connect($hostname, $username, $password);
if (!$dbh) {
debug_event('Database', 'Unable to connect to database: ' . mysql_error(), 1);
return null;
}
return $dbh;
} // _connect
private static function _setup_dbh($dbh, $database) {
$data = self::translate_to_mysqlcharset(Config::get('site_charset'));
if (function_exists('mysql_set_charset')) {
if (!$charset = mysql_set_charset($data['charset'], $dbh)) {
debug_event('Database', 'Unable to set MySQL connection charset to ' . $data['charset'] . ', this may cause issues...', 1);
}
}
else {
$sql = "SET NAMES " . mysql_real_escape_string($data['charset']);
$charset = mysql_query($sql,$dbh);
if ($error = mysql_error($dbh)) {
debug_event('Database', 'Unable to set MySQL connection charset to ' . $data['charset'] . ' using SET NAMES, this may cause issues: ' . $error, 1);
}
}
$select_db = mysql_select_db($database, $dbh);
if (!$select_db) {
debug_event('Database', 'Unable to select database ' . $database . ': ' . mysql_error(), 1);
}
if (Config::get('sql_profiling')) {
mysql_query('set profiling=1', $dbh);
mysql_query('set profiling_history_size=50', $dbh);
mysql_query('set query_cache_type=0', $dbh);
}
} // _select_db
/**
* check_database
*
* Make sure that we can connect to the database
*/
public static function check_database() {
$dbh = self::_connect();
if (!is_resource($dbh)) {
return false;
}
mysql_close($dbh);
return true;
} // check_database
public static function check_database_exists() {
$dbh = self::_connect();
$select = mysql_select_db(Config::get('database_name'), $dbh);
mysql_close($dbh);
return $select;
}
/**
* check_database_inserted
* checks to make sure that you have inserted the database
* and that the user you are using has access to it
*/
public static function check_database_inserted() {
$sql = "DESCRIBE session";
$db_results = Dba::read($sql);
if (!$db_results) {
return false;
}
// Make sure the whole table is there
if (Dba::num_rows($db_results) != '7') {
return false;
}
return true;
} // check_database_inserted
public static function get_client_info() {
return mysql_get_client_info();
}
/**
* show_profile
* This function is used for debug, helps with profiling
*/
public static function show_profile() {
if (Config::get('sql_profiling')) {
print '
Profiling data:
';
$res = Dba::read('show profiles');
print '
' . implode(' | ', $r) . ' |