| | |
| | | { |
| | | if ($this->options['debug_mode']) { |
| | | if (($len = strlen($query)) > self::DEBUG_LINE_LENGTH) { |
| | | $query = substr_replace($query, "\n-----[debug cut]-----\n", |
| | | self::DEBUG_LINE_LENGTH/2 - 11, $len - self::DEBUG_LINE_LENGTH - 22); |
| | | $diff = $len - self::DEBUG_LINE_LENGTH; |
| | | $query = substr($query, 0, self::DEBUG_LINE_LENGTH) |
| | | . "... [truncated $diff bytes]"; |
| | | } |
| | | rcube::write_log('sql', '[' . (++$this->db_index) . '] ' . $query . ';'); |
| | | } |
| | |
| | | |
| | | if ($result === false) { |
| | | $error = $this->dbh->errorInfo(); |
| | | $this->db_error = true; |
| | | $this->db_error_msg = sprintf('[%s] %s', $error[1], $error[2]); |
| | | |
| | | rcube::raise_error(array('code' => 500, 'type' => 'db', |
| | | 'line' => __LINE__, 'file' => __FILE__, |
| | | 'message' => $this->db_error_msg . " (SQL Query: $query)" |
| | | ), true, false); |
| | | if (empty($this->options['ignore_key_errors']) || $error[0] != '23000') { |
| | | $this->db_error = true; |
| | | $this->db_error_msg = sprintf('[%s] %s', $error[1], $error[2]); |
| | | |
| | | rcube::raise_error(array('code' => 500, 'type' => 'db', |
| | | 'line' => __LINE__, 'file' => __FILE__, |
| | | 'message' => $this->db_error_msg . " (SQL Query: $query)" |
| | | ), true, false); |
| | | } |
| | | } |
| | | |
| | | $this->last_result = $result; |
| | |
| | | /** |
| | | * Return SQL function for current time and date |
| | | * |
| | | * @param int $interval Optional interval (in seconds) to add/subtract |
| | | * |
| | | * @return string SQL function to use in query |
| | | */ |
| | | public function now() |
| | | public function now($interval = 0) |
| | | { |
| | | return "now()"; |
| | | if ($interval) { |
| | | $add = ' ' . ($interval > 0 ? '+' : '-') . ' INTERVAL '; |
| | | $add .= $interval > 0 ? intval($interval) : intval($interval) * -1; |
| | | $add .= ' SECONDS'; |
| | | } |
| | | |
| | | return "now()" . $add; |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * Encodes non-UTF-8 characters in string/array/object (recursive) |
| | | * |
| | | * @param mixed $input Data to fix |
| | | * @param mixed $input Data to fix |
| | | * @param bool $serialized Enable serialization |
| | | * |
| | | * @return mixed Properly UTF-8 encoded data |
| | | */ |
| | | public static function encode($input) |
| | | public static function encode($input, $serialized = false) |
| | | { |
| | | // use Base64 encoding to workaround issues with invalid |
| | | // or null characters in serialized string (#1489142) |
| | | if ($serialized) { |
| | | return base64_encode(serialize($input)); |
| | | } |
| | | |
| | | if (is_object($input)) { |
| | | foreach (get_object_vars($input) as $idx => $value) { |
| | | $input->$idx = self::encode($value); |
| | |
| | | foreach ($input as $idx => $value) { |
| | | $input[$idx] = self::encode($value); |
| | | } |
| | | |
| | | return $input; |
| | | } |
| | | |
| | |
| | | /** |
| | | * Decodes encoded UTF-8 string/object/array (recursive) |
| | | * |
| | | * @param mixed $input Input data |
| | | * @param mixed $input Input data |
| | | * @param bool $serialized Enable serialization |
| | | * |
| | | * @return mixed Decoded data |
| | | */ |
| | | public static function decode($input) |
| | | public static function decode($input, $serialized = false) |
| | | { |
| | | // use Base64 encoding to workaround issues with invalid |
| | | // or null characters in serialized string (#1489142) |
| | | if ($serialized) { |
| | | // Keep backward compatybility where base64 wasn't used |
| | | if (strpos(substr($input, 0, 16), ':') !== false) { |
| | | return self::decode(@unserialize($input)); |
| | | } |
| | | |
| | | return @unserialize(base64_decode($input)); |
| | | } |
| | | |
| | | if (is_object($input)) { |
| | | foreach (get_object_vars($input) as $idx => $value) { |
| | | $input->$idx = self::decode($value); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Set class option value |
| | | * |
| | | * @param string $name Option name |
| | | * @param mixed $value Option value |
| | | */ |
| | | public function set_option($name, $value) |
| | | { |
| | | $this->options[$name] = $value; |
| | | } |
| | | |
| | | /** |
| | | * MDB2 DSN string parser |
| | | * |
| | | * @param string $sequence Secuence name |