X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fxdb.php;h=a9cb0681452e79c36950d2e2e660dd7f78d511d7;hb=ba63661ce2f38974002c7e4113320e9d06010853;hp=34c10e80d3caa4a72615912e35ac3e8220280ac6;hpb=8b1f8e12d444062ef63a0db3a8fa94582a9778c3;p=platal.git diff --git a/classes/xdb.php b/classes/xdb.php index 34c10e8..a9cb068 100644 --- a/classes/xdb.php +++ b/classes/xdb.php @@ -1,6 +1,6 @@ dbhost, $globals->dbuser, $globals->dbpwd, $globals->dbdb); + if ($globals->debug & DEBUG_BT) { + $bt = new PlBacktrace('MySQL'); + if (mysqli_connect_errno()) { + $bt->newEvent("MySQLI connection", 0, mysqli_connect_error()); + return false; + } + } + XDB::$mysqli->autocommit(true); + XDB::$mysqli->set_charset($globals->dbcharset); + return true; + } public static function _prepare($args) { - $query = array_map(Array('XDB', '_db_escape'), $args); + $query = array_map(Array('XDB', 'escape'), $args); $query[0] = str_replace('{?}', '%s', str_replace('%', '%%', $args[0])); return call_user_func_array('sprintf', $query); } public static function _reformatQuery($query) { - $query = preg_split("/\n\\s*/", $query); + $query = preg_split("/\n\\s*/", trim($query)); $length = 0; foreach ($query as $key=>$line) { $local = -2; - if (preg_match('/^([A-Z]+(?:\s+(?:JOIN|BY|FROM|INTO))?)\s+(.*)/', $line, $matches) + if (preg_match('/^([A-Z]+(?:\s+(?:JOIN|BY|FROM|INTO))?)\s+(.*)/u', $line, $matches) && $matches[1] != 'AND' && $matches[1] != 'OR') { $local = strlen($matches[1]); @@ -59,32 +75,31 @@ class XDB { global $globals; - if ($globals->debug & 1) { - $_res = mysql_query("EXPLAIN $query"); - $explain = array(); - while ($row = @mysql_fetch_assoc($_res)) { - $explain[] = $row; - } - $trace_data = array('query' => XDB::_reformatQuery($query), 'explain' => $explain); - @mysql_free_result($_res); - $time_start = microtime(); + if (!XDB::$mysqli && !XDB::connect()) { + return false; } - $res = mysql_query($query); - - if ($globals->debug & 1) { - list($ue, $se) = explode(" ", microtime()); - list($us, $ss) = explode(" ", $time_start); - $time = intval((($ue - $us) + ($se - $ss)) * 1000); - $trace_data['error'] = mysql_error(); - $trace_data['exectime'] = $time; - $trace_data['rows'] = @mysql_num_rows() ? mysql_num_rows() : mysql_affected_rows(); - $GLOBALS['XDB::trace_data'][] = $trace_data; - if (mysql_errno()) { - $GLOBALS['XDB::error'] = true; + if ($globals->debug & DEBUG_BT) { + $explain = array(); + if (strpos($query, 'FOUND_ROWS()') === false) { + $res = XDB::$mysqli->query("EXPLAIN $query"); + if ($res) { + while ($row = $res->fetch_assoc()) { + $explain[] = $row; + } + $res->free(); + } } + PlBacktrace::$bt['MySQL']->start(XDB::_reformatQuery($query)); } + $res = XDB::$mysqli->query($query); + + if ($globals->debug & DEBUG_BT) { + PlBacktrace::$bt['MySQL']->stop(@$res->num_rows ? $res->num_rows : XDB::$mysqli->affected_rows, + XDB::$mysqli->error, + $explain); + } return $res; } @@ -95,7 +110,12 @@ class XDB public static function execute() { - return XDB::_query(XDB::_prepare(func_get_args())); + global $globals; + $args = func_get_args(); + if ($globals->mode != 'rw' && !strpos($args[0], 'logger')) { + return; + } + return XDB::_query(XDB::_prepare($args)); } public static function iterator() @@ -110,10 +130,25 @@ class XDB public static function insertId() { - return mysql_insert_id(); + return XDB::$mysqli->insert_id; } - public static function _db_escape($var) + public static function errno() + { + return XDB::$mysqli->errno; + } + + public static function error() + { + return XDB::$mysqli->error; + } + + public static function affectedRows() + { + return XDB::$mysqli->affected_rows; + } + + public static function escape($var) { switch (gettype($var)) { case 'boolean': @@ -131,6 +166,9 @@ class XDB return 'NULL'; case 'object': + if ($var instanceof PlFlagSet) { + return "'" . addslashes($var->flags()) . "'"; + } case 'array': return "'".addslashes(serialize($var))."'"; @@ -138,80 +176,82 @@ class XDB die(var_export($var, true).' is not a valid for a database entry'); } } - - public static function trace_format(&$page, $template = 'skin/common.database-debug.tpl') { - $page->assign('trace_data', @$GLOBALS['XDB::trace_data']); - $page->assign('db_error', @$GLOBALS['XDB::error']); - return $page->fetch($template); - } } class XOrgDBResult { - var $_res; + private $_res; - function XOrgDBResult($query) + public function __construct($query) { $this->_res = XDB::_query($query); } - function free() + public function free() { - mysql_free_result($this->_res); + if ($this->_res) { + $this->_res->free(); + } unset($this); } - function _fetchRow() + protected function _fetchRow() { - return mysql_fetch_row($this->_res); + return $this->_res ? $this->_res->fetch_row() : null; } - function _fetchAssoc() + protected function _fetchAssoc() { - return mysql_fetch_assoc($this->_res); + return $this->_res ? $this->_res->fetch_assoc() : null; } - function fetchAllRow() + public function fetchAllRow() { $result = Array(); - while ($result[] = mysql_fetch_row($this->_res)) { } + if (!$this->_res) { + return $result; + } + while ($result[] = $this->_res->fetch_row()); array_pop($result); $this->free(); return $result; } - function fetchAllAssoc() + public function fetchAllAssoc() { $result = Array(); - while ($result[] = mysql_fetch_assoc($this->_res)) { } + if (!$this->_res) { + return $result; + } + while ($result[] = $this->_res->fetch_assoc()); array_pop($result); $this->free(); return $result; } - function fetchOneAssoc() + public function fetchOneAssoc() { $tmp = $this->_fetchAssoc(); $this->free(); return $tmp; } - function fetchOneRow() + public function fetchOneRow() { $tmp = $this->_fetchRow(); $this->free(); return $tmp; } - function fetchOneCell() + public function fetchOneCell() { $tmp = $this->_fetchRow(); $this->free(); return $tmp[0]; } - function fetchColumn($key = 0) + public function fetchColumn($key = 0) { $res = Array(); if (is_numeric($key)) { @@ -227,53 +267,100 @@ class XOrgDBResult return $res; } - function numRows() + public function fetchOneField() { - return mysql_num_rows($this->_res); + return $this->_res ? $this->_res->fetch_field() : null; + } + + public function fetchFields() + { + $res = array(); + while ($res[] = $this->fetchOneField()); + return $res; + } + + public function numRows() + { + return $this->_res ? $this->_res->num_rows : 0; + } + + public function fieldCount() + { + return $this->_res ? $this->_res->field_count : 0; } } -class XOrgDBIterator +require_once dirname(__FILE__) . '/pliterator.php'; + +class XOrgDBIterator extends XOrgDBResult implements PlIterator { private $_result; private $_pos; private $_total; + private $_fpos; + private $_fields; private $_mode = MYSQL_ASSOC; - function __construct($query, $mode = MYSQL_ASSOC) + public function __construct($query, $mode = MYSQL_ASSOC) { - $this->_result =& new XOrgDBResult($query); + parent::__construct($query); $this->_pos = 0; - $this->_total = $this->_result->numRows(); + $this->_total = $this->numRows(); + $this->_fpost = 0; + $this->_fields = $this->fieldCount(); $this->_mode = $mode; } - function next() + public function next() { $this->_pos ++; if ($this->_pos > $this->_total) { - $this->_result->free(); + $this->free(); unset($this); return null; } - return $this->_mode != MYSQL_ASSOC ? $this->_result->_fetchRow() : $this->_result->_fetchAssoc(); + return $this->_mode != MYSQL_ASSOC ? $this->_fetchRow() : $this->_fetchAssoc(); } - function first() + public function first() { return $this->_pos == 1; } - function last() + public function last() { - return $this->_last == $this->_total; + return $this->_pos == $this->_total; } - function total() + public function total() { return $this->_total; } + + public function nextField() + { + $this->_fpos++; + if ($this->_fpos > $this->_fields) { + return null; + } + return $this->fetchOneField(); + } + + public function firstField() + { + return $this->_fpos == 1; + } + + public function lastField() + { + return $this->_fpos == $this->_fields; + } + + public function totalFields() + { + return $this->_fields; + } } -// vim:set et sw=4 sts=4 sws=4 foldmethod=marker: +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: ?>