X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdba.php;h=3af8522516c64ca9f4306cdff9b836f02302bfac;hb=d7b420a44e9e196a51b78b60bc78a491757cf299;hp=bdfe88510fb5497fef5617a2cce4be2a26d49f89;hpb=3ca70e6362c53d002fe31cb46e9636fb78a446c8;p=friendica.git diff --git a/include/dba.php b/include/dba.php index bdfe88510f..3af8522516 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(); @@ -602,7 +603,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'); @@ -779,6 +781,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 +845,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 +916,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 +933,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 +963,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; } @@ -1058,7 +1111,7 @@ class dba { $param_string .= " ORDER BY "; foreach ($params['order'] AS $fields => $order) { if (!is_int($fields)) { - $param_string .= "`".$fields."` ".($order ? "ASC" : "DESC").", "; + $param_string .= "`".$fields."` ".($order ? "DESC" : "ASC").", "; } else { $param_string .= "`".$order."`, "; }