/** * Creates a Datatype object for insertion into the passed table. The table's * database engine type is checked first. This allows database specific data * type instructions to be used. * * @param \Database\Table $table * @param string $name Name of column/data type * @param string $type Data type * @param string $value Default value for column * @return \Database\Datatype Returns an extension of Datatype * @throws \Exception */ public static function factory(Table $table, $name, $type, $value = null) { $engine = $table->db->getDatabaseType(); $alltypes = $table->getDatatypeList(); $type = strtolower($type); if (empty($type)) { throw new \Exception(\t('Data type was empty')); } if (!isset($alltypes[$type])) { throw new \Exception(\t('Unknown data type "%s"', $type)); } $class_name = ucwords($alltypes[$type]); $class_file = PHPWS_SOURCE_DIR . "Global/Database/Datatype/{$class_name}.php"; $engine_file = PHPWS_SOURCE_DIR . "Global/Database/Engine/{$engine}/Datatype/{$class_name}.php"; if (is_file($engine_file)) { $datatype_name = "\\Database\\Engine\\{$engine}\\Datatype\\{$class_name}"; } elseif (is_file($class_file)) { $datatype_name = "\\Database\\Datatype\\{$class_name}"; } else { throw new \Exception(\t('Unknown class name "%s"', $class_name)); } $object = new $datatype_name($table, $name); if ($object->default instanceof \Variable) { $object->setDefault($value); } return $object; }