X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdba.php;h=b9e6c32d56acff766aeec3ffc91af5b09f5a023c;hb=d649873f804f9ed77e69ef6cd12af4a263233945;hp=0072660929cea8db9d23b9b17032d1dc283e71b3;hpb=8dd8936dd064344db355eb7b06e0af3bc0b0890f;p=friendica.git diff --git a/include/dba.php b/include/dba.php index 0072660929..b9e6c32d56 100644 --- a/include/dba.php +++ b/include/dba.php @@ -22,6 +22,7 @@ class dba { public $connected = false; public $error = false; private $_server_info = ''; + private static $in_transaction = false; private static $dbo; private static $relation = array(); @@ -458,6 +459,27 @@ class dba { return $sql; } + /** + * @brief beautifies the query - useful for "SHOW PROCESSLIST" + * + * This is safe when we bind the parameters later. + * The parameter values aren't part of the SQL. + * + * @param string $sql An SQL string without the values + * @return string The input SQL string modified if necessary. + */ + public function clean_query($sql) { + $search = array("\t", "\n", "\r", " "); + $replace = array(' ', ' ', ' ', ' '); + do { + $oldsql = $sql; + $sql = str_replace($search, $replace, $sql); + } while ($oldsql != $sql); + + return $sql; + } + + /** * @brief Replaces the ? placeholders with the parameters in the $args array * @@ -520,6 +542,7 @@ class dba { logger('Parameter mismatch. Query "'.$sql.'" - Parameters '.print_r($args, true), LOGGER_DEBUG); } + $sql = self::$dbo->clean_query($sql); $sql = self::$dbo->any_value_fallback($sql); if (x($a->config,'system') && x($a->config['system'], 'db_callstack')) { @@ -602,7 +625,8 @@ class dba { } if (self::$dbo->errorno != 0) { - logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".self::replace_parameters($sql, $args)); + logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n". + $a->callstack(8))."\n".self::replace_parameters($sql, $args); } $a->save_timestamp($stamp1, 'database'); @@ -706,6 +730,9 @@ class dba { * @return int Number of rows */ static public function num_rows($stmt) { + if (!is_object($stmt)) { + return 0; + } switch (self::$dbo->driver) { case 'pdo': return $stmt->rowCount(); @@ -779,6 +806,48 @@ class dba { return self::e($sql, $param); } + /** + * @brief Starts a transaction + * + * @return boolean Was the command executed successfully? + */ + static public function transaction() { + if (!self::e('COMMIT')) { + return false; + } + if (!self::e('START TRANSACTION')) { + return false; + } + self::$in_transaction = true; + return true; + } + + /** + * @brief Does a commit + * + * @return boolean Was the command executed successfully? + */ + static public function commit() { + if (!self::e('COMMIT')) { + return false; + } + self::$in_transaction = false; + return true; + } + + /** + * @brief Does a rollback + * + * @return boolean Was the command executed successfully? + */ + static public function rollback() { + if (!self::e('ROLLBACK')) { + return false; + } + self::$in_transaction = false; + return true; + } + /** * @brief Build the array with the table relations * @@ -801,16 +870,16 @@ class dba { } /** - * @brief Insert a row into a table + * @brief Delete a row from a table * * @param string $table Table name * @param array $param parameter array - * @param boolean $in_commit Internal use: Only do a commit after the last delete + * @param boolean $in_process Internal use: Only do a commit after the last delete * @param array $callstack Internal use: prevent endless loops * - * @return boolean|array was the delete successfull? When $in_commit is set: deletion data + * @return boolean|array was the delete successfull? When $in_process is set: deletion data */ - static public function delete($table, $param, $in_commit = false, &$callstack = array()) { + static public function delete($table, $param, $in_process = false, &$callstack = array()) { $commands = array(); @@ -872,10 +941,13 @@ class dba { } } - if (!$in_commit) { + if (!$in_process) { // Now we finalize the process - self::p("COMMIT"); - self::p("START TRANSACTION"); + $do_transaction = !self::$in_transaction; + + if ($do_transaction) { + self::transaction(); + } $compacted = array(); $counter = array(); @@ -886,8 +958,10 @@ class dba { logger(dba::replace_parameters($sql, $command['param']), LOGGER_DATA); - if (!self::e($sql, $param)) { - self::p("ROLLBACK"); + if (!self::e($sql, $command['param'])) { + if ($do_transaction) { + self::rollback(); + } return false; } } else { @@ -914,14 +988,18 @@ class dba { logger(dba::replace_parameters($sql, $field_values), LOGGER_DATA); - if (!self::e($sql, $param)) { - self::p("ROLLBACK"); + if (!self::e($sql, $field_values)) { + if ($do_transaction) { + self::rollback(); + } return false; } } } } - self::p("COMMIT"); + if ($do_transaction) { + self::commit(); + } return true; } @@ -1147,6 +1225,7 @@ function q($sql) { unset($args[0]); if ($db && $db->connected) { + $sql = $db->clean_query($sql); $sql = $db->any_value_fallback($sql); $stmt = @vsprintf($sql,$args); // Disabled warnings //logger("dba: q: $stmt", LOGGER_ALL); @@ -1184,6 +1263,7 @@ function qu($sql) { unset($args[0]); if ($db && $db->connected) { + $sql = $db->clean_query($sql); $sql = $db->any_value_fallback($sql); $stmt = @vsprintf($sql,$args); // Disabled warnings if ($stmt === false)