Small performance improvements, use str_replace() instead of strtr(),
do not parse query if there are no params to replace,
keep one instance of (potentially long) query less in memory
| | |
| | | */ |
| | | protected function _query($query, $offset, $numrows, $params) |
| | | { |
| | | $query = trim($query); |
| | | $query = ltrim($query); |
| | | |
| | | $this->db_connect($this->dsn_select($query), true); |
| | | |
| | |
| | | $query = $this->set_limit($query, $numrows, $offset); |
| | | } |
| | | |
| | | $params = (array) $params; |
| | | |
| | | // Because in Roundcube we mostly use queries that are |
| | | // executed only once, we will not use prepared queries |
| | | $pos = 0; |
| | | $idx = 0; |
| | | |
| | | if (count($params)) { |
| | | while ($pos = strpos($query, '?', $pos)) { |
| | | if ($query[$pos+1] == '?') { // skip escaped ? |
| | | if ($query[$pos+1] == '?') { // skip escaped '?' |
| | | $pos += 2; |
| | | } |
| | | else { |
| | |
| | | $pos += strlen($val); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // replace escaped ? back to normal |
| | | $query = rtrim(strtr($query, array('??' => '?')), ';'); |
| | | // replace escaped '?' back to normal, see self::quote() |
| | | $query = str_replace('??', '?', $query); |
| | | $query = rtrim($query, " \t\n\r\0\x0B;"); |
| | | |
| | | $this->debug($query); |
| | | |