*/ abstract class Mage_Core_Model_Resource_Abstract { /** * Main constructor */ public function __construct() { /** * Please override this one instead of overriding real __construct constructor */ $this->_construct(); } /** * Array of callbacks subscribed to commit transaction commit * * @var array */ static protected $_commitCallbacks = array(); /** * Resource initialization */ abstract protected function _construct(); /** * Retrieve connection for read data */ abstract protected function _getReadAdapter(); /** * Retrieve connection for write data */ abstract protected function _getWriteAdapter(); /** * Start resource transaction * * @return Mage_Core_Model_Resource_Abstract */ public function beginTransaction() { $this->_getWriteAdapter()->beginTransaction(); return $this; } /** * Subscribe some callback to transaction commit * * @param callback $callback * @return Mage_Core_Model_Resource_Abstract */ public function addCommitCallback($callback) { $adapterKey = spl_object_hash($this->_getWriteAdapter()); self::$_commitCallbacks[$adapterKey][] = $callback; return $this; } /** * Commit resource transaction * * @return Mage_Core_Model_Resource_Abstract */ public function commit() { $this->_getWriteAdapter()->commit(); /** * Process after commit callbacks */ if ($this->_getWriteAdapter()->getTransactionLevel() === 0) { $adapterKey = spl_object_hash($this->_getWriteAdapter()); if (isset(self::$_commitCallbacks[$adapterKey])) { $callbacks = self::$_commitCallbacks[$adapterKey]; self::$_commitCallbacks[$adapterKey] = array(); foreach ($callbacks as $index => $callback) { call_user_func($callback); } } } return $this; } /** * Roll back resource transaction * * @return Mage_Core_Model_Resource_Abstract */ public function rollBack() { $this->_getWriteAdapter()->rollBack(); if ($this->_getWriteAdapter()->getTransactionLevel() === 0) { $adapterKey = spl_object_hash($this->_getWriteAdapter()); if (isset(self::$_commitCallbacks[$adapterKey])) { self::$_commitCallbacks[$adapterKey] = array(); } } return $this; } /** * Format date to internal format * * @param string|Zend_Date $date * @param bool $includeTime * @return string */ public function formatDate($date, $includeTime=true) { return Varien_Date::formatDate($date, $includeTime); } /** * Convert internal date to UNIX timestamp * * @param string $str * @return int */ public function mktime($str) { return Varien_Date::toTimestamp($str); } /** * Serialize specified field in an object * * @param Varien_Object $object * @param string $field * @param mixed $defaultValue * @param bool $unsetEmpty * @return Mage_Core_Model_Resource_Abstract */ protected function _serializeField(Varien_Object $object, $field, $defaultValue = null, $unsetEmpty = false) { $value = $object->getData($field); if (empty($value)) { if ($unsetEmpty) { $object->unsetData($field); } else { if (is_object($defaultValue) || is_array($defaultValue)) { $defaultValue = serialize($defaultValue); } $object->setData($field, $defaultValue); } } elseif (is_array($value) || is_object($value)) { $object->setData($field, serialize($value)); } return $this; } /** * Unserialize Varien_Object field in an object * * @param Mage_Core_Model_Abstract $object * @param string $field * @param mixed $defaultValue */ protected function _unserializeField(Varien_Object $object, $field, $defaultValue = null) { $value = $object->getData($field); if (empty($value)) { $object->setData($field, $defaultValue); } elseif (!is_array($value) && !is_object($value)) { $object->setData($field, unserialize($value)); } } /** * Prepare data for passed table * * @param Varien_Object $object * @param string $table * @return array */ protected function _prepareDataForTable(Varien_Object $object, $table) { $data = array(); $fields = $this->_getWriteAdapter()->describeTable($table); foreach (array_keys($fields) as $field) { if ($object->hasData($field)) { $fieldValue = $object->getData($field); if ($fieldValue instanceof Zend_Db_Expr) { $data[$field] = $fieldValue; } else { if (null !== $fieldValue) { $fieldValue = $this->_prepareTableValueForSave($fieldValue, $fields[$field]['DATA_TYPE']); $data[$field] = $this->_getWriteAdapter()->prepareColumnValue($fields[$field], $fieldValue); } else if (!empty($fields[$field]['NULLABLE'])) { $data[$field] = null; } } } } return $data; } /** * Prepare value for save * * @param mixed $value * @param string $type * @return mixed */ protected function _prepareTableValueForSave($value, $type) { $type = strtolower($type); if ($type == 'decimal' || $type == 'numeric' || $type == 'float') { $value = Mage::app()->getLocale()->getNumber($value); } return $value; } }