query($args); } /** * Generates and prints SQL query * * @param array|mixed one or more arguments * @return bool */ public static function test($args) { // receive arguments if (!is_array($args)) $args = func_get_args(); // and generate SQL $trans = new DibiTranslator(self::getConnection()); try { $sql = $trans->translate($args); } catch (DibiException $e) { return FALSE; } if ($sql === FALSE) return FALSE; self::dump($sql); return TRUE; } /** * Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query * Monostate for DibiDriver::insertId() * * @return int|bool int on success or FALSE on failure */ public static function insertId() { return self::getConnection()->insertId(); } /** * Gets the number of affected rows * Monostate for DibiDriver::affectedRows() * * @return int number of rows or FALSE on error */ public static function affectedRows() { return self::getConnection()->affectedRows(); } /** * Executes the SQL query - Monostate for DibiDriver::nativeQuery() * * @param string SQL statement. * @return object|bool Result set object or TRUE on success, FALSE on failure */ public static function nativeQuery($sql) { return self::getConnection()->nativeQuery($sql); } /** * Begins a transaction - Monostate for DibiDriver::begin() */ public static function begin() { return self::getConnection()->begin(); } /** * Commits statements in a transaction - Monostate for DibiDriver::commit() */ public static function commit() { return self::getConnection()->commit(); } /** * Rollback changes in a transaction - Monostate for DibiDriver::rollback() */ public static function rollback() { return self::getConnection()->rollback(); } private static function dumpHighlight($matches) { if (!empty($matches[1])) // comment return ''.$matches[1].''; if (!empty($matches[2])) // error return ''.$matches[2].''; if (!empty($matches[3])) // most important keywords return ''.$matches[3].''; if (!empty($matches[4])) // other keywords return ''.$matches[4].''; } /** * Prints out a syntax highlighted version of the SQL command * * @param string SQL command * @param bool return or print? * @return void */ public static function dump($sql, $return = FALSE) { static $keywords2 = 'ALL|DISTINCT|AS|ON|INTO|AND|OR|AS'; static $keywords1 = 'SELECT|UPDATE|INSERT|DELETE|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN'; // insert new lines $sql = preg_replace("#\\b(?:$keywords1)\\b#", "\n\$0", $sql); $sql = trim($sql); // reduce spaces $sql = preg_replace('# {2,}#', ' ', $sql); $sql = wordwrap($sql, 100); $sql = htmlSpecialChars($sql); $sql = preg_replace("#\n{2,}#", "\n", $sql); // syntax highlight $sql = preg_replace_callback("#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|\\b($keywords1)\\b|\\b($keywords2)\\b#", array('dibi', 'dumpHighlight'), $sql); $sql = '
' . $sql . "
\n"; // print & return if (!$return) echo $sql; return $sql; } /** * Displays complete result-set as HTML table * * @param object DibiResult * @return void */ public static function dumpResult(DibiResult $res) { echo ''; echo ''; foreach ($res->getFields() as $field) echo ''; echo ''; foreach ($res as $row => $fields) { echo ''; foreach ($fields as $field) { if (is_object($field)) $field = $field->__toString(); echo ''; } echo ''; } echo '
#row' . $field . '
', $row, '', htmlSpecialChars($field), '
'; } /** * Create a new substitution pair for indentifiers * @param string from * @param string to * @return void */ public static function addSubst($expr, $subst) { self::$substs[':'.$expr.':'] = $subst; } /** * Remove substitution pair * @param string from * @return void */ public static function removeSubst($expr) { unset(self::$substs[':'.$expr.':']); } /** * Process substitutions in string * @param string * @return string */ public static function substitute($s) { if (strpos($s, ':') === FALSE) return $s; return strtr($s, self::$substs); } /** * Error logging * EXPERIMENTAL */ public static function log($message) { if (self::$logFile == NULL || self::$logMode == NULL) return; $f = fopen(self::$logFile, self::$logMode); if (!$f) return; flock($f, LOCK_EX); fwrite($f, $message. "\n\n"); fclose($f); } } // class dibi