* @author Romain Quetiez * @author Denis Flaven * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL */ function sexyclass($sClass, $sBaseArgs) { return "Class $sClass"; } function sexyclasslist($aClasses, $sBaseArgs) { if (count($aClasses) == 0) return ""; $aRes = array(); foreach($aClasses as $sClass) { $aRes[] = sexyclass($sClass, $sBaseArgs); } return ("'".implode("', '", $aRes)."'"); } function ShowClass($sClass, $sBaseArgs) { if (!MetaModel::IsValidClass($sClass)) { echo "Invalid class, expecting a value in {".sexyclasslist(MetaModel::GetClasses(), $sBaseArgs)."}
\n"; return; } // en recursif jusque "": MetaModel::GetParentPersistentClass($sClass) $aProps["Root class"] = MetaModel::GetRootClass($sClass); $aProps["Parent classes"] = sexyclasslist(MetaModel::EnumParentClasses($sClass), $sBaseArgs); $aProps["Child classes"] = sexyclasslist(MetaModel::EnumChildClasses($sClass), $sBaseArgs); $aProps["Subclasses (children + pure PHP)"] = sexyclasslist(MetaModel::GetSubclasses($sClass), $sBaseArgs); $aProps["Description"] = MetaModel::GetClassDescription($sClass); $aProps["Autoincrement id?"] = MetaModel::IsAutoIncrementKey($sClass); $aProps["Name attribute"] = MetaModel::GetNameAttributeCode($sClass); $aProps["Reconciliation keys"] = implode(", ", MetaModel::GetReconcKeys($sClass)); $aProps["DB key column"] = MetaModel::DBGetKey($sClass); $aProps["DB class column"] = MetaModel::DBGetClassField($sClass); $aProps["Is standalone?"] = MetaModel::IsStandaloneClass($sClass); foreach (MetaModel::ListAttributeDefs($sClass) as $oAttDef) { $aAttProps = array(); $aAttProps["Direct field"] = $oAttDef->IsDirectField(); $aAttProps["External key"] = $oAttDef->IsExternalKey(); $aAttProps["External field"] = $oAttDef->IsExternalField(); $aAttProps["Link set"] = $oAttDef->IsLinkSet(); $aAttProps["Code"] = $oAttDef->GetCode(); $aAttProps["Label"] = $oAttDef->GetLabel(); $aAttProps["Description"] = $oAttDef->GetDescription(); $oValDef = $oAttDef->GetValuesDef(); if (is_object($oValDef)) { //$aAttProps["Allowed values"] = $oValDef->Describe(); $aAttProps["Allowed values"] = "... object of class ".get_class($oValDef); } else { $aAttProps["Allowed values"] = ""; } // MetaModel::IsAttributeInZList($sClass, $sListCode, $sAttCodeOrFltCode) } // $aProps["Description"] = MetaModel::DBGetTable($sClass, $sAttCode = null) $aAttributes = array(); foreach (MetaModel::GetClassFilterDefs($sClass) as $oFilterDef) { $aAttProps = array(); $aAttProps["Label"] = $oFilterDef->GetLabel(); $aOpDescs = array(); foreach ($oFilterDef->GetOperators() as $sOpCode => $sOpDescription) { $sIsTheLooser = ($sOpCode == $oFilterDef->GetLooseOperator()) ? " (loose search)" : ""; $aOpDescs[] = "$sOpCode ($sOpDescription)$sIsTheLooser"; } $aAttProps["Operators"] = implode(" / ", $aOpDescs); $aAttributes[] = $aAttProps; } $aProps["Filters"] = MyHelpers::make_table_from_assoc_array($aAttributes); foreach ($aProps as $sKey => $sDesc) { echo "

$sKey

\n"; echo "

$sDesc

\n"; } } function ShowBizModel($sBaseArgs) { echo "\n"; } function ShowZLists($sBaseArgs) { $aData = array(); // 1 row per class, header made after the first row keys // foreach(MetaModel::GetClasses() as $sClass) { $aRow = array(); $aRow["_"] = $sClass; foreach (MetaModel::EnumZLists() as $sListCode) { $aRow[$sListCode] = implode(", ", MetaModel::GetZListItems($sClass, $sListCode)); } $aData[] = $aRow; } echo MyHelpers::make_table_from_assoc_array($aData); } function ShowDatabaseInfo() { $aTables = array(); foreach (CMDBSource::EnumTables() as $sTable) { $aTableData = array(); $aTableData["Name"] = $sTable; $aTableDesc = CMDBSource::GetTableInfo($sTable); $aTableData["Fields"] = MyHelpers::make_table_from_assoc_array($aTableDesc["Fields"]); $aTables[$sTable] = $aTableData; } echo MyHelpers::make_table_from_assoc_array($aTables); } function CreateDB() { $sRes = "

Creating the DB...

\n"; if (MetaModel::DBExists(false)) { $sRes .= "

It appears that the DB already exists (at least one table).

\n"; } else { MetaModel::DBCreate(); $sRes .= "

Done!

\n"; } return $sRes; } function DebugQuery($sConfigFile) { $sQuery = ReadParam("oql"); if (empty($sQuery)) { $sQueryTemplate = "SELECT Foo AS f JOIN Dummy AS D ON d.spirit = f.id WHERE f.age * d.height > TO_DAYS(NOW()) OR d.alive"; } else { $sQueryTemplate = $sQuery; } echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
\n"; if (empty($sQuery)) return; echo "

Testing query

\n"; echo "

$sQuery

\n"; echo "

Follow up the query build

\n"; MetaModel::StartDebugQuery(); $oFlt = DBObjectSearch::FromOQL($sQuery); echo "

To OQL: ".$oFlt->ToOQL()."

"; $sSQL = MetaModel::MakeSelectQuery($oFlt); MetaModel::StopDebugQuery(); echo "

Explain

\n"; echo "\n"; foreach (CMDBSource::ExplainQuery($sSQL) as $aRow) { echo " \n"; echo " \n"; echo " \n"; } echo "
".implode('', $aRow)."
\n"; echo "

Results

\n"; $oSet = new CMDBObjectSet($oFlt); echo $oSet; // __toString() } function DumpDatabase() { $aData = MetaModel::DBDump(); foreach ($aData as $sTable => $aRows) { echo "

".htmlentities($sTable)."

\n"; if (count($aRows) == 0) { echo "

no data

\n"; } else { echo "

".count($aRows)." row(s)

\n"; // Table header echo "\n"; echo "\n"; foreach (reset($aRows) as $key => $value) { echo ""; } echo "\n"; // Table body foreach ($aRows as $aRow) { echo "\n"; foreach ($aRow as $key => $value) { echo ""; } echo "\n"; } echo "
".htmlentities($key)."
".htmlentities($value)."
\n"; } } } ///////////////////////////////////////////////////////////////////////////////////// // Helper functions ///////////////////////////////////////////////////////////////////////////////////// function printMenu($sConfigFile) { $sClassCount = count(MetaModel::GetClasses()); $bHasDB = MetaModel::DBExists(false); // no need to be complete to consider that something already exists $sUrl = "?config=".urlencode($sConfigFile); echo "
\n"; echo "

phpMyORM integration sandbox

\n"; echo "

Target database: $sConfigFile

\n"; echo "

$sClassCount classes referenced in the model

\n"; echo ""; echo "
\n"; } function printConfigList() { echo "

phpMyORM integration sandbox

\n"; echo "

Configuration sumary

\n"; $sBasePath = '..'; $aConfigs = array(); foreach(scandir($sBasePath) as $sFile) { if (preg_match('/^config-.+\\.php$/', $sFile)) $aConfigs[] = $sFile; } $aConfigDetails = array(); foreach ($aConfigs as $sConfigFile) { $sRealPath = $sBasePath.'/'.$sConfigFile; $oConfig = new Config($sRealPath); $sAppModules = implode(', ', $oConfig->GetAppModules()); $sDataModels = implode(', ', $oConfig->GetDataModels()); $sAddons = implode(', ', $oConfig->GetAddons()); $sDBSubname = (strlen($oConfig->GetDBSubname()) > 0) ? '('.$oConfig->GetDBSubname().')' : ''; $sUrl = "?config=".urlencode($sRealPath); $sHLink = "Manage $sConfigFile
\n"; $aConfigDetails[] = array('Config'=>$sHLink, 'Application'=>$sAppModules, 'Data models'=>$sDataModels, 'Addons'=>$sAddons, 'Database'=>$oConfig->GetDBHost().'/'.$oConfig->GetDBName().$sDBSubname.' as '.$oConfig->GetDBUser()); } echo MyHelpers::make_table_from_assoc_array($aConfigDetails); } function ReadParam($sName, $defaultValue = "") { return isset($_REQUEST[$sName]) ? $_REQUEST[$sName] : $defaultValue; } function ReadMandatoryParam($sName) { $value = ReadParam($sName, null); if (is_null($value)) { echo "

Missing mandatory argument $sName

"; exit; } return $value; } function DisplayDBFormatIssues($aErrors, $aSugFix, $sRepairUrl = "", $sSQLStatementArgName = "") { $aSQLFixes = array(); // each and every SQL repair statement if (count($aErrors) > 0) { echo "
"; echo "

Wrong Database format

\n"; echo "

The current database is not consistent with the given business model. Please investigate.

\n"; foreach ($aErrors as $sClass => $aTarget) { echo "

Wrong declaration (or DB format ?) for class $sClass

\n"; echo "
    \n"; $i = 0; foreach ($aTarget as $sTarget => $aMessages) { if ($sTarget != '*') { echo "

    Wrong declaration for attribute $sTarget

    \n"; } $sMsg = implode(' AND ', $aMessages); if (!empty($sRepairUrl)) { $aSQLFixes = array_merge($aSQLFixes, $aSugFix[$sClass][$sTarget]); $aCleanFixes = array(); foreach($aSugFix[$sClass][$sTarget] as $sSQLFix) { if (!empty($sSQLFix)) { $aCleanFixes[] = $sSQLFix; } } if (count($aCleanFixes) > 0) { $sSQLFixes = implode('; ', $aCleanFixes); $sUrl = "$sRepairUrl&$sSQLStatementArgName=".urlencode($sSQLFixes); echo "
  • $sMsg (fix it now!)
  • \n"; } else { echo "
  • $sMsg
  • \n"; } } else { echo "
  • $sMsg (".htmlentities($sSQLFixes).")
  • \n"; } $i++; } echo "
\n"; } if (count($aSQLFixes) > 1) { MetaModel::DBShowApplyForm($sRepairUrl, $sSQLStatementArgName, $aSQLFixes); } echo "

Aborting...

\n"; echo "
\n"; exit; } } ///////////////////////////////////////////////////////////////////////////////////////////////// // // M a i n P r o g r a m // ///////////////////////////////////////////////////////////////////////////////////////////////// require_once('../core/cmdbobject.class.inc.php'); $sConfigFile = ReadParam("config", ''); if (empty($sConfigFile)) { printConfigList(); exit; } MetaModel::Startup($sConfigFile, true); // allow missing DB $sBaseArgs = "config=".urlencode($sConfigFile); $sTodo = ReadParam("todo", ""); if ($sTodo == 'execsql') { $sSql = ReadMandatoryParam("sql"); $aSql = explode("##SEP##", $sSql); $sConfirm = ReadParam("confirm"); if (empty($sConfirm) || ($sConfirm != "Yes")) { echo "
\n"; echo "\n"; echo "\n"; if (count($aSql) == 1) { echo "Do you confirm that you want to execute this command: ".htmlentities($aSql[0])." ?
\n"; } else { $sAllQueries = "
  • ".implode("
  • \n
  • ", $aSql)."
  • \n"; echo "Please confirm that you want to execute these commands:
      ".$sAllQueries."
    \n"; } echo "\n"; echo "
    \n"; } else { foreach ($aSql as $sOneSingleSql) { echo "Executing command: $sOneSingleSql
    \n"; CMDBSource::Query($sOneSingleSql); echo "... done!
    \n"; } } } else { $sBaseUrl = "?$sBaseArgs&todo=execsql"; switch ($sTodo) { case "createdb": // do NOT print the menu, because it will change... break; default: printMenu($sConfigFile); } switch ($sTodo) { case "showtables": ShowDatabaseInfo(); break; case "showbizmodel": ShowBizModel($sBaseArgs); break; case "showclass": $sClass = ReadMandatoryParam("class"); ShowClass($sClass, $sBaseArgs); break; case "showzlists": ShowZLists($sBaseArgs); break; case "debugquery": DebugQuery($sConfigFile); break; case "createdb": $sRes = CreateDB(); // As the menu depends on the existence of the DB, we have to do display it right after the job is done printMenu($sConfigFile); echo $sRes; break; case "dictionarystats": echo "Dictionary: statistics by language
    \n"; foreach (Dict::GetLanguages() as $sLanguageCode => $aLanguageData) { list($aMissing, $aUnexpected, $aNotTranslated, $aOK) = Dict::MakeStats($sLanguageCode, 'EN US'); echo "

    Stats for language: $sLanguageCode

    \n"; echo "\n"; } break; case "checkdictionary": $sCategories = ReadMandatoryParam("categories"); $sOutputFilter = ReadParam("outputfilter", ''); echo "Dictionary: missing entries (categories: $sCategories, output: '$sOutputFilter')
    \n"; echo "
    \n";
    			echo MetaModel::MakeDictionaryTemplate($sCategories, $sOutputFilter);
    			echo "
    \n"; break; case "checkmodel": echo "Check definitions...
    \n"; MetaModel::CheckDefinitions(); echo "done...
    \n"; break; case "checkmodeltodb": echo "Check DB format...
    \n"; list($aErrors, $aSugFix) = MetaModel::DBCheckFormat(); 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"); echo "done...
    \n"; break; case "dumpdb": echo "Dump DB data...
    \n"; DumpDatabase(); echo "done...
    \n"; break; case "userrightssetup": echo "Setup user rights module (init DB)...
    \n"; UserRights::Setup(); echo "done...
    \n"; break; case "checkall": echo "Check definitions...
    \n"; MetaModel::CheckDefinitions(); echo "done...
    \n"; echo "Check DB format...
    \n"; 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"; break; } } ?>