Пример #1
0
 protected function AnalyzeTable(QTable $objTable)
 {
     // Setup the Table Object
     $strTableName = $objTable->Name;
     $objTable->ClassName = $this->ClassNameFromTableName($strTableName);
     $objTable->ClassNamePlural = $this->Pluralize($objTable->ClassName);
     // Get the List of Columns
     $objFieldArray = $this->objDb->GetFieldsForTable($strTableName);
     // Iterate through the list of Columns to create objColumnArray
     $objColumnArray = array();
     if ($objFieldArray) {
         foreach ($objFieldArray as $objField) {
             $objColumn = $this->AnalyzeTableColumn($objField, $objTable);
             $objColumnArray[strtolower($objColumn->Name)] = $objColumn;
         }
     }
     $objTable->ColumnArray = $objColumnArray;
     // Get the List of Indexes
     $objTable->IndexArray = $this->objDb->GetIndexesForTable($objTable->Name);
     // Create an Index array
     $objIndexArray = array();
     // Create our Index for Primary Key (if applicable)
     $strPrimaryKeyArray = array();
     foreach ($objColumnArray as $objColumn) {
         if ($objColumn->PrimaryKey) {
             $objPkColumn = $objColumn;
             array_push($strPrimaryKeyArray, $objColumn->Name);
         }
     }
     if (count($strPrimaryKeyArray)) {
         $objIndex = new QIndex();
         $objIndex->KeyName = 'pk_' . $strTableName;
         $objIndex->PrimaryKey = true;
         $objIndex->Unique = true;
         $objIndex->ColumnNameArray = $strPrimaryKeyArray;
         array_push($objIndexArray, $objIndex);
         if (count($strPrimaryKeyArray) == 1) {
             $objPkColumn->Unique = true;
             $objPkColumn->Indexed = true;
         }
     }
     //if ($strTableName == 'campus_job') exit(var_dump($objPkColumn));
     // Iterate though each Index that exists in this table, set any Columns's "Index" property
     // to TRUE if they are a single-column index
     if ($objTable->IndexArray) {
         foreach ($objArray = $objTable->IndexArray as $objDatabaseIndex) {
             // Make sure the columns are defined
             if (count($objDatabaseIndex->ColumnNameArray) == 0) {
                 $this->strErrors .= sprintf("Index %s in table %s indexes on no columns.\n", $objDatabaseIndex->KeyName, $strTableName);
             } else {
                 // Ensure every column exist in the DbIndex's ColumnNameArray
                 $blnFailed = false;
                 foreach ($objArray = $objDatabaseIndex->ColumnNameArray as $strColumnName) {
                     if (array_key_exists(strtolower($strColumnName), $objTable->ColumnArray) && $objTable->ColumnArray[strtolower($strColumnName)]) {
                         // It exists -- do nothing
                     } else {
                         // Otherwise, add a warning
                         $this->strErrors .= sprintf("Index %s in table %s indexes on the column %s, which does not appear to exist.\n", $objDatabaseIndex->KeyName, $strTableName, $strColumnName);
                         $blnFailed = true;
                     }
                 }
                 if (!$blnFailed) {
                     // Let's make sure if this is a single-column index, we haven't already created a single-column index for this column
                     $blnAlreadyCreated = false;
                     foreach ($objIndexArray as $objIndex) {
                         if (count($objIndex->ColumnNameArray) == count($objDatabaseIndex->ColumnNameArray)) {
                             if (implode(',', $objIndex->ColumnNameArray) == implode(',', $objDatabaseIndex->ColumnNameArray)) {
                                 $blnAlreadyCreated = true;
                             }
                         }
                     }
                     if (!$blnAlreadyCreated) {
                         // Create the Index Object
                         $objIndex = new QIndex();
                         $objIndex->KeyName = $objDatabaseIndex->KeyName;
                         $objIndex->PrimaryKey = $objDatabaseIndex->PrimaryKey;
                         $objIndex->Unique = $objDatabaseIndex->Unique;
                         if ($objDatabaseIndex->PrimaryKey) {
                             $objIndex->Unique = true;
                         }
                         $objIndex->ColumnNameArray = $objDatabaseIndex->ColumnNameArray;
                         // Add the new index object to the index array
                         array_push($objIndexArray, $objIndex);
                         // Lastly, if it's a single-column index, update the Column in the table to reflect this
                         if (count($objDatabaseIndex->ColumnNameArray) == 1) {
                             $strColumnName = $objDatabaseIndex->ColumnNameArray[0];
                             $objColumn = $objTable->ColumnArray[strtolower($strColumnName)];
                             $objColumn->Indexed = true;
                             if ($objIndex->Unique) {
                                 $objColumn->Unique = true;
                             }
                         }
                     }
                 }
             }
         }
     }
     // Add the IndexArray to the table
     $objTable->IndexArray = $objIndexArray;
     // Get the List of Foreign Keys from the database
     $objForeignKeys = $this->objDb->GetForeignKeysForTable($objTable->Name);
     // Add to it, the list of Foreign Keys from any Relationships Script
     $objForeignKeys = $this->GetForeignKeysFromRelationshipsScript($strTableName, $objForeignKeys);
     // Iterate through each foreign key that exists in this table
     if ($objForeignKeys) {
         foreach ($objForeignKeys as $objForeignKey) {
             // Make sure it's a single-column FK
             if (count($objForeignKey->ColumnNameArray) != 1) {
                 $this->strErrors .= sprintf("Foreign Key %s in table %s keys on multiple columns.  Multiple-columned FKs are not supported by the code generator.\n", $objForeignKey->KeyName, $strTableName);
             } else {
                 // Make sure the column in the FK definition actually exists in this table
                 $strColumnName = $objForeignKey->ColumnNameArray[0];
                 if (array_key_exists(strtolower($strColumnName), $objTable->ColumnArray) && ($objColumn = $objTable->ColumnArray[strtolower($strColumnName)])) {
                     // Now, we make sure there is a single-column index for this FK that exists
                     $blnFound = false;
                     if ($objIndexArray = $objTable->IndexArray) {
                         foreach ($objIndexArray as $objIndex) {
                             if (count($objIndex->ColumnNameArray) == 1 && strtolower($objIndex->ColumnNameArray[0]) == strtolower($strColumnName)) {
                                 $blnFound = true;
                             }
                         }
                     }
                     if (!$blnFound) {
                         // Single Column Index for this FK does not exist.  Let's create a virtual one and warn
                         $objIndex = new QIndex();
                         $objIndex->KeyName = sprintf('virtualix_%s_%s', $objTable->Name, $objColumn->Name);
                         $objIndex->Unique = $objColumn->Unique;
                         $objIndex->ColumnNameArray = array($objColumn->Name);
                         $objIndexArray = $objTable->IndexArray;
                         $objIndexArray[] = $objIndex;
                         $objTable->IndexArray = $objIndexArray;
                         if ($objIndex->Unique) {
                             $this->strErrors .= sprintf("Notice: It is recommended that you add a single-column UNIQUE index on \"%s.%s\" for the Foreign Key %s\r\n", $strTableName, $strColumnName, $objForeignKey->KeyName);
                         } else {
                             $this->strErrors .= sprintf("Notice: It is recommended that you add a single-column index on \"%s.%s\" for the Foreign Key %s\r\n", $strTableName, $strColumnName, $objForeignKey->KeyName);
                         }
                     }
                     // Make sure the table being referenced actually exists
                     if (array_key_exists(strtolower($objForeignKey->ReferenceTableName), $this->objTableArray) || array_key_exists(strtolower($objForeignKey->ReferenceTableName), $this->objTypeTableArray)) {
                         // STEP 1: Create the New Reference
                         $objReference = new QReference();
                         // Retrieve the Column object
                         $objColumn = $objTable->ColumnArray[strtolower($strColumnName)];
                         // Setup Key Name
                         $objReference->KeyName = $objForeignKey->KeyName;
                         $strReferencedTableName = $objForeignKey->ReferenceTableName;
                         // Setup IsType flag
                         if (array_key_exists(strtolower($strReferencedTableName), $this->objTypeTableArray)) {
                             $objReference->IsType = true;
                         } else {
                             $objReference->IsType = false;
                         }
                         // Setup Table and Column names
                         $objReference->Table = $strReferencedTableName;
                         $objReference->Column = $objForeignKey->ReferenceColumnNameArray[0];
                         // Setup VariableType
                         $objReference->VariableType = $this->ClassNameFromTableName($strReferencedTableName);
                         // Setup PropertyName and VariableName
                         $objReference->PropertyName = $this->ReferencePropertyNameFromColumn($objColumn);
                         $objReference->VariableName = $this->ReferenceVariableNameFromColumn($objColumn);
                         // Add this reference to the column
                         $objColumn->Reference = $objReference;
                         // STEP 2: Setup the REVERSE Reference for Non Type-based References
                         if (!$objReference->IsType) {
                             // Retrieve the ReferencedTable object
                             //								$objReferencedTable = $this->objTableArray[strtolower($objReference->Table)];
                             $objReferencedTable = $this->GetTable($objReference->Table);
                             $objReverseReference = new QReverseReference();
                             $objReverseReference->KeyName = $objReference->KeyName;
                             $objReverseReference->Table = $strTableName;
                             $objReverseReference->Column = $strColumnName;
                             $objReverseReference->NotNull = $objColumn->NotNull;
                             $objReverseReference->Unique = $objColumn->Unique;
                             $objReverseReference->PropertyName = $this->PropertyNameFromColumn($this->GetColumn($strTableName, $strColumnName));
                             $objReverseReference->ObjectDescription = $this->CalculateObjectDescription($strTableName, $strColumnName, $strReferencedTableName, false);
                             $objReverseReference->ObjectDescriptionPlural = $this->CalculateObjectDescription($strTableName, $strColumnName, $strReferencedTableName, true);
                             $objReverseReference->VariableName = $this->ReverseReferenceVariableNameFromTable($objTable->Name);
                             $objReverseReference->VariableType = $this->ReverseReferenceVariableTypeFromTable($objTable->Name);
                             // For Special Case ReverseReferences, calculate Associated MemberVariableName and PropertyName...
                             // See if ReverseReference is due to an ORM-based Class Inheritence Chain
                             if (count($objTable->PrimaryKeyColumnArray) == 1 && $objColumn->PrimaryKey) {
                                 $objReverseReference->ObjectMemberVariable = QConvertNotation::PrefixFromType(QType::Object) . $objReverseReference->VariableType;
                                 $objReverseReference->ObjectPropertyName = $objReverseReference->VariableType;
                                 $objReverseReference->ObjectDescription = $objReverseReference->VariableType;
                                 $objReverseReference->ObjectDescriptionPlural = $this->Pluralize($objReverseReference->VariableType);
                                 // Otherwise, see if it's just plain ol' unique
                             } else {
                                 if ($objColumn->Unique) {
                                     $objReverseReference->ObjectMemberVariable = $this->CalculateObjectMemberVariable($strTableName, $strColumnName, $strReferencedTableName);
                                     $objReverseReference->ObjectPropertyName = $this->CalculateObjectPropertyName($strTableName, $strColumnName, $strReferencedTableName);
                                 }
                             }
                             // Add this ReverseReference to the referenced table's ReverseReferenceArray
                             $objArray = $objReferencedTable->ReverseReferenceArray;
                             array_push($objArray, $objReverseReference);
                             $objReferencedTable->ReverseReferenceArray = $objArray;
                         }
                     } else {
                         $this->strErrors .= sprintf("Foreign Key %s in table %s references a table %s that does not appear to exist.\n", $objForeignKey->KeyName, $strTableName, $objForeignKey->ReferenceTableName);
                     }
                 } else {
                     $this->strErrors .= sprintf("Foreign Key %s in table %s indexes on a column that does not appear to exist.\n", $objForeignKey->KeyName, $strTableName);
                 }
             }
         }
     }
     // Verify: Table Name is valid (alphanumeric + "_" characters only, must not start with a number)
     // and NOT a PHP Reserved Word
     $strMatches = array();
     preg_match('/' . $this->strPatternTableName . '/', $strTableName, $strMatches);
     if (count($strMatches) && $strMatches[0] == $strTableName && $strTableName != '_') {
         // Setup Reserved Words
         $strReservedWords = explode(',', QCodeGen::PhpReservedWords);
         for ($intIndex = 0; $intIndex < count($strReservedWords); $intIndex++) {
             $strReservedWords[$intIndex] = strtolower(trim($strReservedWords[$intIndex]));
         }
         $strTableNameToTest = trim(strtolower($strTableName));
         foreach ($strReservedWords as $strReservedWord) {
             if ($strTableNameToTest == $strReservedWord) {
                 $this->strErrors .= sprintf("Table '%s' has a table name which is a PHP reserved word.\r\n", $strTableName);
                 unset($this->objTableArray[strtolower($strTableName)]);
                 return;
             }
         }
     } else {
         $this->strErrors .= sprintf("Table '%s' can only contain characters that are alphanumeric or _, and must not begin with a number.\r\n", $strTableName);
         unset($this->objTableArray[strtolower($strTableName)]);
         return;
     }
     // Verify: Column Names are all valid names
     $objColumnArray = $objTable->ColumnArray;
     foreach ($objColumnArray as $objColumn) {
         $strColumnName = $objColumn->Name;
         $strMatches = array();
         preg_match('/' . $this->strPatternColumnName . '/', $strColumnName, $strMatches);
         if (count($strMatches) && $strMatches[0] == $strColumnName && $strColumnName != '_') {
         } else {
             $this->strErrors .= sprintf("Table '%s' has an invalid column name: '%s'\r\n", $strTableName, $strColumnName);
             unset($this->objTableArray[strtolower($strTableName)]);
             return;
         }
     }
     // Verify: Table has at least one PK
     $blnFoundPk = false;
     $objColumnArray = $objTable->ColumnArray;
     foreach ($objColumnArray as $objColumn) {
         if ($objColumn->PrimaryKey) {
             $blnFoundPk = true;
         }
     }
     if (!$blnFoundPk) {
         $this->strErrors .= sprintf("Table %s does not have any defined primary keys.\n", $strTableName);
         unset($this->objTableArray[strtolower($strTableName)]);
         return;
     }
 }
Пример #2
0
 protected function CalculateObjectMemberVariable($strTableName, $strColumnName, $strReferencedTableName)
 {
     return sprintf('%s%s%s%s', QConvertNotation::PrefixFromType(QType::Object), $this->strAssociatedObjectPrefix, $this->CalculateObjectDescription($strTableName, $strColumnName, $strReferencedTableName, false), $this->strAssociatedObjectSuffix);
 }