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->ClassNameFromTableName($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();
     while ($objRow = $objResult->FetchRow()) {
         $strNameArray[$objRow[0]] = str_replace("'", "\\'", str_replace('\\', '\\\\', $objRow[1]));
         $strTokenArray[$objRow[0]] = $this->TypeTokenFromTypeName($objRow[1]);
         if (sizeof($objRow) > 2) {
             // there are extra columns to process
             $strExtraPropertyArray[$objRow[0]] = array();
             for ($i = 2; $i < sizeof($objRow); $i++) {
                 $strFieldName = QCodeGen::TypeNameFromColumnName($objFieldArray[$i]->Name);
                 $strExtraFields[$i - 2] = $strFieldName;
                 $strExtraPropertyArray[$objRow[0]][$strFieldName] = $objRow[$i];
             }
         }
         foreach ($strReservedWords as $strReservedWord) {
             if (trim(strtolower($strTokenArray[$objRow[0]])) == $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[$objRow[0]] = '_' . $strTokenArray[$objRow[0]];
             }
         }
         if (strlen($strTokenArray[$objRow[0]]) == 0) {
             $this->strErrors .= sprintf("Warning: TypeTable %s contains an invalid type name: %s\r\n", $strTableName, stripslashes($strNameArray[$objRow[0]]));
             return;
         }
     }
     ksort($strNameArray);
     ksort($strTokenArray);
     $objTypeTable->NameArray = $strNameArray;
     $objTypeTable->TokenArray = $strTokenArray;
     $objTypeTable->ExtraFieldNamesArray = $strExtraFields;
     $objTypeTable->ExtraPropertyArray = $strExtraPropertyArray;
 }