| 
<?php
 class DB_DBAbstract extends PDO {
 
 private static $instance;
 
 public $trans_started = false;
 public $trans_ok = true;
 
 public function __construct($dsn, $username, $passwd, $options=array()) {
 
 parent::__construct($dsn, $username, $passwd, $options);
 }
 
 /**
 * @final DB_DBAbstract $db
 * @param DB_DBAbstract $db
 * @return DB_DBAbstract
 */
 public static function getInstance(&$db=-1,$config=array()) {
 if(!self::$instance) {
 if(empty($config)) {
 try{
 self::$instance = new self(
 Yaf_Application::app()->getConfig()->get('db_dsn').';dbname='.
 Yaf_Application::app()->getConfig()->get('db_name'),
 Yaf_Application::app()->getConfig()->get('db_user'),
 Yaf_Application::app()->getConfig()->get('db_password'),
 array(
 PDO::ATTR_TIMEOUT => 2,
 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 )
 );
 }  catch (PDOException $err) {
 throw new Exception($err->getMessage(), $err->getCode());
 }  catch (Exception $e) {
 
 }
 self::$instance->query('SET names `'.Yaf_Application::app()->getConfig()->get('db_charset').'`');
 }else {
 try {
 self::$instance = new self(
 $config['dsn'].';dbname='.$config['name'],
 $config['user'],
 $config['password'],
 array(
 PDO::ATTR_TIMEOUT => 2,
 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 )
 );
 }  catch (PDOException $err) {
 throw new Exception($err->getMessage(), $err->getCode());
 }
 self::$instance->query('SET names `'.$config['charset'].'`');
 }
 }
 if($db!==-1)
 $db = self::$instance;
 return self::$instance;
 }
 
 public function setTransOk($ok=true) {
 $this->trans_ok = $ok;
 }
 
 public function trans_start() {
 if(!$this->trans_started && $this->beginTransaction())
 $this->trans_started = true;
 return $this->trans_started;
 }
 
 public function trans_stop() {
 if($this->inTransaction()) {
 if($this->trans_ok)
 $this->commit();
 else
 $this->rollBack();
 }
 $this->trans_started = false;
 }
 }
 |