diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 09309b7715..eab4c172c0 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -34,15 +34,13 @@ class DBObjectSearch private $m_aReferencedBy; private $m_aRelatedTo; - public function __construct($sClass, $sClassAlias = '') + public function __construct($sClass, $sClassAlias = null) { - if (empty($sClassAlias)) $sClassAlias = $sClass; + if (is_null($sClassAlias)) $sClassAlias = $sClass; assert('is_string($sClass)'); assert('MetaModel::IsValidClass($sClass)'); // #@# could do better than an assert, or at least give the caller's reference // => idee d'un assert avec call stack (autre utilisation = echec sur query SQL) - if (empty($sClassAlias)) $sClassAlias = $sClass; - $this->m_aSelectedClasses = array($sClassAlias => $sClass); $this->m_aClasses = array($sClassAlias => $sClass); $this->m_oSearchCondition = new TrueExpression; diff --git a/core/metamodel.class.php b/core/metamodel.class.php index a306a09e1a..44da9e13f9 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -2146,6 +2146,7 @@ abstract class MetaModel CMDBSource::CreateDB(self::$m_sDBName); } self::DBCreateTables(); + self::DBCreateViews(); } protected static function DBCreateTables() @@ -2169,6 +2170,25 @@ abstract class MetaModel // $sDoCreateAll = implode(" ; ", $aSQL); } + protected static function DBCreateViews() + { + list($aErrors, $aSugFix) = self::DBCheckViews(); + + $aSQL = array(); + foreach ($aSugFix as $sClass => $aTarget) + { + foreach ($aTarget as $aQueries) + { + foreach ($aQueries as $sQuery) + { + //$aSQL[] = $sQuery; + // forces a refresh of cached information + CMDBSource::CreateTable($sQuery); + } + } + } + } + public static function DBDump() { $aDataDump = array(); @@ -2411,6 +2431,26 @@ abstract class MetaModel return array($aErrors, $aSugFix); } + public static function DBCheckViews() + { + $aErrors = array(); + $aSugFix = array(); + + // Reporting views (must be created after any other table) + // + foreach (self::GetClasses('bizmodel') as $sClass) + { + $sView = "view_$sClass"; + if (!CMDBSource::IsTable($sView)) + { + $oFilter = new DBObjectSearch($sClass, ''); + $sSQL = self::MakeSelectQuery($oFilter); + $aErrors[$sClass]['*'][] = "Missing view for class: $sClass"; + $aSugFix[$sClass]['*'][] = "CREATE VIEW `$sView` AS $sSQL"; + } + } + return array($aErrors, $aSugFix); + } private static function DBCheckIntegrity_Check2Delete($sSelWrongRecs, $sErrorDesc, $sClass, &$aErrorsAndFixes, &$iNewDelCount, &$aPlannedDel, $bProcessingFriends = false) { diff --git a/pages/ITopConsultant.php b/pages/ITopConsultant.php index 7c918c7175..29e7d54712 100644 --- a/pages/ITopConsultant.php +++ b/pages/ITopConsultant.php @@ -287,10 +287,11 @@ function printMenu($sConfigFile) echo "
Wrong declaration for attribute $sTarget
\n"; + if ($sTarget != '*') + { + echo "Wrong declaration for attribute $sTarget
\n"; + } $sMsg = implode(' AND ', $aMessages); if (!empty($sRepairUrl)) { @@ -518,6 +522,12 @@ else DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql"); echo "done...\n"; break; + case "checkmodeltoviews": + echo "Check Views...\n"; + list($aErrors, $aSugFix) = MetaModel::DBCheckViews(); + DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql"); + echo "done...\n"; + break; case "checkdb": echo "Check DB integrity...\n"; MetaModel::DBCheckIntegrity($sBaseUrl, "sql"); @@ -541,6 +551,10 @@ else list($aErrors, $aSugFix) = MetaModel::DBCheckFormat(); DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql"); echo "done...\n"; + echo "Check Views...\n"; + list($aErrors, $aSugFix) = MetaModel::DBCheckViews(); + DisplayDBFormatIssues($aErrors, $aSugFix, $sBaseUrl, $sSQLStatementArgName = "sql"); + echo "done...\n"; echo "Check DB integrity...\n"; MetaModel::DBCheckIntegrity($sBaseUrl, "sql"); echo "done...\n";