Author: JirkaH Date: 2010-02-23 21:02:14 +0100 (Tue, 23 Feb 2010) New Revision: 1837 Added: trunk/client/elvys-client/src/timestamper.cpp trunk/client/elvys-client/src/timestamper.h Modified: trunk/client/elvys-client/src/Makefile trunk/client/elvys-client/src/constants.h trunk/client/elvys-client/src/elvys.cpp trunk/client/elvys-client/src/elvys.h trunk/client/elvys-client/src/pdfcommonviewer.cpp trunk/client/elvys-client/src/src.pro trunk/client/elvys-client/src/statisticsdata.cpp trunk/client/elvys-client/src/statisticsdata.h trunk/client/elvys-client/src/xmlstatisticswriter.cpp trunk/client/elvys-client/src/xmlstatisticswriter.h Log: timestamping for statistics added Modified: trunk/client/elvys-client/src/Makefile =================================================================== --- trunk/client/elvys-client/src/Makefile 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/Makefile 2010-02-23 20:02:14 UTC (rev 1837) @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: ../bin/elvys-client -# Generated by qmake (2.01a) (Qt 4.5.3) on: Thu Feb 18 17:45:54 2010 +# Generated by qmake (2.01a) (Qt 4.5.3) on: Tue Feb 23 20:39:27 2010 # Project: src.pro # Template: app # Command: /usr/bin/qmake -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=release -o Makefile src.pro @@ -91,7 +91,8 @@ logotabbar.cpp \ pdfpresentationdocument.cpp \ pdfpresentationviewer.cpp \ - pdfcommonviewer.cpp moc_elvys.cpp \ + pdfcommonviewer.cpp \ + timestamper.cpp moc_elvys.cpp \ moc_pdfdocument.cpp \ moc_pdffiller.cpp \ moc_pdfviewer.cpp \ @@ -131,6 +132,7 @@ moc_pdfpresentationdocument.cpp \ moc_pdfpresentationviewer.cpp \ moc_pdfcommonviewer.cpp \ + moc_timestamper.cpp \ qrc_application.cpp OBJECTS = main.o \ pdfdocument.o \ @@ -182,6 +184,7 @@ pdfpresentationdocument.o \ pdfpresentationviewer.o \ pdfcommonviewer.o \ + timestamper.o \ moc_elvys.o \ moc_pdfdocument.o \ moc_pdffiller.o \ @@ -222,6 +225,7 @@ moc_pdfpresentationdocument.o \ moc_pdfpresentationviewer.o \ moc_pdfcommonviewer.o \ + moc_timestamper.o \ qrc_application.o DIST = serialport \ /usr/share/qt4/mkspecs/common/g++.conf \ @@ -335,7 +339,7 @@ dist: @$(CHK_DIR_EXISTS) .tmp/elvys-client1.0.0 || $(MKDIR) .tmp/elvys-client1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/elvys-client1.0.0/ && $(COPY_FILE) --parents elvys.h pdfdocument.h pdffiller.h pdfviewer.h pdfzoomed.h constants.h pdfpage.h statictext.h xmllayoutparser.h xmldocumentparser.h appconfig.h screenshooter.h http.h dynamictext.h serial/posix_qextserialport.h serialcontrols.h serial/qextserialbase.h serial/qextserialport.h xmlappparser.h xmlabstractparser.h appmaintainer.h abstractmaintainer.h layoutmaintainer.h documentmaintainer.h document.h modechanger.h saver.h appconfigdata.h dummydocument.h page.h xmlstatisticswriter.h textdocument.h pageselector.h category.h panel.h categorymaintainerdoc.h categorymaintainerlayout.h xmlcatlayoutparser.h categorymanager.h xmlcatdocparser.h xmlpaneldocparser.h statisticevent.h statisticsdata.h statistics.h videodocument.h autodeleter.h xmlfilecacheparser.h filecachemaintainer.h logotabbar.h pdfpresentationdocument.h pdfpresentationviewer.h pdfcommonviewer.h .tmp/elvys-client1.0.0/ && $(COPY_FIL E) --parents application.qrc .tmp/elvys-client1.0.0/ && $(COPY_FILE) --parents main.cpp pdfdocument.cpp pdffiller.cpp pdfviewer.cpp pdfzoomed.cpp pdfpage.cpp xmllayoutparser.cpp elvys.cpp xmldocumentparser.cpp appconfig.cpp screenshooter.cpp http.cpp dynamictext.cpp statictext.cpp serial/posix_qextserialport.cpp serial/qextserialbase.cpp serial/qextserialport.cpp serialcontrols.cpp xmlappparser.cpp xmlabstractparser.cpp abstractmaintainer.cpp appmaintainer.cpp layoutmaintainer.cpp documentmaintainer.cpp modechanger.cpp saver.cpp appconfigdata.cpp dummydocument.cpp page.cpp statisticsdata.cpp xmlstatisticswriter.cpp textdocument.cpp category.cpp panel.cpp categorymaintainerdoc.cpp categorymaintainerlayout.cpp xmlcatlayoutparser.cpp categorymanager.cpp xmlcatdocparser.cpp xmlpaneldocparser.cpp statisticevent.cpp statistics.cpp videodocument.cpp autodeleter.cpp xmlfilecacheparser.cpp filecachemaintainer.cpp logotabbar.cpp pdfpresentationdocument.cpp pdfpresentationviewer.cpp pd fcommonviewer.cpp .tmp/elvys-client1.0.0/ && (cd `dirname .tmp/elvys-client1.0.0` && $(TAR) elvys-client1.0.0.tar elvys-client1.0.0 && $(COMPRESS) elvys-client1.0.0.tar) && $(MOVE) `dirname .tmp/elvys-client1.0.0`/elvys-client1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/elvys-client1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/elvys-client1.0.0/ && $(COPY_FILE) --parents elvys.h pdfdocument.h pdffiller.h pdfviewer.h pdfzoomed.h constants.h pdfpage.h statictext.h xmllayoutparser.h xmldocumentparser.h appconfig.h screenshooter.h http.h dynamictext.h serial/posix_qextserialport.h serialcontrols.h serial/qextserialbase.h serial/qextserialport.h xmlappparser.h xmlabstractparser.h appmaintainer.h abstractmaintainer.h layoutmaintainer.h documentmaintainer.h document.h modechanger.h saver.h appconfigdata.h dummydocument.h page.h xmlstatisticswriter.h textdocument.h pageselector.h category.h panel.h categorymaintainerdoc.h categorymaintainerlayout.h xmlcatlayoutparser.h categorymanager.h xmlcatdocparser.h xmlpaneldocparser.h statisticevent.h statisticsdata.h statistics.h videodocument.h autodeleter.h xmlfilecacheparser.h filecachemaintainer.h logotabbar.h pdfpresentationdocument.h pdfpresentationviewer.h pdfcommonviewer.h timestamper.h .tmp/elvys-client1.0.0/ && $(COPY_FILE) --parents application.qrc .tmp/elvys-client1.0.0/ && $(COPY_FILE) --parents main.cpp pdfdocument.cpp pdffiller.cpp pdfviewer.cpp pdfzoomed.cpp pdfpage.cpp xmllayoutparser.cpp elvys.cpp xmldocumentparser.cpp appconfig.cpp screenshooter.cpp http.cpp dynamictext.cpp statictext.cpp serial/posix_qextserialport.cpp serial/qextserialbase.cpp serial/qextserialport.cpp serialcontrols.cpp xmlappparser.cpp xmlabstractparser.cpp abstractmaintainer.cpp appmaintainer.cpp layoutmaintainer.cpp documentmaintainer.cpp modechanger.cpp saver.cpp appconfigdata.cpp dummydocument.cpp page.cpp statisticsdata.cpp xmlstatisticswriter.cpp textdocument.cpp category.cpp panel.cpp categorymaintainerdoc.cpp categorymaintainerlayout.cpp xmlcatlayoutparser.cpp categorymanager.cpp xmlcatdocparser.cpp xmlpaneldocparser.cpp statisticevent.cpp statistics.cpp videodocument.cpp autodeleter.cpp xmlfilecacheparser.cpp filecachemaintainer.cpp logotabbar.cpp pdfpresentationdocument.cpp pdfpresentatio nviewer.cpp pdfcommonviewer.cpp timestamper.cpp .tmp/elvys-client1.0.0/ && (cd `dirname .tmp/elvys-client1.0.0` && $(TAR) elvys-client1.0.0.tar elvys-client1.0.0 && $(COMPRESS) elvys-client1.0.0.tar) && $(MOVE) `dirname .tmp/elvys-client1.0.0`/elvys-client1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/elvys-client1.0.0 clean:compiler_clean @@ -354,9 +358,9 @@ mocables: compiler_moc_header_make_all compiler_moc_source_make_all -compiler_moc_header_make_all: moc_elvys.cpp moc_pdfdocument.cpp moc_pdffiller.cpp moc_pdfviewer.cpp moc_pdfzoomed.cpp moc_statictext.cpp moc_xmllayoutparser.cpp moc_xmldocumentparser.cpp moc_screenshooter.cpp moc_http.cpp moc_dynamictext.cpp moc_xmlappparser.cpp moc_xmlabstractparser.cpp moc_appmaintainer.cpp moc_abstractmaintainer.cpp moc_layoutmaintainer.cpp moc_documentmaintainer.cpp moc_document.cpp moc_modechanger.cpp moc_saver.cpp moc_appconfigdata.cpp moc_dummydocument.cpp moc_textdocument.cpp moc_category.cpp moc_panel.cpp moc_categorymaintainerdoc.cpp moc_categorymaintainerlayout.cpp moc_xmlcatlayoutparser.cpp moc_categorymanager.cpp moc_xmlcatdocparser.cpp moc_xmlpaneldocparser.cpp moc_statisticsdata.cpp moc_statistics.cpp moc_videodocument.cpp moc_autodeleter.cpp moc_xmlfilecacheparser.cpp moc_filecachemaintainer.cpp moc_pdfpresentationdocument.cpp moc_pdfpresentationviewer.cpp moc_pdfcommonviewer.cpp +compiler_moc_header_make_all: moc_elvys.cpp moc_pdfdocument.cpp moc_pdffiller.cpp moc_pdfviewer.cpp moc_pdfzoomed.cpp moc_statictext.cpp moc_xmllayoutparser.cpp moc_xmldocumentparser.cpp moc_screenshooter.cpp moc_http.cpp moc_dynamictext.cpp moc_xmlappparser.cpp moc_xmlabstractparser.cpp moc_appmaintainer.cpp moc_abstractmaintainer.cpp moc_layoutmaintainer.cpp moc_documentmaintainer.cpp moc_document.cpp moc_modechanger.cpp moc_saver.cpp moc_appconfigdata.cpp moc_dummydocument.cpp moc_textdocument.cpp moc_category.cpp moc_panel.cpp moc_categorymaintainerdoc.cpp moc_categorymaintainerlayout.cpp moc_xmlcatlayoutparser.cpp moc_categorymanager.cpp moc_xmlcatdocparser.cpp moc_xmlpaneldocparser.cpp moc_statisticsdata.cpp moc_statistics.cpp moc_videodocument.cpp moc_autodeleter.cpp moc_xmlfilecacheparser.cpp moc_filecachemaintainer.cpp moc_pdfpresentationdocument.cpp moc_pdfpresentationviewer.cpp moc_pdfcommonviewer.cpp moc_timestamper.cpp compiler_moc_header_clean: - -$(DEL_FILE) moc_elvys.cpp moc_pdfdocument.cpp moc_pdffiller.cpp moc_pdfviewer.cpp moc_pdfzoomed.cpp moc_statictext.cpp moc_xmllayoutparser.cpp moc_xmldocumentparser.cpp moc_screenshooter.cpp moc_http.cpp moc_dynamictext.cpp moc_xmlappparser.cpp moc_xmlabstractparser.cpp moc_appmaintainer.cpp moc_abstractmaintainer.cpp moc_layoutmaintainer.cpp moc_documentmaintainer.cpp moc_document.cpp moc_modechanger.cpp moc_saver.cpp moc_appconfigdata.cpp moc_dummydocument.cpp moc_textdocument.cpp moc_category.cpp moc_panel.cpp moc_categorymaintainerdoc.cpp moc_categorymaintainerlayout.cpp moc_xmlcatlayoutparser.cpp moc_categorymanager.cpp moc_xmlcatdocparser.cpp moc_xmlpaneldocparser.cpp moc_statisticsdata.cpp moc_statistics.cpp moc_videodocument.cpp moc_autodeleter.cpp moc_xmlfilecacheparser.cpp moc_filecachemaintainer.cpp moc_pdfpresentationdocument.cpp moc_pdfpresentationviewer.cpp moc_pdfcommonviewer.cpp + -$(DEL_FILE) moc_elvys.cpp moc_pdfdocument.cpp moc_pdffiller.cpp moc_pdfviewer.cpp moc_pdfzoomed.cpp moc_statictext.cpp moc_xmllayoutparser.cpp moc_xmldocumentparser.cpp moc_screenshooter.cpp moc_http.cpp moc_dynamictext.cpp moc_xmlappparser.cpp moc_xmlabstractparser.cpp moc_appmaintainer.cpp moc_abstractmaintainer.cpp moc_layoutmaintainer.cpp moc_documentmaintainer.cpp moc_document.cpp moc_modechanger.cpp moc_saver.cpp moc_appconfigdata.cpp moc_dummydocument.cpp moc_textdocument.cpp moc_category.cpp moc_panel.cpp moc_categorymaintainerdoc.cpp moc_categorymaintainerlayout.cpp moc_xmlcatlayoutparser.cpp moc_categorymanager.cpp moc_xmlcatdocparser.cpp moc_xmlpaneldocparser.cpp moc_statisticsdata.cpp moc_statistics.cpp moc_videodocument.cpp moc_autodeleter.cpp moc_xmlfilecacheparser.cpp moc_filecachemaintainer.cpp moc_pdfpresentationdocument.cpp moc_pdfpresentationviewer.cpp moc_pdfcommonviewer.cpp moc_timestamper.cpp moc_elvys.cpp: appmaintainer.h \ abstractmaintainer.h \ http.h \ @@ -397,6 +401,7 @@ textdocument.h \ statictext.h \ screenshooter.h \ + timestamper.h \ autodeleter.h \ elvys.h /usr/bin/moc $(DEFINES) $(INCPATH) elvys.h -o moc_elvys.cpp @@ -733,6 +738,9 @@ pdfcommonviewer.h /usr/bin/moc $(DEFINES) $(INCPATH) pdfcommonviewer.h -o moc_pdfcommonviewer.cpp +moc_timestamper.cpp: timestamper.h + /usr/bin/moc $(DEFINES) $(INCPATH) timestamper.h -o moc_timestamper.cpp + compiler_rcc_make_all: qrc_application.cpp compiler_rcc_clean: -$(DEL_FILE) qrc_application.cpp @@ -797,6 +805,7 @@ textdocument.h \ statictext.h \ screenshooter.h \ + timestamper.h \ autodeleter.h \ saver.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp @@ -906,6 +915,7 @@ textdocument.h \ statictext.h \ screenshooter.h \ + timestamper.h \ autodeleter.h \ serialcontrols.h \ serial/qextserialport.h \ @@ -1287,6 +1297,9 @@ appconfigdata.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o pdfcommonviewer.o pdfcommonviewer.cpp +timestamper.o: timestamper.cpp timestamper.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o timestamper.o timestamper.cpp + moc_elvys.o: moc_elvys.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_elvys.o moc_elvys.cpp @@ -1407,6 +1420,9 @@ moc_pdfcommonviewer.o: moc_pdfcommonviewer.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_pdfcommonviewer.o moc_pdfcommonviewer.cpp +moc_timestamper.o: moc_timestamper.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_timestamper.o moc_timestamper.cpp + qrc_application.o: qrc_application.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qrc_application.o qrc_application.cpp Modified: trunk/client/elvys-client/src/constants.h =================================================================== --- trunk/client/elvys-client/src/constants.h 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/constants.h 2010-02-23 20:02:14 UTC (rev 1837) @@ -34,4 +34,9 @@ #define ELVYS_VERSION "1.0-b1" + +/** File used for regular timestamping, so we can report when the application was previously started. +This should be somewhere on local disk (not RAM disk) */ +#define TIMESTAMP_FILE "/tmp/elvys.timestamp" + #endif Modified: trunk/client/elvys-client/src/elvys.cpp =================================================================== --- trunk/client/elvys-client/src/elvys.cpp 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/elvys.cpp 2010-02-23 20:02:14 UTC (rev 1837) @@ -17,6 +17,7 @@ timer->stop(); delete timer; delete deleter; + delete timeStamper; } void Elvys::checkAvailableSpace() { @@ -25,7 +26,7 @@ filesUsed.removeDuplicates(); deleter->setExcludeFileList(filesUsed); - deleter->start(); + deleter->start(); } @@ -74,6 +75,13 @@ connect(timer, SIGNAL(timeout()), this, SLOT(checkAvailableSpace())); timer->start(600*1000); //every ten minutes + + + timeStamper = new TimeStamper(QString(TIMESTAMP_FILE)); + timeStamper->setPeriod(300*1000); + timeStamper->start(); + + Statistics::getInstance()->sendRestartEvent(timeStamper->timeStamp()); //modeChanger.start(); QPixmapCache::setCacheLimit(PIXMAP_CACHE_LIMIT); Modified: trunk/client/elvys-client/src/elvys.h =================================================================== --- trunk/client/elvys-client/src/elvys.h 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/elvys.h 2010-02-23 20:02:14 UTC (rev 1837) @@ -12,6 +12,7 @@ #include "categorymanager.h" #include "screenshooter.h" #include "statistics.h" +#include "timestamper.h" #include "autodeleter.h" /** Tato trida tvori obal cele aplikace. Obsahuje v sobe vsechny podtridy, ktere jsou potreba. @@ -38,6 +39,7 @@ QVBoxLayout * layout; AutoDeleter * deleter; FileCacheMaintainer * filecache; + TimeStamper * timeStamper; QTimer * timer; }; Modified: trunk/client/elvys-client/src/pdfcommonviewer.cpp =================================================================== --- trunk/client/elvys-client/src/pdfcommonviewer.cpp 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/pdfcommonviewer.cpp 2010-02-23 20:02:14 UTC (rev 1837) @@ -81,9 +81,9 @@ void PDFCommonViewer::closeEnlargement() { if ( timeOpened >= AppConfig::getInstance()->getDocumentTimeOut() ) { - totallyUnZoom(); + totallyUnZoom(); } else { - timeOpened++; + timeOpened++; } } Modified: trunk/client/elvys-client/src/src.pro =================================================================== --- trunk/client/elvys-client/src/src.pro 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/src.pro 2010-02-23 20:02:14 UTC (rev 1837) @@ -49,7 +49,8 @@ logotabbar.cpp \ pdfpresentationdocument.cpp \ pdfpresentationviewer.cpp \ - pdfcommonviewer.cpp + pdfcommonviewer.cpp \ + timestamper.cpp HEADERS += elvys.h \ pdfdocument.h \ pdffiller.h \ @@ -101,7 +102,8 @@ logotabbar.h \ pdfpresentationdocument.h \ pdfpresentationviewer.h \ - pdfcommonviewer.h + pdfcommonviewer.h \ + timestamper.h TEMPLATE = app CONFIG += warn_on \ thread \ Modified: trunk/client/elvys-client/src/statisticsdata.cpp =================================================================== --- trunk/client/elvys-client/src/statisticsdata.cpp 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/statisticsdata.cpp 2010-02-23 20:02:14 UTC (rev 1837) @@ -13,6 +13,7 @@ */ StatisticsData::StatisticsData() { + restartEventSent = false; bool ok; db = QSqlDatabase::addDatabase("QSQLITE"); @@ -20,7 +21,7 @@ ok = db.open(); if ( ! ok ) { - //qDebug() << "Fatal error: Unable to open database " << DATABASE_NAME << ":" << db.lastError().text(); + qWarning() << "Fatal error: Unable to open database " << DATABASE_NAME << ":" << db.lastError().text(); exit(1); } @@ -30,18 +31,18 @@ //make sure right table exists: ok = query.exec(CREATE_TABLE_QUERY); if ( ! ok ) { - //qDebug() << "Fatal error: Unable to create table " << TABLE_NAME << ":" << query.lastError().text(); + qWarning() << "Fatal error: Unable to create table " << TABLE_NAME << ":" << query.lastError().text(); exit(1); } - + cleanDatabase(); //make sure all events that haven't been uploaded sucesfuly will get second chance queryUpdate.prepare("UPDATE " TABLE_NAME " SET uploading = 0"); ok = queryUpdate.exec(); if ( ! ok ) { - //qDebug() << "Query execution failed: " << queryUpdate.lastError(); - //qDebug() << queryUpdate.executedQuery(); + qWarning() << "Query execution failed: " << queryUpdate.lastError(); + qWarning() << queryUpdate.executedQuery(); } @@ -73,6 +74,57 @@ } +/** Sends event about restarting app restart. This is special event that should be sent only once at the start of aplication. Moreoever, + it must be guranteed that it will be delivered to the server before any other events. + @arg timeStamp when this application was running last time. In unixtime. + */ + +void StatisticsData::sendRestartEvent(int timeStamp) { + QString httpId = RESTART_EVENT_ID; + QByteArray * array = new QByteArray((const char *)NULL, 1000); + XMLStatisticsWriter * xmlWriter = new XMLStatisticsWriter(array); + + if (restartEventSent) { // restart event was sent already + return; + } + + xmlWriter->start(); + xmlWriter->writeRestartEvent(timeStamp); + xmlWriter->stop(); + + delete xmlWriter; + + HttpAddress address = AppConfig::getInstance()->getStatisticsAddress(); + QString userAgent = QString("Statistic") + QString("%1").arg(AppConfig::getInstance()->getMachineID()); + uploader->upload(httpId, address, *array, userAgent); + + qDebug() << array->data(); + + delete array; +} + + +/** Cleans database of all incomplete events. This is to prevent populating server db with faulty events after app restart. */ + +void StatisticsData::cleanDatabase() { + bool ok; + QSqlQuery query(db); + + query.prepare("UPDATE " TABLE_NAME " SET uploading = 0"); + + ok = query.exec(); + if ( ! ok ) { + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); + } +} + + +/** Process statistical event. + @arg event structure carrying information about event + @return true if event was processed, false otherwise + */ + bool StatisticsData::event(QEvent *event) { int docId; int layoutId; @@ -139,8 +191,8 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -171,8 +223,8 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.lastQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.lastQuery(); } } @@ -201,8 +253,8 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -225,8 +277,8 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -254,8 +306,8 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -279,13 +331,13 @@ ok = query.exec(); if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } if ( ! query.first() ) { //empty query - //qDebug() << query.executedQuery(); - //qDebug() << documentId << layoutId << layoutPosition << AppConfig::getInstance()->getCurrentModeString(); + qWarning() << query.executedQuery(); + qWarning() << documentId << layoutId << layoutPosition << AppConfig::getInstance()->getCurrentModeString(); query.prepare("INSERT INTO " TABLE_NAME " VALUES " INSERT_BINDING); query.bindValue(":elvys_id", AppConfig::getInstance()->getMachineID()); query.bindValue(":layout_id", layoutId); @@ -316,8 +368,8 @@ } if ( !ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -335,8 +387,8 @@ ok = query.exec("SELECT * FROM " TABLE_NAME " WHERE ( action_end != 0 OR action_type =\"" EXHIBIT_EVENT "\" ) AND uploading = 0"); if ( ! ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } if ( query.next() == false ) { @@ -371,14 +423,14 @@ ok = queryUpdate.exec(); if ( ! ok ) { - //qDebug() << "Query execution failed: " << queryUpdate.lastError(); - //qDebug() << queryUpdate.executedQuery(); + qWarning() << "Query execution failed: " << queryUpdate.lastError(); + qWarning() << queryUpdate.executedQuery(); } HttpAddress address = AppConfig::getInstance()->getStatisticsAddress(); QString userAgent = QString("Statistic") + QString("%1").arg(AppConfig::getInstance()->getMachineID()); uploader->upload(httpId, address, *array, userAgent); - //qDebug() << array->data(); + qWarning() << array->data(); delete array; delete xmlWriter; } @@ -391,13 +443,18 @@ bool ok; QSqlQuery query; + if ( id == RESTART_EVENT_ID ) { + restartEventSent = true; + return; + } + query.prepare("DELETE FROM " TABLE_NAME " WHERE uploading = :uploading AND ( action_end != 0 OR action_type =\"" EXHIBIT_EVENT "\" ) "); query.bindValue(":uploading", id); ok = query.exec(); if ( ! ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } @@ -414,7 +471,7 @@ ok = query.exec(); if ( ! ok ) { - //qDebug() << "Query execution failed: " << query.lastError(); - //qDebug() << query.executedQuery(); + qWarning() << "Query execution failed: " << query.lastError(); + qWarning() << query.executedQuery(); } } Modified: trunk/client/elvys-client/src/statisticsdata.h =================================================================== --- trunk/client/elvys-client/src/statisticsdata.h 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/statisticsdata.h 2010-02-23 20:02:14 UTC (rev 1837) @@ -31,6 +31,8 @@ #define DOWNLOAD_EVENT "download" #define EXHIBIT_EVENT "exhibit" +#define RESTART_EVENT_ID "restartEvent" + /** This class is responsible for statistics of document downloading, showing and zooming. It searches for matching events, (zoom and unzoom event of the same document for instance) and thus makes complete pairs of information. It also periodicaly tries to upload these statistics to the server. @@ -62,6 +64,7 @@ void uploadComplete(QString & id); void uploadFailed(const QString & id); void uploadStatistics(); + void sendRestartEvent(int lastUp); public: StatisticsData(); @@ -70,10 +73,13 @@ virtual bool event(QEvent *); private: + void cleanDatabase(); + QSqlDatabase db; QTimer * timer; StatsEvent * statEvent; Http * uploader; + bool restartEventSent; }; #endif // _ELVYS_STATISTICS_H_ Added: trunk/client/elvys-client/src/timestamper.cpp =================================================================== --- trunk/client/elvys-client/src/timestamper.cpp (rev 0) +++ trunk/client/elvys-client/src/timestamper.cpp 2010-02-23 20:02:14 UTC (rev 1837) @@ -0,0 +1,99 @@ +#include "timestamper.h" + +/** Class constructor. + @arg fileName file that is used for timestamp reference. Please note that the file might get rewritten. + */ + +TimeStamper::TimeStamper(const QString fileN) { + _fileName = fileN; + _period = 300 * 1000; + timer = new QTimer(); +} + + +/** Class destructor. + */ + +TimeStamper::~TimeStamper() { + if (timer->isActive()) { + timer->stop(); + } + delete timer; + timer = NULL; +} + +/** Returns current fileName used as timestamp. + @returns current filename used as timestamp + */ + +QString TimeStamper::fileName() { + return _fileName; +} + +/** Sets file used as reference for timestamp to @a fileName. + @arg fileName file name that should be set + */ + +void TimeStamper::setFileName(QString & fileName) { + fileName = _fileName; +} + +/** Returns current period for touching given file. + @returns period in which is given file touched + */ + +int TimeStamper::period() { + return _period; +} + +/** Sets period for touching the file to @a period. + @arg period to be set + */ +void TimeStamper::setPeriod(int period) { + _period = period; + + if (timer->isActive()) { + timer->setInterval(_period); + } +} + +/** Returns current timeStamp or 0 if no file was associated. + @returns current timestamp or 0 if no file was associated + */ + +int TimeStamper::timeStamp() { + QFileInfo fileI(_fileName); + + if (_fileName == "" || ! QFile::exists(_fileName)) { + return 0; + } + + return fileI.lastModified().toTime_t(); +} + +/** Starts periodical touching of the file set. If no file was set, it does nothing. + */ + +void TimeStamper::start() { + if ( _fileName == "" ) { + return; + } + touchFile(); + timer->start(_period); +} + +/** Touches the file previously set, or does nothing in case no file is set. + */ + +void TimeStamper::touchFile() { + QFile * file = new QFile(_fileName); + + if (! file->open(QIODevice::Append) ) { + qWarning() << "Cannot open file specified. Error: " << file->errorString(); + } else { + file->close(); + } + + delete file; +} + Added: trunk/client/elvys-client/src/timestamper.h =================================================================== --- trunk/client/elvys-client/src/timestamper.h (rev 0) +++ trunk/client/elvys-client/src/timestamper.h 2010-02-23 20:02:14 UTC (rev 1837) @@ -0,0 +1,34 @@ +#ifndef TIMESTAMPER_H +#define TIMESTAMPER_H + +#include <QObject> +#include <QString> +#include <QFile> +#include <QDebug> +#include <QFileInfo> +#include <QDateTime> +#include <QTimer> + +class TimeStamper : public QObject { + Q_OBJECT + +public: + TimeStamper(const QString fileN); + ~TimeStamper(); + QString fileName(); + void setFileName(QString & fileName); + int period(); + void setPeriod(int period); + int timeStamp(); + void start(); + +private slots: + void touchFile(); + +private: + QString _fileName; + int _period; + QTimer * timer; +}; + +#endif // TIMESTAMPER_H Modified: trunk/client/elvys-client/src/xmlstatisticswriter.cpp =================================================================== --- trunk/client/elvys-client/src/xmlstatisticswriter.cpp 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/xmlstatisticswriter.cpp 2010-02-23 20:02:14 UTC (rev 1837) @@ -28,6 +28,17 @@ writeStartElement("elvys_stats"); } + +/** Writes restart event into device, buffer or string specified by constructor. Restart Event is special kind of event that should be + send only once at application start. + @arg lastHeartBeat last know time when application was previously running. In unixtime. + */ + +void XMLStatisticsWriter::writeRestartEvent(int lastHeartBeat) { + writeTextElement("elvys_down", QString("%1").arg(lastHeartBeat)); +} + + /** Writes one statistical event into device, buffer or string specified by constructor. * @param event event to write */ Modified: trunk/client/elvys-client/src/xmlstatisticswriter.h =================================================================== --- trunk/client/elvys-client/src/xmlstatisticswriter.h 2010-02-23 19:38:16 UTC (rev 1836) +++ trunk/client/elvys-client/src/xmlstatisticswriter.h 2010-02-23 20:02:14 UTC (rev 1837) @@ -32,6 +32,7 @@ XMLStatisticsWriter(QIODevice * dev); XMLStatisticsWriter(QByteArray * array); void writeEvent(StatsEvent * event); + void writeRestartEvent(int lastHeartBeat); void start(); void stop(); };