diff -r 000000000000 -r 4eba9c11703f web/Zend/Tool/Project/Provider/DbTable.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/Zend/Tool/Project/Provider/DbTable.php Mon Dec 13 18:29:26 2010 +0100 @@ -0,0 +1,220 @@ + array('moduleName' => $moduleName)); + } + + $profileSearchParams[] = 'modelsDirectory'; + + $modelsDirectory = $profile->search($profileSearchParams); + + if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource)) { + throw new Zend_Tool_Project_Provider_Exception( + 'A models directory was not found' . + (($moduleName) ? ' for module ' . $moduleName . '.' : '.') + ); + } + + if (!($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { + $dbTableDirectory = $modelsDirectory->createResource('DbTableDirectory'); + } + + $dbTableFile = $dbTableDirectory->createResource('DbTableFile', array('dbTableName' => $dbTableName, 'actualTableName' => $actualTableName)); + + return $dbTableFile; + } + + public static function hasResource(Zend_Tool_Project_Profile $profile, $dbTableName, $moduleName = null) + { + $profileSearchParams = array(); + + if ($moduleName != null && is_string($moduleName)) { + $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); + } + + $profileSearchParams[] = 'modelsDirectory'; + + $modelsDirectory = $profile->search($profileSearchParams); + + if (!($modelsDirectory instanceof Zend_Tool_Project_Profile_Resource) + || !($dbTableDirectory = $modelsDirectory->search('DbTableDirectory'))) { + return false; + } + + $dbTableFile = $dbTableDirectory->search(array('DbTableFile' => array('dbTableName' => $dbTableName))); + + return ($dbTableFile instanceof Zend_Tool_Project_Profile_Resource) ? true : false; + } + + + public function create($name, $actualTableName, $module = null, $forceOverwrite = false) + { + $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); + + // Check that there is not a dash or underscore, return if doesnt match regex + if (preg_match('#[_-]#', $name)) { + throw new Zend_Tool_Project_Provider_Exception('DbTable names should be camel cased.'); + } + + $originalName = $name; + $name = ucfirst($name); + + if ($actualTableName == '') { + throw new Zend_Tool_Project_Provider_Exception('You must provide both the DbTable name as well as the actual db table\'s name.'); + } + + if (self::hasResource($this->_loadedProfile, $name, $module)) { + throw new Zend_Tool_Project_Provider_Exception('This project already has a DbTable named ' . $name); + } + + // get request/response object + $request = $this->_registry->getRequest(); + $response = $this->_registry->getResponse(); + + // alert the user about inline converted names + $tense = (($request->isPretend()) ? 'would be' : 'is'); + + if ($name !== $originalName) { + $response->appendContent( + 'Note: The canonical model name that ' . $tense + . ' used with other providers is "' . $name . '";' + . ' not "' . $originalName . '" as supplied', + array('color' => array('yellow')) + ); + } + + try { + $tableResource = self::createResource($this->_loadedProfile, $name, $actualTableName, $module); + } catch (Exception $e) { + $response = $this->_registry->getResponse(); + $response->setException($e); + return; + } + + // do the creation + if ($request->isPretend()) { + $response->appendContent('Would create a DbTable at ' . $tableResource->getContext()->getPath()); + } else { + $response->appendContent('Creating a DbTable at ' . $tableResource->getContext()->getPath()); + $tableResource->create(); + $this->_storeProfile(); + } + } + + public function createFromDatabase($module = null, $forceOverwrite = false) + { + $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); + + $bootstrapResource = $this->_loadedProfile->search('BootstrapFile'); + + /* @var $zendApp Zend_Application */ + $zendApp = $bootstrapResource->getApplicationInstance(); + + try { + $zendApp->bootstrap('db'); + } catch (Zend_Application_Exception $e) { + throw new Zend_Tool_Project_Provider_Exception('Db resource not available, you might need to configure a DbAdapter.'); + return; + } + + /* @var $db Zend_Db_Adapter_Abstract */ + $db = $zendApp->getBootstrap()->getResource('db'); + + $tableResources = array(); + foreach ($db->listTables() as $actualTableName) { + + $dbTableName = $this->_convertTableNameToClassName($actualTableName); + + if (!$forceOverwrite && self::hasResource($this->_loadedProfile, $dbTableName, $module)) { + throw new Zend_Tool_Project_Provider_Exception( + 'This DbTable resource already exists, if you wish to overwrite it, ' + . 'pass the "forceOverwrite" flag to this provider.' + ); + } + + $tableResources[] = self::createResource( + $this->_loadedProfile, + $dbTableName, + $actualTableName, + $module + ); + } + + if (count($tableResources) == 0) { + $this->_registry->getResponse()->appendContent('There are no tables in the selected database to write.'); + } + + // do the creation + if ($this->_registry->getRequest()->isPretend()) { + + foreach ($tableResources as $tableResource) { + $this->_registry->getResponse()->appendContent('Would create a DbTable at ' . $tableResource->getContext()->getPath()); + } + + } else { + + foreach ($tableResources as $tableResource) { + $this->_registry->getResponse()->appendContent('Creating a DbTable at ' . $tableResource->getContext()->getPath()); + $tableResource->create(); + } + + $this->_storeProfile(); + } + + + } + + protected function _convertTableNameToClassName($tableName) + { + if ($this->_nameFilter == null) { + $this->_nameFilter = new Zend_Filter(); + $this->_nameFilter + ->addFilter(new Zend_Filter_Word_UnderscoreToCamelCase()); + } + + return $this->_nameFilter->filter($tableName); + } + +} \ No newline at end of file