--- a/busui/owa/owa_entity.php +++ b/busui/owa/owa_entity.php @@ -1,1 +1,670 @@ + + * @copyright Copyright © 2006 Peter Adams + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.0.0 + */ + +class owa_entity { + + var $name; + var $properties = array(); + var $_tableProperties = array(); + var $wasPersisted; + var $cache; + + function __construct($cache = '', $db = '') { + + } + + + function _getProperties() { + + $properties = array(); + + if (!empty($this->properties)) { + $vars = $this->properties; + } + + foreach ($vars as $k => $v) { + + $properties[$k] = $v->getValue(); + + } + + return $properties; + } + + function getColumns($return_as_string = false, $as_namespace = '', $table_namespace = false) { + + if (!empty($this->properties)) { + $all_cols = array_keys($this->properties); + $all_cols = array_flip($all_cols); + } + + //print_r($all_cols); + + $table = $this->getTableName(); + $new_cols = array(); + $ns = ''; + $as = ''; + + if (!empty($table_namespace)): + $ns = $table.'.'; + endif; + + foreach ($all_cols as $k => $v) { + + if (!empty($as_namespace)): + $as = ' AS '.$as_namespace.$k; + endif; + + $new_cols[] = $ns.$k.$as; + } + + // add implode as string here + + if ($return_as_string == true): + $new_cols = implode(', ', $new_cols); + endif; + + //print_r($new_cols); + return $new_cols; + + } + + function getColumnsSql($as_namespace = '', $table_namespace = true) { + + return $this->getColumns(true, $as_namespace, $table_namespace); + } + + /** + * Sets object attributes + * + * @param unknown_type $array + */ + function setProperties($array, $apply_filters = false) { + + $properties = $this->getColumns(); + + foreach ($properties as $k => $v) { + + if ( ! empty( $array[$v] ) ) { + if ( ! empty( $this->properties ) ) { + $this->set($v, $array[$v], $apply_filters); + } + } + } + } + + function setGuid($string) { + + return owa_lib::setStringGuid($string); + + } + + function set($name, $value, $filter = true) { + + if ( array_key_exists( $name, $this->properties ) ) { + $method = $name.'SetFilter'; + if ( $filter && method_exists( $this, $method ) ) { + $this->properties[$name]->setValue( $this->$method( $value ) ); + } else { + $this->properties[$name]->setValue( $value ); + } + } + } + + // depricated + function setValues($values) { + + return $this->setProperties($values); + } + + function get($name, $filter = true) { + + if (array_key_exists($name, $this->properties)) { + $method = $name.'GetFilter'; + if ( $filter && method_exists($this, $method) ) { + return $this->$method( $this->properties[$name]->getValue() ); + } else { + return $this->properties[$name]->getValue(); + } + } + } + + function getTableOptions() { + + if ($this->_tableProperties) { + if (array_key_exists('table_type', $this->_tableProperties)) { + return $this->_tableProperties['table_type']; + } + } + + return array('table_type' => 'disk'); + + } + + /** + * Persist new object + * + */ + function create() { + + $db = owa_coreAPI::dbSingleton(); + $all_cols = $this->getColumns(); + + $db->insertInto($this->getTableName()); + + // Control loop + foreach ($all_cols as $k => $v){ + + // drop column is it is marked as auto-incement as DB will take care of that. + if ($this->properties[$v]->auto_increment === true): + ; + else: + $db->set($v, $this->get($v, false)); + endif; + + } + + // Persist object + $status = $db->executeQuery(); + + // Add to Cache + if ($status == true) { + $this->addToCache(); + } + + return $status; + } + + function save() { + + if ( $this->wasPersisted ) { + return $this->update(); + } else { + return $this->create(); + } + } + + function addToCache($col = 'id') { + + if($this->isCachable()) { + $cache = &owa_coreAPI::cacheSingleton(); + $cache->setCollectionExpirationPeriod($this->getTableName(), $this->getCacheExpirationPeriod()); + $cache->set($this->getTableName(), $col.$this->get('id'), $this, $this->getCacheExpirationPeriod()); + } + } + + /** + * Update all properties of an Existing object + * + */ + function update($where = '') { + + $db = owa_coreAPI::dbSingleton(); + $db->updateTable($this->getTableName()); + + // get column list + $all_cols = $this->getColumns(); + + + // Control loop + foreach ($all_cols as $k => $v){ + + // drop column is it is marked as auto-incement as DB will take care of that. + + if ($this->get($v, false)) { + $db->set($v, $this->get($v, false)); + } + } + + if(empty($where)): + $id = $this->get('id'); + $db->where('id', $id); + + else: + $db->where($where, $this->get($where)); + endif; + + // Persist object + $status = $db->executeQuery(); + // Add to Cache + if ($status === true) { + $this->addToCache(); + } + + return $status; + + } + + /** + * Update named list of properties of an existing object + * + * @param array $named_properties + * @param array $where + * @return boolean + */ + function partialUpdate($named_properties, $where) { + + $db = &owa_coreAPI::dbSingleton(); + $db->updateTable($this->getTableName()); + + foreach ($named_properties as $v) { + + if ($this->get($v)){ + $db->set($v, $this->get($v)); + } + } + + if(empty($where)): + $db->where('id', $this->get('id')); + else: + $db->where($where, $this->get($where)); + endif; + + // Persist object + $status = $db->executeQuery(); + // Add to Cache + if ($status == true) { + $this->addToCache(); + } + + return $status; + } + + + /** + * Delete Object + * + */ + function delete($value = '', $col = 'id') { + + $db = owa_coreAPI::dbSingleton(); + $db->deleteFrom($this->getTableName()); + + if (empty($value)) { + $value = $this->get('id'); + } + + $db->where($col, $value); + + $status = $db->executeQuery(); + + // Add to Cache + if ($status == true){ + if ($this->isCachable()) { + $cache = &owa_coreAPI::cacheSingleton(); + $cache->remove($this->getTableName(), 'id'.$this->get('id')); + } + } + + return $status; + + } + + function load($value, $col = 'id') { + + return $this->getByColumn($col, $value); + + } + + function getByPk($col, $value) { + + return $this->getByColumn($col, $value); + + } + + function getByColumn($col, $value) { + + $cache_obj = ''; + + if ($this->isCachable()) { + $cache = &owa_coreAPI::cacheSingleton(); + $cache->setCollectionExpirationPeriod($this->getTableName(), $this->getCacheExpirationPeriod()); + $cache_obj = $cache->get($this->getTableName(), $col.$value); + } + + if (!empty($cache_obj)) { + + $cache_obj_properties = $cache_obj->_getProperties(); + $this->setProperties($cache_obj_properties); + $this->wasPersisted = true; + + } else { + + $db = owa_coreAPI::dbSingleton(); + $db->selectFrom($this->getTableName()); + $db->selectColumn('*'); + $db->where($col, $value); + $properties = $db->getOneRow(); + + if (!empty($properties)) { + + $this->setProperties($properties); + $this->wasPersisted = true; + // add to cache + $this->addToCache($col); + owa_coreAPI::debug('entity loaded from db'); + } + } + } + + function getTableName() { + + if ($this->_tableProperties) { + return $this->_tableProperties['name']; + } else { + return get_class($this); + } + + } + + function getTableAlias() { + + if ($this->_tableProperties) { + return $this->_tableProperties['alias']; + } + } + + function setTableName($name, $namespace = 'owa_') { + + $this->_tableProperties['alias'] = $name; + $this->_tableProperties['name'] = $namespace.$name; + } + + /** + * Sets the entity as cachable for some period of time + * + * @todo make this use the getSetting method but that requires a refactoring of + * the entity abstract class to not use an entity in it's constructor + */ + function setCachable($seconds = '') { + + $this->_tableProperties['cacheable'] = true; + + // set cache expiration period + if (!$seconds) { + // remove hard coded value. fix this see note above. + //$seconds = owa_coreAPI::getSetting('base', 'default_cache_expiration_period'); + $seconds = 604800; + } + + $this->setCacheExpirationPeriod($seconds); + } + + function isCachable() { + + if (owa_coreAPI::getSetting('base', 'cache_objects')) { + if (array_key_exists('cacheable', $this->_tableProperties)) { + return $this->_tableProperties['cacheable']; + } + } else { + return false; + } + + } + + function setPrimaryKey($col) { + //backwards compatability + $this->properties[$col]->setPrimaryKey(); + $this->_tableProperties['primary_key'] = $col; + + } + + function getForeignKeyColumn($entity) { + if (array_key_exists('relatedEntities', $this->_tableProperties)) { + if (array_key_exists($entity, $this->_tableProperties['relatedEntities'])) { + return $this->_tableProperties['relatedEntities'][$entity]; + } + } + } + + function isForeignKeyColumn($col) { + + if (array_key_exists($col, $this->properties)) { + return $this->properties[$col]->isForeignKey(); + } + } + + function getAllForeignKeys() { + + return; + } + + /** + * Create Table + * + * Handled by DB abstraction layer because the SQL associated with this is way too DB specific + */ + function createTable() { + + $db = owa_coreAPI::dbSingleton(); + // Persist table + $status = $db->createTable($this); + + if ($status == true): + owa_coreAPI::notice(sprintf("%s Table Created.", $this->getTableName())); + return true; + else: + owa_coreAPI::notice(sprintf("%s Table Creation Failed.", $this->getTableName())); + return false; + endif; + + } + + /** + * DROP Table + * + * Drops a table. will throw error is table does not exist + */ + function dropTable() { + + $db = owa_coreAPI::dbSingleton(); + // Persist table + $status = $db->dropTable($this->getTableName()); + + if ($status == true): + return true; + else: + return false; + endif; + + } + + function addColumn($column_name) { + + $def = $this->getColumnDefinition($column_name); + // Persist table + $db = owa_coreAPI::dbSingleton(); + $status = $db->addColumn($this->getTableName(), $column_name, $def); + + if ($status == true): + return true; + else: + return false; + endif; + + } + + function dropColumn($column_name) { + + $db = owa_coreAPI::dbSingleton(); + $status = $db->dropColumn($this->getTableName(), $column_name); + + if ($status == true): + return true; + else: + return false; + endif; + + } + + function modifyColumn($column_name) { + + $def = $this->getColumnDefinition($column_name); + $db = owa_coreAPI::dbSingleton(); + $status = $db->modifyColumn($this->getTableName(), $column_name, $def); + + if ($status == true): + return true; + else: + return false; + endif; + + + } + + function renameColumn($old_column_name, $column_name, $use_old_column_for_defs = false) { + + if ($use_old_column_for_defs) { + $def = $this->getColumnDefinition($old_column_name); + } else { + $def = $this->getColumnDefinition($column_name); + } + + $db = owa_coreAPI::dbSingleton(); + $status = $db->renameColumn($this->getTableName(), $old_column_name, $column_name, $def); + + if ($status == true): + return true; + else: + return false; + endif; + + } + + function renameTable($new_table_name) { + + $db = owa_coreAPI::dbSingleton(); + $status = $db->renameTable($this->getTableName(), $new_table_name); + + if ($status == true): + return true; + else: + return false; + endif; + return; + } + + function getColumnDefinition($column_name) { + + if (empty($this->properties)) { + return $this->$column_name->getDefinition(); + } else { + return $this->properties[$column_name]->getDefinition(); + } + } + + function setProperty($obj) { + + $this->properties[$obj->get('name')] = $obj; + + if ($obj->isForeignKey()) { + $fk = $obj->getForeignKey(); + + $this->_tableProperties['relatedEntities'][$fk[0]] = $obj->getName(); + $this->_tableProperties['foreign_keys'][$obj->getName()] = $fk[0]; + } + + } + + function getProperty($name) { + if (array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + } + + function generateRandomUid($seed = '') { + + return crc32($_SERVER['SERVER_ADDR'].$_SERVER['SERVER_NAME'].getmypid().$this->getTableName().microtime().$seed.rand()); + } + + /** + * Create guid from string + * + * @param string $string + * @return integer + */ + function generateId($string) { + //require_once(OWA_DIR.'owa_lib.php'); + return owa_lib::setStringGuid($string); + } + + function setCacheExpirationPeriod($seconds) { + + $this->_tableProperties['cache_expiration_period'] = $seconds; + } + + function getCacheExpirationPeriod() { + + if (array_key_exists('cache_expiration_period', $this->_tableProperties)) { + return $this->_tableProperties['cache_expiration_period']; + } else { + // default of thirty days + return (3600); + } + } + + function getName() { + + return $this->name; + } + + function setSummaryLevel($num) { + + $this->_tableProperties['summary_level'] = $num; + } + + function getSummaryLevel() { + + if (array_key_exists('summary_level', $this->_tableProperties)) { + + return $this->_tableProperties['summary_level']; + + } else { + + return 0; + } + } + + function setCharacterEncoding($encoding) { + + $this->_tableProperties['character_encoding'] = $encoding; + } + + function wasPersisted() { + return $this->wasPersisted; + } +} + +?>