private static function PerformAudit($rebuild = false)
 {
     // Empty glyphs
     $empty_glyphs = 6;
     //TODO: check player level
     switch (self::$m_server) {
         default:
         case SERVER_MANGOS:
             $character_glyphs = DB::Characters()->select("SELECT `slot`, `glyph` FROM `character_glyphs` WHERE `guid` = %d AND `spec` = %d", self::GetGUID(), self::GetActiveSpec());
             if (is_array($character_glyphs)) {
                 foreach ($character_glyphs as $glyph) {
                     if ($glyph['slot'] < 6 && $glyph['glyph'] > 0) {
                         --$empty_glyphs;
                     }
                 }
             }
             break;
         case SERVER_TRINITY:
             $character_glyphs = DB::Characters()->select("SELECT `glyph1`, `glyph2`, `glyph3`, `glyph4`, `glyph5`, `glyph6` FROM `character_glyphs` WHERE `guid` = %d AND `spec` = %d", self::GetGUID(), self::GetActiveSpec());
             if (is_array($character_glyphs)) {
                 foreach ($character_glyphs as $glyph) {
                     for ($i = 1; $i < 7; ++$i) {
                         if ($glyph['glyph' . $i] > 0) {
                             --$empty_glyphs;
                         }
                     }
                 }
             }
             break;
     }
     self::UpdateAudit(AUDIT_TYPE_EMPTY_GLYPH_SLOT, $empty_glyphs);
     // Unspent talent points.
     self::UpdateAudit(AUDIT_TYPE_UNSPENT_TALENT_POINTS, self::GetFreeTalentPoints());
     if (self::IsInventoryLoaded()) {
         // Inventory check
         foreach (self::$m_items as $item) {
             if (!$item) {
                 continue;
             }
             self::UpdateAudit(AUDIT_TYPE_STAT_BONUS, $item->GetItemBonuses());
             // Add some stats from ench/gem.
             // Non optimal armor
             if (!in_array($item->GetSlot(), array(INV_MAIN_HAND, INV_OFF_HAND, INV_BELT, INV_SHIRT, INV_RANGED_RELIC, INV_TABARD, INV_TRINKET_1, INV_TRINKET_2, INV_NECK, INV_OFF_HAND, INV_RING_1, INV_RING_2, INV_NECK)) && !self::IsOptimalArmorForClass($item->GetEntry())) {
                 self::UpdateAudit(AUDIT_TYPE_NONOPTIMAL_ARMOR, array($item->GetSlot(), $item->GetEntry()));
             }
             // Enchant bonus
             if ($item->GetEnchantmentId() != 0) {
                 //self::UpdateAudit(AUDIT_TYPE_STAT_BONUS, $item->GetEnchantmentId());
             }
             // Unenchanted items
             if ($item->GetEnchantmentId() == 0 && !in_array($item->GetSlot(), array(INV_BELT, INV_SHIRT, INV_RANGED_RELIC, INV_TABARD, INV_TRINKET_1, INV_TRINKET_2, INV_NECK, INV_OFF_HAND, INV_RING_1, INV_RING_2, INV_NECK))) {
                 self::UpdateAudit(AUDIT_TYPE_UNENCHANTED_ITEM, array($item->GetSlot(), $item->GetEntry()));
             }
             // Missing belt buckle
             if ($item->GetSlot() == INV_BELT && !$item->HasBonusEnchantmentSlot()) {
                 self::UpdateAudit(AUDIT_TYPE_MISSING_BELT_BUCKLE, true);
             }
             // Unused profession perks
             // TODO: add more profession perks (currently only enchanting and blacksmithing are available)
             switch ($item->GetSlot()) {
                 case INV_RING_1:
                 case INV_RING_2:
                     if (self::HasProfessionSkill(SKILL_ENCHANTING) && self::GetSkillValue(SKILL_ENCHANTING) >= 360 && $item->GetEnchantmentId() == 0) {
                         self::UpdateAudit(AUDIT_TYPE_UNUSED_PROFESSION_PERK, array($item->GetSlot(), $item->GetEntry(), SKILL_ENCHANTING));
                     }
                     break;
                 case INV_BRACERS:
                 case INV_BELT:
                     if (self::HasProfessionSkill(SKILL_BLACKSMITHING) && self::GetSkillValue(SKILL_BLACKSMITHING) >= 400 && !$item->HasBonusEnchantmentSlot()) {
                         self::UpdateAudit(AUDIT_TYPE_UNUSED_PROFESSION_PERK, array($item->GetSlot(), $item->GetEntry(), SKILL_BLACKSMITHING));
                     }
                     break;
             }
             // Empty sockets
             $sockets_count = WoW_Items::GetTemplateSocketsCount($item->GetEntry());
             if ($item->HasBonusEnchantmentSlot()) {
                 ++$sockets_count;
                 // Include blacksmithing bonus slot
             }
             for ($i = 1; $i < 4; ++$i) {
                 if ($item->GetSocketInfo($i, true) == 0) {
                     if ($i <= $sockets_count) {
                         self::UpdateAudit(AUDIT_TYPE_EMPTY_SOCKET, array($item->GetEntry(), $item->GetSlot()));
                     }
                 } else {
                     self::UpdateAudit(AUDIT_TYPE_USED_GEMS, $item->GetSocketInfo($i));
                 }
             }
         }
     }
     return true;
 }