diff options
Diffstat (limited to 'lib/class/dba.class.php')
-rw-r--r-- | lib/class/dba.class.php | 982 |
1 files changed, 491 insertions, 491 deletions
diff --git a/lib/class/dba.class.php b/lib/class/dba.class.php index ce5c38c4..6469b692 100644 --- a/lib/class/dba.class.php +++ b/lib/class/dba.class.php @@ -1,5 +1,5 @@ <?php -/* vim:set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab: */ +/* vim:set softtabstop=4 shiftwidth=4 expandtab: */ /** * * LICENSE: GNU General Public License, version 2 (GPLv2) @@ -36,497 +36,497 @@ if (!defined('INIT_LOADED') || INIT_LOADED != '1') { exit; } */ class Dba { - public static $stats = array('query'=>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']++; + public static $stats = array('query'=>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 '<br/>Profiling data: <br/>'; - $res = Dba::read('show profiles'); - print '<table>'; - while ($r = Dba::fetch_row($res)) { - print '<tr><td>' . implode('</td><td>', $r) . '</td></tr>'; - } - print '</table>'; - } - } // show_profile - - /** - * dbh - * This is called by the class to return the database handle - * for the specified database, if none is found it connects - */ - public static function dbh($database='') { - - if (!$database) { - $database = Config::get('database_name'); - } - - // Assign the Handle name that we are going to store - $handle = 'dbh_' . $database; - - if (!is_resource(Config::get($handle))) { - $dbh = self::_connect(); - self::_setup_dbh($dbh, $database); - Config::set($handle, $dbh, true); - return $dbh; - } - else { - return Config::get($handle); - } - - - } // dbh - - /** - * disconnect - * This nukes the dbh connection based, this isn't used very often... - */ - public static function disconnect($database='') { - - if (!$database) { - $database = Config::get('database_name'); - } - - $handle = 'dbh_' . $database; - - // Try to close it correctly - mysql_close(Config::get($handle)); - - // Nuke it - Config::set($handle, false, true); - - return true; - - } // disconnect - - /** - * insert_id - * This emulates the mysql_insert_id function, it takes - * an optional database target - */ - public static function insert_id() { - - $id = mysql_insert_id(self::dbh()); - return $id; - - } // insert_id - - /** - * error - * this returns the error of the db - */ - public static function error() { - - return mysql_error(); - - } // error - - /** - * translate_to_mysqlcharset - * This translates the specified charset to a mysqlcharset, stupid ass mysql - * demands that it's charset list is different! - */ - public static function translate_to_mysqlcharset($charset) { - - // MySQL translte real charset names into fancy smancy MySQL land names - switch (strtoupper($charset)) { - case 'CP1250': - case 'WINDOWS-1250': - $target_charset = 'cp1250'; - $target_collation = 'cp1250_general_ci'; - break; - case 'ISO-8859': - case 'ISO-8859-2': - $target_charset = 'latin2'; - $target_collation = 'latin2_general_ci'; - break; - case 'ISO-8859-1': - case 'CP1252': - case 'WINDOWS-1252': - $target_charset = 'latin1'; - $target_collation = 'latin1_general_ci'; - break; - case 'EUC-KR': - $target_charset = 'euckr'; - $target_collation = 'euckr_korean_ci'; - break; - case 'CP932': - $target_charset = 'sjis'; - $target_collation = 'sjis_japanese_ci'; - break; - case 'KOI8-U': - $target_charset = 'koi8u'; - $target_collation = 'koi8u_general_ci'; - break; - case 'KOI8-R': - $target_charset = 'koi8r'; - $target_collation = 'koi8r_general_ci'; - break; - default; - case 'UTF-8': - $target_charset = 'utf8'; - $target_collation = 'utf8_unicode_ci'; - break; - } // end mysql charset translation - - return array('charset'=>$target_charset,'collation'=>$target_collation); - - } // translate_to_mysqlcharset - - /** - * reset_db_charset - * This cruises through the database and trys to set the charset to the current - * site charset, this is an admin function that can be run by an administrator - * this can mess up data if you switch between charsets that are not overlapping - * a catalog verify must be re-run to correct them - */ - public static function reset_db_charset() { - - $translated_charset = self::translate_to_mysqlcharset(Config::get('site_charset')); - $target_charset = $translated_charset['charset']; - $target_collation = $translated_charset['collation']; - - // Alter the charset for the entire database - $sql = "ALTER DATABASE `" . Config::get('database_name') . "` DEFAULT CHARACTER SET $target_charset COLLATE $target_collation"; - $db_results = Dba::write($sql); - - $sql = "SHOW TABLES"; - $db_results = Dba::read($sql); - - // Go through the tables! - while ($row = Dba::fetch_row($db_results)) { - $sql = "DESCRIBE `" . $row['0'] . "`"; - $describe_results = Dba::read($sql); - - // Change the tables default charset and colliation - $sql = "ALTER TABLE `" . $row['0'] . "` DEFAULT CHARACTER SET $target_charset COLLATE $target_collation"; - $alter_table = Dba::write($sql); - - // Itterate through the columns of the table - while ($table = Dba::fetch_assoc($describe_results)) { - if ( - (strpos($table['Type'], 'varchar') !== false) || - (strpos($table['Type'], 'enum') !== false) || - (strpos($table['Table'],'text') !== false)) { - $sql = "ALTER TABLE `" . $row['0'] . "` MODIFY `" . $table['Field'] . "` " . $table['Type'] . " CHARACTER SET " . $target_charset; - $charset_results = Dba::write($sql); - if (!$charset_results) { - debug_event('CHARSET','Unable to update the charset of ' . $table['Field'] . '.' . $table['Type'] . ' to ' . $target_charset,'3'); - } // if it fails - } // if its a varchar - } // end columns - - } // end tables - - - } // reset_db_charset - - /** - * optimize_tables - * - * This runs an optimize on the tables and updates the stats to improve - * join speed. - * This can be slow, but is a good idea to do from time to time. We do - * it in case the dba isn't doing it... which we're going to assume they - * aren't. - */ - public static function optimize_tables() { - $sql = "SHOW TABLES"; - $db_results = Dba::read($sql); - - while($row = Dba::fetch_row($db_results)) { - $sql = "OPTIMIZE TABLE `" . $row[0] . "`"; - $db_results_inner = Dba::write($sql); - - $sql = "ANALYZE TABLE `" . $row[0] . "`"; - $db_results_inner = Dba::write($sql); - } - } + // 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 '<br/>Profiling data: <br/>'; + $res = Dba::read('show profiles'); + print '<table>'; + while ($r = Dba::fetch_row($res)) { + print '<tr><td>' . implode('</td><td>', $r) . '</td></tr>'; + } + print '</table>'; + } + } // show_profile + + /** + * dbh + * This is called by the class to return the database handle + * for the specified database, if none is found it connects + */ + public static function dbh($database='') { + + if (!$database) { + $database = Config::get('database_name'); + } + + // Assign the Handle name that we are going to store + $handle = 'dbh_' . $database; + + if (!is_resource(Config::get($handle))) { + $dbh = self::_connect(); + self::_setup_dbh($dbh, $database); + Config::set($handle, $dbh, true); + return $dbh; + } + else { + return Config::get($handle); + } + + + } // dbh + + /** + * disconnect + * This nukes the dbh connection based, this isn't used very often... + */ + public static function disconnect($database='') { + + if (!$database) { + $database = Config::get('database_name'); + } + + $handle = 'dbh_' . $database; + + // Try to close it correctly + mysql_close(Config::get($handle)); + + // Nuke it + Config::set($handle, false, true); + + return true; + + } // disconnect + + /** + * insert_id + * This emulates the mysql_insert_id function, it takes + * an optional database target + */ + public static function insert_id() { + + $id = mysql_insert_id(self::dbh()); + return $id; + + } // insert_id + + /** + * error + * this returns the error of the db + */ + public static function error() { + + return mysql_error(); + + } // error + + /** + * translate_to_mysqlcharset + * This translates the specified charset to a mysqlcharset, stupid ass mysql + * demands that it's charset list is different! + */ + public static function translate_to_mysqlcharset($charset) { + + // MySQL translte real charset names into fancy smancy MySQL land names + switch (strtoupper($charset)) { + case 'CP1250': + case 'WINDOWS-1250': + $target_charset = 'cp1250'; + $target_collation = 'cp1250_general_ci'; + break; + case 'ISO-8859': + case 'ISO-8859-2': + $target_charset = 'latin2'; + $target_collation = 'latin2_general_ci'; + break; + case 'ISO-8859-1': + case 'CP1252': + case 'WINDOWS-1252': + $target_charset = 'latin1'; + $target_collation = 'latin1_general_ci'; + break; + case 'EUC-KR': + $target_charset = 'euckr'; + $target_collation = 'euckr_korean_ci'; + break; + case 'CP932': + $target_charset = 'sjis'; + $target_collation = 'sjis_japanese_ci'; + break; + case 'KOI8-U': + $target_charset = 'koi8u'; + $target_collation = 'koi8u_general_ci'; + break; + case 'KOI8-R': + $target_charset = 'koi8r'; + $target_collation = 'koi8r_general_ci'; + break; + default; + case 'UTF-8': + $target_charset = 'utf8'; + $target_collation = 'utf8_unicode_ci'; + break; + } // end mysql charset translation + + return array('charset'=>$target_charset,'collation'=>$target_collation); + + } // translate_to_mysqlcharset + + /** + * reset_db_charset + * This cruises through the database and trys to set the charset to the current + * site charset, this is an admin function that can be run by an administrator + * this can mess up data if you switch between charsets that are not overlapping + * a catalog verify must be re-run to correct them + */ + public static function reset_db_charset() { + + $translated_charset = self::translate_to_mysqlcharset(Config::get('site_charset')); + $target_charset = $translated_charset['charset']; + $target_collation = $translated_charset['collation']; + + // Alter the charset for the entire database + $sql = "ALTER DATABASE `" . Config::get('database_name') . "` DEFAULT CHARACTER SET $target_charset COLLATE $target_collation"; + $db_results = Dba::write($sql); + + $sql = "SHOW TABLES"; + $db_results = Dba::read($sql); + + // Go through the tables! + while ($row = Dba::fetch_row($db_results)) { + $sql = "DESCRIBE `" . $row['0'] . "`"; + $describe_results = Dba::read($sql); + + // Change the tables default charset and colliation + $sql = "ALTER TABLE `" . $row['0'] . "` DEFAULT CHARACTER SET $target_charset COLLATE $target_collation"; + $alter_table = Dba::write($sql); + + // Itterate through the columns of the table + while ($table = Dba::fetch_assoc($describe_results)) { + if ( + (strpos($table['Type'], 'varchar') !== false) || + (strpos($table['Type'], 'enum') !== false) || + (strpos($table['Table'],'text') !== false)) { + $sql = "ALTER TABLE `" . $row['0'] . "` MODIFY `" . $table['Field'] . "` " . $table['Type'] . " CHARACTER SET " . $target_charset; + $charset_results = Dba::write($sql); + if (!$charset_results) { + debug_event('CHARSET','Unable to update the charset of ' . $table['Field'] . '.' . $table['Type'] . ' to ' . $target_charset,'3'); + } // if it fails + } // if its a varchar + } // end columns + + } // end tables + + + } // reset_db_charset + + /** + * optimize_tables + * + * This runs an optimize on the tables and updates the stats to improve + * join speed. + * This can be slow, but is a good idea to do from time to time. We do + * it in case the dba isn't doing it... which we're going to assume they + * aren't. + */ + public static function optimize_tables() { + $sql = "SHOW TABLES"; + $db_results = Dba::read($sql); + + while($row = Dba::fetch_row($db_results)) { + $sql = "OPTIMIZE TABLE `" . $row[0] . "`"; + $db_results_inner = Dba::write($sql); + + $sql = "ANALYZE TABLE `" . $row[0] . "`"; + $db_results_inner = Dba::write($sql); + } + } } // dba class |