protected function AnalyzeTypeTable(QTypeTable $objTypeTable)
 {
     // Setup the Array of Reserved Words
     $strReservedWords = explode(',', QCodeGen::PhpReservedWords);
     for ($intIndex = 0; $intIndex < count($strReservedWords); $intIndex++) {
         $strReservedWords[$intIndex] = strtolower(trim($strReservedWords[$intIndex]));
     }
     // Setup the Type Table Object
     $strTableName = $objTypeTable->Name;
     $objTypeTable->ClassName = $this->ModelClassName($strTableName);
     // Ensure that there are only 2 fields, an integer PK field (can be named anything) and a unique varchar field
     $objFieldArray = $this->objDb->GetFieldsForTable($strTableName);
     if ($objFieldArray[0]->Type != QDatabaseFieldType::Integer || !$objFieldArray[0]->PrimaryKey) {
         $this->strErrors .= sprintf("TypeTable %s's first column is not a PK integer.\n", $strTableName);
         return;
     }
     if ($objFieldArray[1]->Type != QDatabaseFieldType::VarChar || !$objFieldArray[1]->Unique) {
         $this->strErrors .= sprintf("TypeTable %s's second column is not a unique VARCHAR.\n", $strTableName);
         return;
     }
     // Get the rows
     $objResult = $this->objDb->Query(sprintf('SELECT * FROM %s', $strTableName));
     $strNameArray = array();
     $strTokenArray = array();
     $strExtraPropertyArray = array();
     $strExtraFields = array();
     $intRowWidth = count($objFieldArray);
     while ($objDbRow = $objResult->GetNextRow()) {
         $strRowArray = $objDbRow->GetColumnNameArray();
         $id = $strRowArray[0];
         $name = $strRowArray[1];
         $strNameArray[$id] = str_replace("'", "\\'", str_replace('\\', '\\\\', $name));
         $strTokenArray[$id] = $this->TypeTokenFromTypeName($name);
         if ($intRowWidth > 2) {
             // there are extra columns to process
             $strExtraPropertyArray[$id] = array();
             for ($i = 2; $i < $intRowWidth; $i++) {
                 $strFieldName = QCodeGen::TypeColumnPropertyName($objFieldArray[$i]->Name);
                 $strExtraFields[$i - 2] = $strFieldName;
                 // Get and resolve type based value
                 $value = $objDbRow->GetColumn($objFieldArray[$i]->Name, $objFieldArray[$i]->Type);
                 $strExtraPropertyArray[$id][$strFieldName] = $value;
             }
         }
         foreach ($strReservedWords as $strReservedWord) {
             if (trim(strtolower($strTokenArray[$id])) == $strReservedWord) {
                 $this->strErrors .= sprintf("Warning: TypeTable %s contains a type name which is a reserved word: %s.  Appended _ to the beginning of it.\r\n", $strTableName, $strReservedWord);
                 $strTokenArray[$id] = '_' . $strTokenArray[$id];
             }
         }
         if (strlen($strTokenArray[$id]) == 0) {
             $this->strErrors .= sprintf("Warning: TypeTable %s contains an invalid type name: %s\r\n", $strTableName, stripslashes($strNameArray[$id]));
             return;
         }
     }
     ksort($strNameArray);
     ksort($strTokenArray);
     $objTypeTable->NameArray = $strNameArray;
     $objTypeTable->TokenArray = $strTokenArray;
     $objTypeTable->ExtraFieldNamesArray = $strExtraFields;
     $objTypeTable->ExtraPropertyArray = $strExtraPropertyArray;
     $objTypeTable->KeyColumn = $this->AnalyzeTableColumn($objFieldArray[0], $objTypeTable);
 }