where[] = "("; return $this; } public function close_paren() { // Search backwards for the last opening paren and resolve it $i = count($this->where) - 1; $this->where[$i] .= ")"; while (--$i >= 0) { if ($this->where[$i] == "(") { // Remove the paren from the where clauses, and add it to the right of the operator of the // next where clause. If removing the paren makes the next where clause the first element // in the where list, then the operator shouldn't be there. It's there because we // calculate whether or not we need an operator based on the number of where clauses, and // the open paren seems like a where clause even though it isn't. array_splice($this->where, $i, 1); $this->where[$i] = preg_replace("/^(AND|OR) /", $i ? "\\1 (" : "(", $this->where[$i]); return $this; } } throw new Kohana_Database_Exception('database.missing_open_paren'); } /** * Parse the query string and convert any strings of the form `\([a-zA-Z0-9_]*?)\] * table prefix . $1 */ public function query($sql = '') { if (!empty($sql)) { $sql = $this->add_table_prefixes($sql); } return parent::query($sql); } public function add_table_prefixes($sql) { $prefix = $this->config["table_prefix"]; return preg_replace("#\[([a-zA-Z0-9_]+)\]#", "{$prefix}$1", $sql); } }