<?php
/***************************************************************************
- * Copyright (C) 2003-2010 Polytechnique.org *
+ * Copyright (C) 2003-2011 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
if ($globals->debug & DEBUG_BT) {
$explain = array();
- if (strpos($query, 'FOUND_ROWS()') === false) {
+ if (strpos($query, 'FOUND_ROWS()') === false && strpos($query, 'AUTOCOMMIT') === false) {
$res = self::$mysqli->query("EXPLAIN $query");
if ($res) {
while ($row = $res->fetch_assoc()) {
return self::queryv(func_get_args());
}
+ public static function rawQuery($query)
+ {
+ return new XDBResult($query);
+ }
+
public static function format()
{
return self::prepare(func_get_args());
return self::run(XDB::prepare($args));
}
+ public static function rawExecute($query)
+ {
+ global $globals;
+ if ($globals->mode != 'rw') {
+ return;
+ }
+ return self::run($query);
+ }
+
+ private static $inTransaction = false;
+ public static function startTransaction()
+ {
+ if (self::$inTransaction) {
+ throw new XDBException('START TRANSACTION', 'Already in a transaction');
+ }
+ self::$inTransaction = true;
+ self::rawExecute('SET AUTOCOMMIT = 0');
+ self::rawExecute('START TRANSACTION');
+ }
+
+ public static function commit()
+ {
+ self::rawExecute('COMMIT');
+ self::rawExecute('SET AUTOCOMMIT = 1');
+ self::$inTransaction = false;
+ }
+
+ public static function rollback()
+ {
+ self::rawExecute('ROLLBACK');
+ self::rawExecute('SET AUTOCOMMIT = 1');
+ self::$inTransaction = false;
+ }
+
+ public static function runTransactionV($callback, array $args)
+ {
+ self::startTransaction();
+ try {
+ if (call_user_func_array($callback, $args)) {
+ self::commit();
+ return true;
+ } else {
+ self::rollback();
+ return false;
+ }
+ } catch (Exception $e) {
+ self::rollback();
+ throw $e;
+ }
+ }
+
+ /** This function takes a callback followed by the arguments to be passed to the callback
+ * as arguments. It starts a transaction and execute the callback. If the callback fails
+ * (return false or raise an exception), the transaction is rollbacked, if the callback
+ * succeeds (return true), the transaction is committed.
+ */
+ public static function runTransaction()
+ {
+ $args = func_get_args();
+ $cb = array_shift($args);
+ return self::runTransactionV($cb, $args);
+ }
+
public static function iterator()
{
return new XDBIterator(self::prepare(func_get_args()));
}
+ public static function rawIterator($query)
+ {
+ return new XDBIterator($query);
+ }
+
public static function iterRow()
{
return new XDBIterator(self::prepare(func_get_args()), MYSQL_NUM);
}
+ public static function rawIterRow($query)
+ {
+ return new XDBIterator($query, MYSQL_NUM);
+ }
+
private static function findQuery($params, $default = array())
{
for ($i = 0 ; $i < count($default) ; ++$i) {
return self::queryv($query)->fetchAllRow($args[0], $args[1]);
}
+ public static function rawFetchAllRow($query, $id = false, $keep_array = false)
+ {
+ return self::rawQuery($query)->fetchAllRow($id, $keep_array);
+ }
+
/** Fetch all rows returned by the given query.
* This functions can take 2 optional arguments (cf XDBResult::fetchAllAssoc()).
* Optional arguments are given *before* the query.
return self::queryv($query)->fetchAllAssoc($args[0], $args[1]);
}
+ public static function rawFetchAllAssoc($query, $id = false, $keep_array = false)
+ {
+ return self::rawQuery($query)->fetchAllAssoc($id, $keep_array);
+ }
+
public static function fetchOneCell()
{
list($args, $query) = self::findQuery(func_get_args());
return self::queryv($query)->fetchOneCell();
}
+ public static function rawFetchOneCell($query)
+ {
+ return self::rawQuery($query)->fetchOneCell();
+ }
+
public static function fetchOneRow()
{
list($args, $query) = self::findQuery(func_get_args());
return self::queryv($query)->fetchOneRow();
}
+ public static function rawFetchOneRow($query)
+ {
+ return self::rawQuery($query)->fetchOneRow();
+ }
+
public static function fetchOneAssoc()
{
list($args, $query) = self::findQuery(func_get_args());
return self::queryv($query)->fetchOneAssoc();
}
+ public static function rawFetchOneAssoc($query)
+ {
+ return self::rawQuery($query)->fetchOneAssoc();
+ }
+
/** Fetch a column from the result of the given query.
* This functions can take 1 optional arguments (cf XDBResult::fetchColumn()).
* Optional arguments are given *before* the query.
public static function fetchColumn()
{
list($args, $query) = self::findQuery(func_get_args(), array(0));
- return self::queryv($query)->fetchColumn();
+ return self::queryv($query)->fetchColumn($args[0]);
+ }
+
+ public static function rawFetchColumn($query, $key = 0)
+ {
+ return self::rawQuery($query)->fetchColumn($key);
}
public static function insertId()
}
}
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
?>