create the DB connection on demand; some pages don't require one at all thanks to caching

This commit is contained in:
Shish 2012-06-24 00:50:13 +01:00
parent 98e7acc529
commit d313cea8a7
2 changed files with 47 additions and 14 deletions

View File

@ -259,30 +259,44 @@ class Database {
/**
* The PDO database connection object, for anyone who wants direct access
*/
var $db;
private $db = null;
/**
* Meta info about the database engine
*/
var $engine = null;
private $engine = null;
/**
* The currently active cache engine
*/
var $cache = null;
private $cache = null;
/**
* Create a new database object using connection info
* stored in the config file
* Don't do anything yet; DB and cache connections will be created as
* and when they're needed
*/
public function Database() {
$this->connect_cache();
$this->connect_db();
}
public function __get($name) {
if($name == "engine") {
if(is_null($this->engine)) {
$this->connect_engine();
}
return $this->engine;
}
else if($name == "cache") {
if(is_null($this->cache)) {
$this->connect_cache();
}
return $this->cache;
}
else {
return $this->$name;
}
}
private function connect_cache() {
if(!is_null($this->cache)) return;
$matches = array();
if(defined("CACHE_DSN") && CACHE_DSN && preg_match("#(memcache|apc)://(.*)#", CACHE_DSN, $matches)) {
if($matches[1] == "memcache") {
@ -298,8 +312,6 @@ class Database {
}
private function connect_db() {
if(!is_null($this->db)) return;
# FIXME: detect ADODB URI, automatically translate PDO DSN
/*
@ -319,7 +331,16 @@ class Database {
if(defined("HIPHOP")) $this->db = new PDO(DATABASE_DSN, $db_user, $db_pass);
else $this->db = new PDO(DATABASE_DSN, $db_user, $db_pass, $db_params);
$db_proto = $this->db->getAttribute(PDO::ATTR_DRIVER_NAME);
$this->connect_engine();
$this->engine->init($this->db);
$this->db->beginTransaction();
}
private function connect_engine() {
if(preg_match("/^([^:]*)/", DATABASE_DSN, $matches)) $db_proto=$matches[1];
else throw new SCoreException("Can't figure out database engine");
if($db_proto === "mysql") {
$this->engine = new MySQL();
}
@ -332,8 +353,19 @@ class Database {
else {
die('Unknown PDO driver: '.$db_proto);
}
}
$this->engine->init($this->db);
public function commit() {
if(!is_null($this->db)) $this->db->commit();
}
public function rollback() {
if(!is_null($this->db)) $this->db->rollback();
}
public function escape($input) {
if(is_null($this->db)) $this->connect_db();
$this->db->Quote($input);
}
/**
@ -341,6 +373,7 @@ class Database {
*/
public function execute($query, $args=array()) {
try {
if(is_null($this->db)) $this->connect_db();
_count_execs($this->db, $query, $args);
$stmt = $this->db->prepare($query);
if (!array_key_exists(0, $args)) {

View File

@ -69,7 +69,7 @@ function url_escape($input) {
*/
function sql_escape($input) {
global $database;
return $database->db->Quote($input);
return $database->escape($input);
}