[elvystrac] r1837 - timestamping for statistics added

  • From: elvys@xxxxxxxxxxxxxxxxxxxxxx
  • To: elvystrac@xxxxxxxxxxxxx
  • Date: Tue, 23 Feb 2010 21:02:15 +0100

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();
 };


Other related posts:

  • » [elvystrac] r1837 - timestamping for statistics added - elvys