This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/lib/db_accessor.inc

127 lines
2.6 KiB
PHP

<?php
class db_accessor {
private static $lastNamespace = null;
private $db;
private $namespace;
public function __construct($db, $namespace) {
$this->db = $db;
$this->namespace = $namespace;
}
public function setNamespace() {
if (self::$lastNamespace === $this->namespace) {
return;
}
if (is_null($this->namespace) || $this->namespace == '') {
$this->db->query('SET search_path=public,main');
} else {
$this->db->query('SET search_path=public,main,' . $this->namespace);
}
self::$lastNamespace = $this->namespace;
}
public function enableExceptions() {
$this->db->enableExceptions();
}
public function disableExceptions() {
$this->db->disableExceptions();
}
public function query($q) {
$this->setNamespace();
return $this->db->query($q);
}
public function begin() {
$this->db->begin();
}
public function end($rb = false) {
return $this->db->end($rb);
}
public function needsReset() {
return $this->db->needsReset();
}
public function reset($attempts = 5, $delay = 1) {
if ($rv = $this->db->reset($attempts, $delay)) {
self::$lastNamespace = false;
}
return $rv;
}
/** This method starts a transaction and runs in safely, trying to reset the connection
* if it fails.
*/
public function safeTransaction($callback, $args = null, $maxResets = 1,
$attempts = 5, $delay = 1, $maxDeadlocks = 10) {
if (is_null($args)) {
$args = array();
} elseif (!is_array($args)) {
$args = array($args);
}
$resets = $deadlocks = 0;
$this->enableExceptions();
try {
do {
$ok = false;
try {
$this->begin();
$returnValue = call_user_func_array($callback, $args);
$this->end();
$ok = true;
} catch (db_deadlock_exception $e) {
/* $this->end(false);
self::$lastNamespace = false;
if ($deadlocks == $maxDeadlocks) { */
throw $e;
// }
// $deadlocks ++;
} catch (db_sql_exception $e) {
$this->end();
throw $e;
} catch (db_srv_exception $e) {
if ($resets == $maxResets) {
throw $e;
}
$this->reset($attempts, $delay);
$resets ++;
}
} while (!$ok);
} catch (Exception $e) {
$this->disableExceptions();
throw $e;
}
$this->disableExceptions();
return $returnValue;
}
/** This method copies raw data into a table.
*/
public function copyTo($tableName, $data) {
$this->setNamespace();
return $this->db->copyTo($tableName, $data);
}
/** This method copies raw data from a table.
*/
public function copyFrom($tableName) {
$this->setNamespace();
return $this->db->copyFrom($tableName);
}
}
?>