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 * The PDO database connection object, for anyone who wants direct access
*/ */
var $db; private $db = null;
/** /**
* Meta info about the database engine * Meta info about the database engine
*/ */
var $engine = null; private $engine = null;
/** /**
* The currently active cache engine * The currently active cache engine
*/ */
var $cache = null; private $cache = null;
/** /**
* Create a new database object using connection info * Don't do anything yet; DB and cache connections will be created as
* stored in the config file * and when they're needed
*/ */
public function Database() { 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() { private function connect_cache() {
if(!is_null($this->cache)) return;
$matches = array(); $matches = array();
if(defined("CACHE_DSN") && CACHE_DSN && preg_match("#(memcache|apc)://(.*)#", CACHE_DSN, $matches)) { if(defined("CACHE_DSN") && CACHE_DSN && preg_match("#(memcache|apc)://(.*)#", CACHE_DSN, $matches)) {
if($matches[1] == "memcache") { if($matches[1] == "memcache") {
@ -298,8 +312,6 @@ class Database {
} }
private function connect_db() { private function connect_db() {
if(!is_null($this->db)) return;
# FIXME: detect ADODB URI, automatically translate PDO DSN # 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); 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); 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") { if($db_proto === "mysql") {
$this->engine = new MySQL(); $this->engine = new MySQL();
} }
@ -332,8 +353,19 @@ class Database {
else { else {
die('Unknown PDO driver: '.$db_proto); 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()) { public function execute($query, $args=array()) {
try { try {
if(is_null($this->db)) $this->connect_db();
_count_execs($this->db, $query, $args); _count_execs($this->db, $query, $args);
$stmt = $this->db->prepare($query); $stmt = $this->db->prepare($query);
if (!array_key_exists(0, $args)) { if (!array_key_exists(0, $args)) {

View File

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