/** * classic factory method for loading a table class * usage: $do = DB_DataObject2::factory('person') * WARNING - this may emit a include error if the file does not exist.. * use @ to silence it (if you are sure it is acceptable) * eg. $do = @DB_DataObject2::factory('person') * * table name will eventually be databasename/table * - and allow modular dataobjects to be written.. * (this also helps proxy creation) * * * @param string $1 tablename/databasename/query * @param string $2 tablename/query * @param string $3 bool * @access protected * @return DataObject|PEAR_Error|Array */ public static function factory() { if (empty(DB_DataObject2::$CONFIG)) { DB_DataObject2::_loadConfig(); } $args = func_get_args(); switch (count($args)) { case 1: if (DB_DataObject2::$CONFIG['default_database']) { $database = DB_DataObject2::$CONFIG['default_database']; } else { throw new Exception('no default database set'); } if (strpos($args[0], ' ') !== false) { $query = $args[0]; } else { $table = $args[0]; } break; case 2: case 3: $database = $args[0]; if (strpos($args[1], ' ') !== false) { $query = $args[1]; if (isset($args[2]) && $args[2]) { $array = true; } else { $array = false; } } else { $table = $args[1]; } break; } /* if ($database === '') { throw new Exception('no support for default database right now'); } */ if (!isset($table) && !isset($query)) { if (is_a($this, 'DB_DataObject2') && strlen($this->__table)) { $table = $this->__table; } else { throw new Exception("factory did not receive a table name", DB_DATAOBJECT_ERROR_INVALIDARGS); } } if (isset($table)) { $p = isset(DB_DataObject2::$CONFIG['class_prefix']) ? DB_DataObject2::$CONFIG['class_prefix'] : ''; $class = $p . preg_replace('/[^A-Z0-9]/i', '_', ucfirst(trim($database . '_' . $table))); $classname = $class; $ce = class_exists($class, false); $class = $ce ? $class : DB_DataObject2::_autoloadClass($table, $database); // proxy = full|light if (!$class && isset(DB_DataObject2::$CONFIG['proxy'])) { $proxyMethod = 'getProxy' . DB_DataObject2::$CONFIG['proxy']; class_exists('DB_DataObject2_Generator', false) ? '' : (require_once DATAOBJECT2_PATH . '/Generator.php'); if (isset(DB_DataObject2::$CONFIG['extends'])) { $d = new DB_DataObject2::$CONFIG['extends'](); } else { $d = new DB_DataObject2(); } $d->__table = $table; $d->setDatabase($database); if (is_a($ret = $d->_connect(), 'PEAR_Error')) { return $ret; } $x = new DB_DataObject2_Generator(); return $x->{$proxyMethod}($d->_database, $table); } if (!$class) { throw new Exception("DB_DataObject2: factory could not find class {$classname} from {$table}", DB_DATAOBJECT_ERROR_INVALIDCONFIG); } return new $class(); } elseif (isset($query)) { if (isset(DB_DataObject2::$CONFIG['extends'])) { $d = new DB_DataObject2::$CONFIG['extends'](); } else { $d = new DB_DataObject2(); } $d->setDatabase($database); $d->query($query); if ($array) { return $d->fetchAllArray(); } else { return $d; } } else { throw new Exception('DB_DataObject2: dont know how to handle no $table and no $query in factory', DB_DATAOBJECT_ERROR_INVALIDARGS); } }