Changeset 179


Ignore:
Timestamp:
03/23/09 15:08:36 (3 years ago)
Author:
antonbatenev.ya.ru
Message:

Промежуточный в бранче:\

  • найдена ошибка с двойным запросом данных; \
  • начало оптимизации;
  • оптимизация запроса получения списка топиков.
Location:
branches/message_tree
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/message_tree/message_tree.cpp

    r178 r179  
    66//---------------------------------------------------------------------------------------------- 
    77#include "message_tree.h" 
     8//---------------------------------------------------------------------------------------------- 
     9#include "global.h" 
    810#include "icon_effect.h" 
     11#include "tree_widget_item.h" 
     12#include "storage/storage_factory.h" 
     13//---------------------------------------------------------------------------------------------- 
     14/*! 
     15 * \brief Элемент, который хранится в каждой ноде дерева 
     16 */ 
     17typedef struct AMessageInfoGUI 
     18{ 
     19        ATopicInfo Info; /*!< \brief Дескриптор сообщения */ 
     20}; 
     21//---------------------------------------------------------------------------------------------- 
     22/*! 
     23 * \brief Элемент для дерева группы форумов с информацией о группе 
     24 */ 
     25typedef ATreeWidgetItemT<AMessageInfoGUI> MessageTreeWidgetItem; 
    926//---------------------------------------------------------------------------------------------- 
    1027 
     
    1532        m_message_view = 0; 
    1633        m_main_form    = 0; 
     34 
     35        m_current_forum.ID        = 0; 
     36        m_current_forum.IDGroup   = 0; 
     37        m_current_forum.ShortName = ""; 
     38        m_current_forum.Name      = ""; 
     39        m_current_forum.Rated     = false; 
     40        m_current_forum.InTop     = false; 
     41        m_current_forum.RateLimit = 0; 
    1742 
    1843        setFrameShadow(QFrame::Plain); 
     
    188213//---------------------------------------------------------------------------------------------- 
    189214 
     215void AMessageTree::vertical_scroll (int /*value*/) 
     216{ 
     217} 
     218//---------------------------------------------------------------------------------------------- 
     219 
     220void AMessageTree::expand_item (QTreeWidgetItem* item_expanded) 
     221{ 
     222} 
     223//---------------------------------------------------------------------------------------------- 
     224 
     225void AMessageTree::timer_on_timer () 
     226{ 
     227} 
     228//---------------------------------------------------------------------------------------------- 
     229 
     230void AMessageTree::showSource () 
     231{ 
     232} 
     233//---------------------------------------------------------------------------------------------- 
     234 
     235void AMessageTree::selection_changed () 
     236{ 
     237} 
     238//---------------------------------------------------------------------------------------------- 
     239 
     240void AMessageTree::menu_mark_message_as_read_triggered () 
     241{ 
     242} 
     243//---------------------------------------------------------------------------------------------- 
     244 
     245void AMessageTree::menu_mark_message_as_unread_triggered () 
     246{ 
     247} 
     248//---------------------------------------------------------------------------------------------- 
     249 
     250void AMessageTree::menu_mark_thread_as_read_triggered () 
     251{ 
     252} 
     253//---------------------------------------------------------------------------------------------- 
     254 
     255void AMessageTree::menu_mark_thread_as_unread_triggered () 
     256{ 
     257} 
     258//---------------------------------------------------------------------------------------------- 
     259 
     260void AMessageTree::menu_reply_triggered () 
     261{ 
     262} 
     263//---------------------------------------------------------------------------------------------- 
     264 
     265void AMessageTree::processUrl (const QString& url) 
     266{ 
     267} 
     268//---------------------------------------------------------------------------------------------- 
     269 
     270void AMessageTree::gotoNextUnreadArticle () 
     271{ 
     272} 
     273//---------------------------------------------------------------------------------------------- 
     274 
     275void AMessageTree::gotoNextUnreadThread () 
     276{ 
     277} 
     278//---------------------------------------------------------------------------------------------- 
     279 
     280void AMessageTree::menu_special_delete_triggered () 
     281{ 
     282} 
     283//---------------------------------------------------------------------------------------------- 
     284 
     285void AMessageTree::item_double_clicked (QTreeWidgetItem* item, int /*column*/) 
     286{ 
     287} 
     288//---------------------------------------------------------------------------------------------- 
     289 
     290void AMessageTree::menu_special_edit_triggered () 
     291{ 
     292} 
     293//---------------------------------------------------------------------------------------------- 
     294 
     295void AMessageTree::menu_special_plus_1_triggered () 
     296{ 
     297} 
     298//---------------------------------------------------------------------------------------------- 
     299 
     300void AMessageTree::menu_special_1_triggered () 
     301{ 
     302} 
     303//---------------------------------------------------------------------------------------------- 
     304 
     305void AMessageTree::menu_special_2_triggered () 
     306{ 
     307} 
     308//---------------------------------------------------------------------------------------------- 
     309 
     310void AMessageTree::menu_special_3_triggered () 
     311{ 
     312} 
     313//---------------------------------------------------------------------------------------------- 
     314 
     315void AMessageTree::menu_special_smile_triggered () 
     316{ 
     317} 
     318//---------------------------------------------------------------------------------------------- 
     319 
     320void AMessageTree::menu_special_plus_triggered () 
     321{ 
     322} 
     323//---------------------------------------------------------------------------------------------- 
     324 
     325void AMessageTree::menu_special_minus_triggered () 
     326{ 
     327} 
     328//---------------------------------------------------------------------------------------------- 
     329 
     330void AMessageTree::getSelectedPath (QList<int>& path) 
     331{ 
     332} 
     333//---------------------------------------------------------------------------------------------- 
     334 
     335bool AMessageTree::selectByPath (const QList<int>* path) 
     336{ 
     337} 
     338//---------------------------------------------------------------------------------------------- 
     339 
    190340void AMessageTree::changeForum (const AForumInfo* forum_info) 
    191341{ 
    192 } 
    193 //---------------------------------------------------------------------------------------------- 
    194  
    195 void AMessageTree::vertical_scroll (int /*value*/) 
    196 { 
    197 } 
    198 //---------------------------------------------------------------------------------------------- 
    199  
    200 void AMessageTree::expand_item (QTreeWidgetItem* item_expanded) 
    201 { 
    202 } 
    203 //---------------------------------------------------------------------------------------------- 
    204  
    205 void AMessageTree::timer_on_timer () 
    206 { 
    207 } 
    208 //---------------------------------------------------------------------------------------------- 
    209  
    210 void AMessageTree::showSource () 
    211 { 
    212 } 
    213 //---------------------------------------------------------------------------------------------- 
    214  
    215 void AMessageTree::selection_changed () 
    216 { 
    217 } 
    218 //---------------------------------------------------------------------------------------------- 
    219  
    220 void AMessageTree::menu_mark_message_as_read_triggered () 
    221 { 
    222 } 
    223 //---------------------------------------------------------------------------------------------- 
    224  
    225 void AMessageTree::menu_mark_message_as_unread_triggered () 
    226 { 
    227 } 
    228 //---------------------------------------------------------------------------------------------- 
    229  
    230 void AMessageTree::menu_mark_thread_as_read_triggered () 
    231 { 
    232 } 
    233 //---------------------------------------------------------------------------------------------- 
    234  
    235 void AMessageTree::menu_mark_thread_as_unread_triggered () 
    236 { 
    237 } 
    238 //---------------------------------------------------------------------------------------------- 
    239  
    240 void AMessageTree::menu_reply_triggered () 
    241 { 
    242 } 
    243 //---------------------------------------------------------------------------------------------- 
    244  
    245 void AMessageTree::processUrl (const QString& url) 
    246 { 
    247 } 
    248 //---------------------------------------------------------------------------------------------- 
    249  
    250 void AMessageTree::gotoNextUnreadArticle () 
    251 { 
    252 } 
    253 //---------------------------------------------------------------------------------------------- 
    254  
    255 void AMessageTree::gotoNextUnreadThread () 
    256 { 
    257 } 
    258 //---------------------------------------------------------------------------------------------- 
    259  
    260 void AMessageTree::menu_special_delete_triggered () 
    261 { 
    262 } 
    263 //---------------------------------------------------------------------------------------------- 
    264  
    265 void AMessageTree::item_double_clicked (QTreeWidgetItem* item, int /*column*/) 
    266 { 
    267 } 
    268 //---------------------------------------------------------------------------------------------- 
    269  
    270 void AMessageTree::menu_special_edit_triggered () 
    271 { 
    272 } 
    273 //---------------------------------------------------------------------------------------------- 
    274  
    275 void AMessageTree::menu_special_plus_1_triggered () 
    276 { 
    277 } 
    278 //---------------------------------------------------------------------------------------------- 
    279  
    280 void AMessageTree::menu_special_1_triggered () 
    281 { 
    282 } 
    283 //---------------------------------------------------------------------------------------------- 
    284  
    285 void AMessageTree::menu_special_2_triggered () 
    286 { 
    287 } 
    288 //---------------------------------------------------------------------------------------------- 
    289  
    290 void AMessageTree::menu_special_3_triggered () 
    291 { 
    292 } 
    293 //---------------------------------------------------------------------------------------------- 
    294  
    295 void AMessageTree::menu_special_smile_triggered () 
    296 { 
    297 } 
    298 //---------------------------------------------------------------------------------------------- 
    299  
    300 void AMessageTree::menu_special_plus_triggered () 
    301 { 
    302 } 
    303 //---------------------------------------------------------------------------------------------- 
    304  
    305 void AMessageTree::menu_special_minus_triggered () 
    306 { 
    307 } 
    308 //---------------------------------------------------------------------------------------------- 
    309  
    310 void AMessageTree::getSelectedPath (QList<int>& path) 
    311 { 
    312 } 
    313 //---------------------------------------------------------------------------------------------- 
    314  
    315 bool AMessageTree::selectByPath (const QList<int>* path) 
    316 { 
    317 } 
    318 //---------------------------------------------------------------------------------------------- 
     342        // 
     343        // базовая очистка 
     344        // 
     345 
     346        m_current_forum.ID        = 0; 
     347        m_current_forum.IDGroup   = 0; 
     348        m_current_forum.ShortName = ""; 
     349        m_current_forum.Name      = ""; 
     350        m_current_forum.Rated     = false; 
     351        m_current_forum.InTop     = false; 
     352        m_current_forum.RateLimit = 0; 
     353 
     354        if (m_main_form != NULL) 
     355                m_main_form->setEnabledAction(aaViewSource, false); 
     356 
     357        clear(); 
     358 
     359        m_message_view->clear(); 
     360 
     361        scrollToTop(); 
     362 
     363        // если выделена группа, то просто очистка 
     364        if (forum_info == NULL) 
     365        { 
     366                headerItem()->setText(0, QString::fromUtf8("тема")); 
     367 
     368                QFont font = headerItem()->font(0); 
     369                font.setBold(false); 
     370                headerItem()->setFont(0, font); 
     371 
     372                return; 
     373        } 
     374 
     375        // 
     376        // есть форум для отображения 
     377        // 
     378 
     379        m_current_forum.ID        = forum_info->ID; 
     380        m_current_forum.IDGroup   = forum_info->IDGroup; 
     381        m_current_forum.ShortName = forum_info->ShortName; 
     382        m_current_forum.Name      = forum_info->Name; 
     383        m_current_forum.Rated     = forum_info->Rated; 
     384        m_current_forum.InTop     = forum_info->InTop; 
     385        m_current_forum.RateLimit = forum_info->RateLimit; 
     386 
     387        // вывод наименования форума в хедер 
     388        headerItem()->setText(0, m_current_forum.Name); 
     389 
     390        // 
     391        // загрузка топиков в зависимости от типа форума 
     392        // 
     393 
     394        // получение хранилища 
     395        std::auto_ptr<IAStorage> storage(AStorageFactory::getStorage()); 
     396 
     397        if (storage.get() == NULL) 
     398        { 
     399                QMessageBox::critical(m_parent, QString::fromUtf8("Ошибка!"), QString::fromUtf8("Не выбрано хранилище данных")); 
     400                return; 
     401        } 
     402 
     403        // если группа форумов обыкновенная 
     404        if (m_current_forum.IDGroup != SPECIAL_ID_GROUP) 
     405        { 
     406                // получение топиков 
     407                // ориентировочное время выполнения 68 ms (для форума NET, 28199 топиков) 
     408                QList<int> topic_list; 
     409 
     410                if (storage->getForumTopicList(m_current_forum.ID, AGlobal::getInstance()->MaxTopicToShow, topic_list, NULL) == false) 
     411                { 
     412                        storage->showError(m_parent); 
     413                        return; 
     414                } 
     415AProfiler p; for (int profiler = 0; profiler < 1000; profiler++) { 
     416                // установка топиков 
     417                // ориентировочное время выполнения 50 ms (для форума NET, 28199 топиков) 
     418                QList<QTreeWidgetItem*> items; 
     419                MessageTreeWidgetItem* items_array = new MessageTreeWidgetItem[topic_list.count()]; 
     420 
     421                for (int i = 0; i < topic_list.count(); i++) 
     422                { 
     423                        MessageTreeWidgetItem* item = &items_array[i]; 
     424 
     425                        //MessageTreeWidgetItem* item = new MessageTreeWidgetItem(); 
     426 
     427                        // начальное заполнение дескриптора топика 
     428                        AMessageInfoGUI* info = item->pag(); 
     429 
     430                        //info->Info.ID = topic_list[i]; 
     431 
     432                        items.append(item); 
     433                } 
     434 
     435                // отображение на виджет 
     436                addTopLevelItems(items); 
     437clear(); 
     438                } p.stop(1000); 
     439        } 
     440        else   // if (forum_info->IDGroup != SPECIAL_ID_GROUP) 
     441        { 
     442        } 
     443} 
     444//---------------------------------------------------------------------------------------------- 
  • branches/message_tree/message_tree.h

    r178 r179  
    7070        private: 
    7171 
    72                 /*! 
    73                  * \brief Главная форма приложения (для отображения сообщений об ошибках) 
    74                  */ 
    75                 QWidget* m_parent; 
     72                QWidget* m_parent; /*!< \brief Главная форма приложения (для отображения сообщений об ошибках) */ 
    7673 
    7774                IForumTree*   m_forum_tree;   /*!< \brief Интерфейс дерева форумов        */ 
     
    129126                QAction* m_menu_special_minus;  /*!< \brief - (несогласен) */ 
    130127 
     128                // 
     129                // внутренние переменные 
     130                // 
     131 
     132                AForumInfo m_current_forum; 
     133 
    131134        // IMessageTree 
    132135        public: 
  • branches/message_tree/storage/database.cpp

    r94 r179  
    2626AQuery* ADatabase::createQuery (const QString& sql) 
    2727{ 
    28         return new AQuery(this, sql); 
     28        return createPreparedQuery(sql); 
    2929} 
    3030//---------------------------------------------------------------------------------------------- 
     
    3232AQuery* ADatabase::createPreparedQuery (const QString& sql) 
    3333{ 
    34         AQuery* query = createQuery(); 
     34        AQuery* query = new AQuery(this); 
    3535 
    3636        if (query->prepare(sql) == false) 
  • branches/message_tree/storage/mysql_database.cpp

    r96 r179  
    128128 
    129129        if (prepared == true) 
    130         { 
    131                 query = createPreparedQuery(sql); 
    132  
    133                 if (query == NULL) 
    134                 { 
    135                         if (m_transaction) 
    136                                 rollback(); 
    137                         else 
    138                                 ADatabase::close(); 
    139  
    140                         return 0; 
    141                 } 
    142         } 
     130                query = ADatabase::createPreparedQuery(sql); 
    143131        else 
    144132                query = ADatabase::createQuery(sql); 
     133 
     134        if (query == NULL) 
     135        { 
     136                if (m_transaction) 
     137                        rollback(); 
     138                else 
     139                        ADatabase::close(); 
     140        } 
    145141 
    146142        return query; 
  • branches/message_tree/storage/mysql_storage.cpp

    r177 r179  
    3434        else 
    3535                IAStorage::setLastError(message); 
     36 
     37        close(); 
    3638 
    3739        return false; 
     
    18341836        sql += "        `id_forum` = " + QString::number(id_forum) + "\n"; 
    18351837        sql += "ORDER BY\n"; 
    1836         sql += "        `message_date` DESC"; 
     1838 
     1839        // поскльку id_message автоинкремент и растет вместе с датой, то 
     1840        // можно условно положиться на то, что бОльшему id_message соответствует 
     1841        // бОльшая дата - в результате сортировка дает ~50% выигрыша в производительности 
     1842        //sql += "      `message_date` DESC"; 
     1843 
     1844        sql += "        `id_message` DESC"; 
    18371845 
    18381846        if (count > 0) 
     
    18461854        if (query_select.get() == NULL) 
    18471855                return returnError(AMySQLDatabase::getLastError()); 
     1856 
     1857        query_select->setForwardOnly(true); 
    18481858 
    18491859        if (query_select->exec() == false) 
     
    18751885                return returnError(AMySQLDatabase::getLastError()); 
    18761886 
     1887        query_select_unread_child->setForwardOnly(true); 
     1888 
    18771889        if (query_select_unread_child->exec() == false) 
    18781890                return returnError(query_select_unread_child->getLastError()); 
     
    19091921        if (query_select_unread_topic.get() == NULL) 
    19101922                return returnError(AMySQLDatabase::getLastError()); 
     1923 
     1924        query_select_unread_topic->setForwardOnly(true); 
    19111925 
    19121926        if (query_select_unread_topic->exec() == false) 
  • branches/message_tree/sysheaders.h

    r177 r179  
    9191class AProfiler 
    9292{ 
    93         public: 
     93        public: 
    9494 
    9595                /*! 
    9696                 * \brief При создании экземпляра создается первая отсечка времени. 
    9797                 */ 
    98                 AProfiler () 
    99                 { 
    100                         Start(); 
    101                 } 
     98                AProfiler () 
     99                { 
     100                        start(); 
     101                } 
    102102 
    103103                /*! 
     
    105105                 * при повторном вызове заменяет старую отсечку времени текущей. 
    106106                 */ 
    107                 void Start () 
    108                 { 
    109                         gettimeofday(&m_start, 0); 
    110                 } 
     107                void start () 
     108                { 
     109                        gettimeofday(&m_start, 0); 
     110                } 
    111111 
    112112                /*! 
    113113                 * \brief Создание второй отсечки времени и вывод разницы между текущей отсечкой и стартовой в миллисекундах. 
     114                 * \param ittr Количество итераций 
    114115                 */ 
    115                 void Stop () 
    116                 { 
    117                         gettimeofday(&m_stop, 0); 
     116                void stop (int ittr = 1) 
     117                { 
     118                        gettimeofday(&m_stop, 0); 
    118119 
    119                         long long int delta = (m_stop.tv_sec - m_start.tv_sec) * 1000 + (m_stop.tv_usec - m_start.tv_usec) / 1000; 
     120                        long long int delta = (m_stop.tv_sec - m_start.tv_sec) * 1000 + (m_stop.tv_usec - m_start.tv_usec) / 1000; 
    120121 
    121                         QString msg = QString::number(delta) + "ms"; 
     122                        QString msg; 
    122123 
    123                         QMessageBox::information(0, QString::fromUtf8("Таймер!"), msg); 
    124                 } 
     124                        msg += QString::fromUtf8("Общее время : ") + QString::number(delta) + " ms\n"; 
     125                        msg += QString::fromUtf8("Среднее время : ") + QString::number(delta / ittr) + " ms"; 
    125126 
    126         private: 
     127                        QMessageBox::information(0, QString::fromUtf8("Таймер!"), msg); 
     128                } 
     129 
     130        private: 
    127131 
    128132                /*! 
    129133                 * \brief Время вызова функции Start(). 
    130134                 */ 
    131                 timeval m_start; 
     135                timeval m_start; 
     136 
    132137                /*! 
    133138                 * \brief Время вызова функции Stop(). 
    134139                 */ 
    135                 timeval m_stop; 
     140                timeval m_stop; 
    136141}; 
    137142 
  • branches/message_tree/version.h

    r178 r179  
    2020 * \brief Дата билда (заменяется автоматически при каждом билде в version.h, что и приводит к смене номера ревизии) 
    2121 */ 
    22 #define AVALON_DATE "Пнд Мар 23 09:01:24 MSK 2009" 
     22#define AVALON_DATE "Пнд Мар 23 11:39:19 MSK 2009" 
    2323 
    2424#endif 
Note: See TracChangeset for help on using the changeset viewer.