Changeset 41


Ignore:
Timestamp:
05/29/08 20:41:06 (4 years ago)
Author:
antonbatenev.ya.ru
Message:

оптимизация под большое кол-во топиков

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/avalon.sql

    r36 r41  
    7878  `has_child` tinyint(1) NOT NULL COMMENT 'флаг наличия дочерних сообщений', 
    7979  PRIMARY KEY  (`id`), 
    80   KEY `ix_parent` (`id_parent`), 
    81   KEY `ix_topic` (`id_topic`), 
    82   KEY `ix_forum` (`id_forum`) 
     80  KEY `ix_id_parent` USING BTREE (`id_parent`), 
     81  KEY `ix_id_topic` USING BTREE (`id_topic`), 
     82  KEY `ix_id_forum` USING BTREE (`id_forum`) 
    8383) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='сообщения'; 
     84 
     85-- 
     86-- Table structure for table `message_topic` 
     87-- 
     88 
     89DROP TABLE IF EXISTS `message_topic`; 
     90CREATE TABLE `message_topic` ( 
     91  `id_message` int(11) NOT NULL COMMENT 'id сообщения', 
     92  `id_topic` int(11) NOT NULL COMMENT 'id темы', 
     93  `id_parent` int(11) NOT NULL COMMENT 'id родительского сообщения', 
     94  `id_user` int(11) NOT NULL COMMENT 'id автора', 
     95  `id_forum` int(11) NOT NULL COMMENT 'id форума', 
     96  `subject` varchar(100) NOT NULL COMMENT 'тема сообщения', 
     97  `message_name` varchar(100) NOT NULL COMMENT 'имя сообщения', 
     98  `user_nick` varchar(100) NOT NULL COMMENT 'имя автора сообщения', 
     99  `id_article` int(11) NOT NULL COMMENT 'id статьи, если сообщение является статьей или 0', 
     100  `message_date` datetime NOT NULL COMMENT 'дата создания сообщения', 
     101  `update_date` datetime NOT NULL COMMENT 'дата обновления сообщения или 0', 
     102  `user_role` varchar(50) NOT NULL COMMENT 'статус автора сообщения', 
     103  `user_title` varchar(100) NOT NULL COMMENT 'повязка пользователя', 
     104  `user_title_color` int(11) NOT NULL COMMENT 'цвет повязки пользователя', 
     105  `last_moderated` datetime NOT NULL COMMENT 'дата последнего переноса сообщения', 
     106  `has_child` tinyint(1) NOT NULL COMMENT 'флаг наличия дочерних сообщений', 
     107  PRIMARY KEY  (`id_message`), 
     108  KEY `ix_id_forum` (`id_forum`), 
     109  CONSTRAINT `fk_message_topic_message` FOREIGN KEY (`id_message`) REFERENCES `message` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
     110) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='список топиков'; 
    84111 
    85112-- 
     
    179206/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 
    180207 
    181 -- Dump completed on 2008-05-27 12:31:33 
     208-- Dump completed on 2008-05-29 16:40:23 
  • trunk/message_tree.cpp

    r31 r41  
    1010#include "storage/storage_factory.h" 
    1111//---------------------------------------------------------------------------------------------- 
     12typedef struct AMessageInfoGUI 
     13{ 
     14        // дескриптор сообщения 
     15        AMessageInfoEx MessageInfo; 
     16 
     17        // флаг наличия загрузки информации 
     18        bool IsInfoLoaded; 
     19 
     20        // флаг того, что загружены дочерние сообщения 
     21        bool IsChildLoaded; 
     22}; 
     23//---------------------------------------------------------------------------------------------- 
    1224// элемент для дерева группы форумов с информацией о группе 
    1325//---------------------------------------------------------------------------------------------- 
    14 typedef ATreeWidgetItem<AMessageInfoEx> MessageTreeWidgetItem; 
     26typedef ATreeWidgetItem<AMessageInfoGUI> MessageTreeWidgetItem; 
    1527//---------------------------------------------------------------------------------------------- 
    1628 
     
    2032        m_forum_tree   = 0; 
    2133        m_message_view = 0; 
     34        m_id_forum     = 0; 
    2235 
    2336        setFrameShadow(QFrame::Plain); 
     
    4154        connect(this, SIGNAL(itemSelectionChanged()),         this, SLOT(selection_changed())); 
    4255 
    43         connect(&m_timer, SIGNAL(timeout()), this, SLOT(timer_on_timer())); 
     56        connect(&m_timer,            SIGNAL(timeout()),         this, SLOT(timer_on_timer())); 
     57        connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(vertical_scroll(int))); 
    4458} 
    4559//---------------------------------------------------------------------------------------------- 
     
    8296//---------------------------------------------------------------------------------------------- 
    8397 
    84 void AMessageTree::ChangeForum (const AForumInfo* info) 
    85 { 
     98void AMessageTree::ChangeForum (const AForumInfo* forum_info) 
     99{ 
     100        if (forum_info == NULL) 
     101                m_id_forum = 0; 
     102 
    86103        clear(); 
    87104 
    88105        // если выделена группа, то просто очистка 
    89         if (info == NULL) 
     106        if (forum_info == NULL) 
    90107        { 
    91108                headerItem()->setText(0, QString::fromUtf8("тема")); 
     
    98115        } 
    99116 
     117        // сохраняем для скролла 
     118        m_id_forum = forum_info->ID; 
     119 
    100120        // вывод наименования форума в хедер 
    101         headerItem()->setText(0, info->Name); 
    102  
    103         // флаг того, что есть непрочитаные 
    104         bool has_unread = false; 
     121        headerItem()->setText(0, forum_info->Name); 
    105122 
    106123        // получение хранилища 
     
    114131 
    115132        // получение топиков 
    116         AMessageInfoExList topic_list; 
    117  
    118         if (storage->GetForumTopicList(info->ID, topic_list, NULL) == false) 
     133        QList<int> topic_list; 
     134 
     135        if (storage->GetForumTopicList(forum_info->ID, topic_list, NULL) == false) 
    119136        { 
    120137                storage->ShowError(m_parent); 
     
    123140 
    124141        // установка топиков 
     142        QList<QTreeWidgetItem*> items; 
     143 
    125144        for (int i = 0; i < topic_list.count(); i++) 
    126145        { 
    127                 AMessageInfoEx info = topic_list[i]; 
    128  
    129                 info.IsMessageLoaded  = false; 
    130                 info.IsChildLoaded    = false; 
    131                 info.UnreadChildCount = 0; 
    132  
    133                 MessageTreeWidgetItem* item = new MessageTreeWidgetItem(this); 
    134  
    135                 item->SetTag(info); 
    136  
    137                 item->setText(0, info.Subject); 
    138  
    139                 if (info.IDUser != 0) 
    140                         item->setText(1, info.UserNick); 
    141                 else 
    142                         item->setText(1, QString::fromUtf8("Аноним ") + info.UserTitle); 
    143  
    144                 item->setText(2, info.MessageDate.toString("dd.MM.yyyy hh:mm:ss")); 
    145  
    146                 if (info.IsRead == false) 
    147                 { 
    148                         has_unread = true; 
    149                         item->setIcon(0, m_message_unread); 
    150                         info.UnreadChildCount = 1; 
    151                 } 
    152                 else if (info.HasUnreadChild == true) 
    153                 { 
    154                         has_unread = true; 
    155                         item->setIcon(0, m_child_unread); 
    156                 } 
    157                 else 
    158                         item->setIcon(0, m_message_read); 
    159  
    160                 if (info.HasChild == true) 
    161                         item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); 
    162         } 
    163  
    164         // подсветка хедера, если есть непрочитанные сообщения 
    165         if (has_unread == true) 
    166         { 
    167                 QFont font = headerItem()->font(0); 
    168                 font.setBold(true); 
    169                 headerItem()->setFont(0, font); 
    170         } 
    171         else 
    172         { 
    173                 QFont font = headerItem()->font(0); 
    174                 font.setBold(false); 
    175                 headerItem()->setFont(0, font); 
    176         } 
     146                MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 
     147 
     148                AMessageInfoGUI* info = item->PTag(); 
     149 
     150                info->MessageInfo.ID = topic_list[i]; 
     151                info->IsInfoLoaded   = false; 
     152                info->IsChildLoaded  = false; 
     153 
     154                items.append(item); 
     155        } 
     156 
     157        // отображение 
     158        addTopLevelItems(items); 
     159 
     160        // загрузка видимых топиков 
     161        ScrollTopics(); 
     162} 
     163//---------------------------------------------------------------------------------------------- 
     164 
     165void AMessageTree::vertical_scroll (int /*value*/) 
     166{ 
     167        ScrollTopics(); 
     168} 
     169//---------------------------------------------------------------------------------------------- 
     170 
     171void AMessageTree::ScrollTopics () 
     172{ 
     173        if (m_id_forum == 0) 
     174                return; 
     175 
     176        // поиск верхнего видимого элемента 
     177        int from_index = 0; 
     178 
     179        int size = topLevelItemCount(); 
     180 
     181        for (int i = 0; i < size; i++) 
     182        { 
     183                MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(topLevelItem(i)); 
     184 
     185                QRect rect = visualItemRect(item); 
     186 
     187                if (rect.top() < 0) 
     188                { 
     189                        from_index = i; 
     190                        continue; 
     191                } 
     192 
     193                break; 
     194        } 
     195 
     196        // поиск нижнего видимого элемента 
     197        int tree_height = height(); 
     198 
     199        AMessageInfoExList            list; 
     200        QList<MessageTreeWidgetItem*> items; 
     201 
     202        while (from_index < size) 
     203        { 
     204                MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(topLevelItem(from_index)); 
     205 
     206                QRect rect = visualItemRect(item); 
     207 
     208                if (rect.top() > tree_height) 
     209                        break; 
     210 
     211                if (item->PTag()->IsInfoLoaded == false) 
     212                { 
     213                        AMessageInfoEx info; 
     214 
     215                        info.ID = item->PTag()->MessageInfo.ID; 
     216 
     217                        list.append(info); 
     218                        items.append(item); 
     219                } 
     220 
     221                from_index++; 
     222        } 
     223/* 
     224        // загрузка топиков, которые не загружены 
     225        if (list.count() > 0) 
     226        { 
     227                // получение хранилища 
     228                std::auto_ptr<IStorage> storage(AStorageFactory::GetStorage()); 
     229 
     230                if (storage.get() == NULL) 
     231                { 
     232                        QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 
     233                        return; 
     234                } 
     235 
     236                if (storage->GetTopicInfo(list, 0) == false) 
     237                { 
     238                        storage->ShowError(m_parent); 
     239                        return; 
     240                } 
     241 
     242                // заполнение вновь загруженных топиков 
     243                for (int i = 0; i < list.count(); i++) 
     244                { 
     245                        AMessageInfoEx info = list.at(i); 
     246 
     247                        for (int j = 0; j < items.count(); j++) 
     248                        { 
     249                                MessageTreeWidgetItem* item = items[j]; 
     250 
     251                                if (item->PTag()->MessageInfo.ID == info.ID) 
     252                                { 
     253                                        item->PTag()->MessageInfo = info; 
     254 
     255                                        item->setText(0, info.Subject); 
     256 
     257                                        if (info.IDUser == 0) 
     258                                                item->setText(1, QString::fromUtf8("Аноним")); 
     259                                        else 
     260                                                item->setText(1, info.UserNick); 
     261 
     262                                        item->setText(2, info.MessageDate.toString("dd.MM.yyyy hh:mm:ss")); 
     263 
     264                                        if (info.IsRead == true) 
     265                                                item->setIcon(0, m_message_read); 
     266                                        else 
     267                                                item->setIcon(0, m_message_unread); 
     268 
     269                                        break; 
     270                                } 
     271                        } 
     272                } 
     273        } 
     274        */ 
    177275} 
    178276//---------------------------------------------------------------------------------------------- 
     
    180278void AMessageTree::expand_item (QTreeWidgetItem* item_expanded) 
    181279{ 
     280/* 
    182281        if (item_expanded == NULL) 
    183282                return; 
     
    215314                        ExpandUnreadChild(item); 
    216315        } 
     316*/ 
    217317} 
    218318//---------------------------------------------------------------------------------------------- 
     
    220320void AMessageTree::ExpandUnreadChild (QTreeWidgetItem* widget_item) 
    221321{ 
     322/* 
    222323        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(widget_item); 
    223324 
     
    230331                expandItem(item); 
    231332        } 
    232 } 
    233 //---------------------------------------------------------------------------------------------- 
    234  
     333*/ 
     334} 
     335//---------------------------------------------------------------------------------------------- 
     336/* 
    235337void AMessageTree::BuildTree (QTreeWidgetItem* parent, AMessageInfoExList* list) 
    236338{ 
     
    304406        for (int i = 0; i < size; i++) 
    305407                BuildTree(to_build.at(i), list); 
    306 } 
     408}*/ 
    307409//---------------------------------------------------------------------------------------------- 
    308410 
     
    329431void AMessageTree::selection_changed () 
    330432{ 
     433/* 
    331434        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(GetSelectedItem()); 
    332435 
     
    368471        else 
    369472                m_timer.stop(); 
     473*/ 
    370474} 
    371475//---------------------------------------------------------------------------------------------- 
     
    373477void AMessageTree::MakeItemAsRead (QTreeWidgetItem* widget_item) 
    374478{ 
     479/* 
    375480        MessageTreeWidgetItem* item = static_cast<MessageTreeWidgetItem*>(widget_item); 
    376481 
     
    419524        // уменьшение количества непрочитанных в дереве форума 
    420525        m_forum_tree->ChangeUnreadCount(-1); 
    421 } 
    422 //---------------------------------------------------------------------------------------------- 
     526*/ 
     527} 
     528//---------------------------------------------------------------------------------------------- 
  • trunk/message_tree.h

    r30 r41  
    4343                QTimer m_timer; 
    4444 
     45                // id текущего форума 
     46                int m_id_forum; 
     47 
    4548                // возвращает текущий выделенный элемент 
    4649                QTreeWidgetItem* GetSelectedItem (); 
     50 
     51                // загружает незагруженные топики при скроллинге 
     52                void ScrollTopics (); 
    4753 
    4854                // разворачивает ветку до непрочитанных сообщений 
     
    5056 
    5157                // построение ветки 
    52                 void BuildTree (QTreeWidgetItem* parent, AMessageInfoExList* list); 
     58                //void BuildTree (QTreeWidgetItem* parent, AMessageInfoExList* list); 
    5359 
    5460                // пометка сообщения как прочитанного 
     
    5965 
    6066                // смена форума, NULL - очистить список (указатель на группе) 
    61                 void ChangeForum (const AForumInfo* info); 
     67                void ChangeForum (const AForumInfo* forum_info); 
    6268 
    6369        private slots: 
    6470 
     71                void vertical_scroll   (int value); 
    6572                void expand_item       (QTreeWidgetItem* item); 
    6673                void selection_changed (); 
  • trunk/model/message.h

    r29 r41  
    6060typedef struct AMessageInfoEx : AMessageInfo 
    6161{ 
    62         bool IsRead;           // прочитано ли сообщение 
    63         bool HasChild;         // есть ли дочерние сообщения 
    64         bool HasUnreadChild;   // есть ли дочерние непрочитанные сообщения 
    65  
    66         bool IsMessageLoaded;  // загружена ли дополнительная информация сообщения (для внутреннего использования) 
    67         bool IsChildLoaded;    // загружены ли дочерние элементы (для внутреннего использования) 
    68         int  UnreadChildCount; // количество непрочитаных дочерних элементов (для внутреннего использования) 
     62        bool IsRead;   // прочитано ли сообщение 
     63        bool HasChild; // есть ли дочерние сообщения 
    6964}; 
    7065//---------------------------------------------------------------------------------------------- 
  • trunk/storage/istorage.h

    r37 r41  
    6060                virtual bool GetUnreadCount (AUnreadForumCountInfoList& list, IProgress* progress = NULL) = 0; 
    6161 
    62                 // возвращает список топиков (родительских веток) для форума 
    63                 virtual bool GetForumTopicList (int id_forum, AMessageInfoExList& list, IProgress* progress = NULL) = 0; 
     62                // возвращает список id топиков (родительских веток) для форума 
     63                virtual bool GetForumTopicList (int id_forum, QList<int>& list, IProgress* progress = NULL) = 0; 
    6464 
     65/* 
    6566                // возвращает список сообщений в топике (родительской ветке) 
     67                // должны быть заполнены все поля 
    6668                virtual bool GetTopicMessageList (int id_topic, AMessageInfoExList& list, IProgress* progress = NULL) = 0; 
    67  
    68                 // возвращает тело сообщения 
    69                 virtual bool GetMessageInfo (int id_message, QString& body, IProgress* progress = NULL) = 0; 
     69*/ 
     70                // заполняет полную информацию о топиках 
     71                virtual bool GetTopicInfo (AMessageInfoExList& list, IProgress* progress = NULL) = 0; 
    7072 
    7173                // пометить группу сущностей как прочитанное/непрочитанное 
     
    8082                virtual bool Unsubscribe (const QList<int>& list, AIDSet type, bool clean, IProgress* progress = NULL) = 0; 
    8183 
     84        // deprecated: 
     85 
    8286                // возвращает существующие id сообщений в заданном интервале 
    8387                virtual bool GetMessageIds (int from_id, int to_id, QList<int>& list, IProgress* progress = NULL) = 0; 
  • trunk/storage/mysql_storage.cpp

    r39 r41  
    14511451//---------------------------------------------------------------------------------------------- 
    14521452 
    1453 bool AMySQLStorage::GetForumTopicList (int id_forum, AMessageInfoExList& list, IProgress* progress) 
     1453bool AMySQLStorage::GetForumTopicList (int id_forum, QList<int>& list, IProgress* progress) 
    14541454{ 
    14551455        if (progress != NULL) 
     
    14631463 
    14641464        sql += "SELECT\n"; 
    1465         sql += "        `id`,\n"; 
    1466         sql += "        `id_topic`,\n"; 
    1467         sql += "        `id_parent`,\n"; 
    1468         sql += "        `id_user`,\n"; 
    1469         sql += "        `id_forum`,\n"; 
    1470         sql += "        `subject`,\n"; 
    1471         sql += "        `message_name`,\n"; 
    1472         sql += "        `user_nick`,\n"; 
    1473         sql += "        `id_article`,\n"; 
    1474         sql += "        `message_date`,\n"; 
    1475         sql += "        `update_date`,\n"; 
    1476         sql += "        `user_role`,\n"; 
    1477         sql += "        `user_title`,\n"; 
    1478         sql += "        `user_title_color`,\n"; 
    1479         sql += "        `last_moderated`,\n"; 
    1480         sql += "        `has_child`\n"; 
     1465        sql += "        `id_message`\n"; 
    14811466        sql += "FROM\n"; 
    1482         sql += "        `message`\n"; 
     1467        sql += "        `message_topic`\n"; 
    14831468        sql += "WHERE\n"; 
    1484         sql += "        `id_forum`  = " + QString::number(id_forum) + " AND\n"; 
    1485         sql += "        `id_parent` = 0\n"; 
     1469        sql += "        `id_forum`  = " + QString::number(id_forum) + "\n"; 
    14861470        sql += "ORDER BY\n"; 
    14871471        sql += "        `message_date` DESC"; 
     
    14961480 
    14971481        while (query_select->next()) 
    1498         { 
    1499                 AMessageInfoEx info; 
    1500  
    1501                 info.IsRead         = true; 
    1502                 info.HasUnreadChild = false; 
    1503  
    1504                 info.ID             = query_select->value(0).toInt(); 
    1505                 info.IDTopic        = query_select->value(1).toInt(); 
    1506                 info.IDParent       = query_select->value(2).toInt(); 
    1507                 info.IDUser         = query_select->value(3).toInt(); 
    1508                 info.IDForum        = query_select->value(4).toInt(); 
    1509                 info.Subject        = query_select->value(5).toString(); 
    1510                 info.MessageName    = query_select->value(6).toString(); 
    1511                 info.UserNick       = query_select->value(7).toString(); 
    1512                 info.IDArticle      = query_select->value(8).toInt(); 
    1513                 info.MessageDate    = query_select->value(9).toDateTime(); 
    1514                 info.UpdateDate     = query_select->value(10).toDateTime(); 
    1515                 info.UserRole       = query_select->value(11).toString(); 
    1516                 info.UserTitle      = query_select->value(12).toString(); 
    1517                 info.UserTitleColor = query_select->value(13).toInt(); 
    1518                 info.LastModerated  = query_select->value(14).toDateTime(); 
    1519                 info.HasChild       = query_select->value(15).toInt(); 
    1520  
    1521                 list.append(info); 
    1522         } 
     1482                list.append(query_select->value(0).toInt()); 
    15231483 
    15241484        // 
     
    15521512 
    15531513                for (int i = 0; i < list.count(); i++) 
    1554                         if (list[i].ID == id) 
     1514                        if (list[i] == id) 
    15551515                        { 
    1556                                 list[i].HasUnreadChild = true; 
    15571516                                list.move(i, 0); 
    15581517                                break; 
     
    15881547 
    15891548                for (int i = 0; i < list.count(); i++) 
    1590                         if (list[i].ID == id) 
     1549                        if (list[i] == id) 
    15911550                        { 
    1592                                 list[i].IsRead = false; 
    15931551                                list.move(i, 0); 
    15941552                                break; 
     
    15991557} 
    16001558//---------------------------------------------------------------------------------------------- 
    1601  
     1559/* 
    16021560bool AMySQLStorage::GetTopicMessageList (int id_topic, AMessageInfoExList& list, IProgress* progress) 
    16031561{ 
     
    17081666} 
    17091667//---------------------------------------------------------------------------------------------- 
    1710  
    1711 bool AMySQLStorage::GetMessageInfo (int id_message, QString& body, IProgress* progress) 
     1668*/ 
     1669 
     1670bool AMySQLStorage::GetTopicInfo (AMessageInfoExList& list, IProgress* progress) 
    17121671{ 
    17131672        if (progress != NULL) 
    17141673                progress->OnProgress(0); 
    17151674 
     1675        // заполнение id-шников сообщений, которые требуется получить 
     1676        QString ids; 
     1677 
     1678        for (int i = 0; i < list.count(); i++) 
     1679        { 
     1680                ids += QString::number(list[i].ID); 
     1681 
     1682                if (i < list.count() - 1) 
     1683                        ids += ", "; 
     1684        } 
     1685 
    17161686        QString sql; 
    17171687 
    17181688        // 
    1719         // получение тела сообщения 
    1720         // 
    1721  
    1722         body = ""; 
     1689        // получение инфы топика 
     1690        // 
    17231691 
    17241692        sql += "SELECT\n"; 
    1725         sql += "        `message`\n"; 
     1693        sql += "        `id_message`,\n"; 
     1694        sql += "        `id_topic`,\n"; 
     1695        sql += "        `id_parent`,\n"; 
     1696        sql += "        `id_user`,\n"; 
     1697        sql += "        `id_forum`,\n"; 
     1698        sql += "        `subject`,\n"; 
     1699        sql += "        `message_name`,\n"; 
     1700        sql += "        `user_nick`,\n"; 
     1701        sql += "        `id_article`,\n"; 
     1702        sql += "        `message_date`,\n"; 
     1703        sql += "        `update_date`,\n"; 
     1704        sql += "        `user_role`,\n"; 
     1705        sql += "        `user_title`,\n"; 
     1706        sql += "        `user_title_color`,\n"; 
     1707        sql += "        `last_moderated`,\n"; 
     1708        sql += "        `has_child`\n"; 
    17261709        sql += "FROM\n"; 
    1727         sql += "        `message`\n"; 
     1710        sql += "        `message_topic`\n"; 
    17281711        sql += "WHERE\n"; 
    1729         sql += "        `id` = " + QString::number(id_message); 
     1712        sql += "        `id_message` IN (" + ids + ")"; 
    17301713 
    17311714        std::auto_ptr<AQuery> query_select(CreateQuery(sql, false)); 
     
    17381721 
    17391722        while (query_select->next()) 
    1740                 body = query_select->value(0).toString(); 
     1723        { 
     1724                int id = query_select->value(0).toInt(); 
     1725 
     1726                for (int i = 0; i < list.count(); i++) 
     1727                        if (id == list[i].ID) 
     1728                        { 
     1729                                list[i].IDTopic        = query_select->value(1).toInt(); 
     1730                                list[i].IDParent       = query_select->value(2).toInt(); 
     1731                                list[i].IDUser         = query_select->value(3).toInt(); 
     1732                                list[i].IDForum        = query_select->value(4).toInt(); 
     1733                                list[i].Subject        = query_select->value(5).toString(); 
     1734                                list[i].MessageName    = query_select->value(6).toString(); 
     1735                                list[i].UserNick       = query_select->value(7).toString(); 
     1736                                list[i].IDArticle      = query_select->value(8).toInt(); 
     1737                                list[i].MessageDate    = query_select->value(9).toDateTime(); 
     1738                                list[i].UpdateDate     = query_select->value(10).toDateTime(); 
     1739                                list[i].UserRole       = query_select->value(11).toString(); 
     1740                                list[i].UserTitle      = query_select->value(12).toString(); 
     1741                                list[i].UserTitleColor = query_select->value(13).toInt(); 
     1742                                list[i].LastModerated  = query_select->value(14).toDateTime(); 
     1743                                list[i].HasChild       = query_select->value(15).toInt(); 
     1744 
     1745                                list[i].IsRead         = true; 
     1746 
     1747                                break; 
     1748                        } 
     1749        } 
     1750 
     1751        // 
     1752        // получение списка непрочитаных 
     1753        // 
     1754 
     1755        sql  = ""; 
     1756        sql += "SELECT\n"; 
     1757        sql += "        `id_message`\n"; 
     1758        sql += "FROM\n"; 
     1759        sql += "        `unread`\n"; 
     1760        sql += "WHERE\n"; 
     1761        sql += "        `id_message` IN (" + ids + ")"; 
     1762 
     1763        std::auto_ptr<AQuery> query_select_unread(CreateQuery(sql, false)); 
     1764 
     1765        if (query_select_unread.get() == NULL) 
     1766                return ReturnError(AMySQLDatabase::LastError()); 
     1767 
     1768        if (query_select_unread->exec() == false) 
     1769                return ReturnError(query_select_unread->LastError()); 
     1770 
     1771        while (query_select_unread->next()) 
     1772        { 
     1773                int id = query_select_unread->value(0).toInt(); 
     1774 
     1775                for (int i = 0; i < list.count(); i++) 
     1776                        if (id == list[i].ID) 
     1777                        { 
     1778                                list[i].IsRead = false; 
     1779                                break; 
     1780                        } 
     1781        } 
    17411782 
    17421783        return ReturnSuccess(); 
  • trunk/storage/mysql_storage.h

    r37 r41  
    6161 
    6262                // возвращает список топиков (родительских веток) для форума 
    63                 bool GetForumTopicList (int id_forum, AMessageInfoExList& list, IProgress* progress = NULL); 
    64  
     63                bool GetForumTopicList (int id_forum, QList<int>& list, IProgress* progress = NULL); 
     64/* 
    6565                // возвращает список сообщений в топике (родительской ветке) 
    6666                bool GetTopicMessageList (int id_topic, AMessageInfoExList& list, IProgress* progress = NULL); 
    67  
    68                 // возвращает тело сообщения 
    69                 bool GetMessageInfo (int id_message, QString& body, IProgress* progress = NULL); 
     67*/ 
     68                // заполняет полную информацию о топиках 
     69                bool GetTopicInfo (AMessageInfoExList& list, IProgress* progress = NULL); 
    7070 
    7171                // пометить группу сущностей как прочитанное/непрочитанное 
  • trunk/sysheaders.h

    r31 r41  
    2626#include <QTimeEdit> 
    2727#include <QGroupBox> 
     28#include <QScrollBar> 
    2829#include <QStatusBar> 
    2930#include <QTreeWidget> 
     
    4243#include <QCalendarWidget> 
    4344//---------------------------------------------------------------------------------------------- 
     45#define DEBUG_MSG(x) QMessageBox::critical(0, QString::fromUtf8("Ошибка!"), x) 
     46//---------------------------------------------------------------------------------------------- 
     47#include <sys/time.h> 
     48//---------------------------------------------------------------------------------------------- 
     49class Profiler 
     50{ 
     51        public: 
     52 
     53                Profiler () 
     54                { 
     55                        Start(); 
     56                } 
     57 
     58                void Start () 
     59                { 
     60                        gettimeofday(&m_start, 0); 
     61                } 
     62 
     63                void Stop () 
     64                { 
     65                        gettimeofday(&m_stop, 0); 
     66 
     67                        long long int delta = (m_stop.tv_sec - m_start.tv_sec) * 1000 + (m_stop.tv_usec - m_start.tv_usec) / 1000; 
     68 
     69                        QString msg = QString::number(delta) + "ms"; 
     70 
     71                        QMessageBox::information(0, QString::fromUtf8("Таймер!"), msg); 
     72                } 
     73 
     74        private: 
     75 
     76                timeval m_start; 
     77                timeval m_stop; 
     78}; 
     79//---------------------------------------------------------------------------------------------- 
    4480#endif 
Note: See TracChangeset for help on using the changeset viewer.