Files
clients/CrawlerList/widget.cpp
admin 3925bf8ad9 LockTable 인수값 삭제
git-svn-id: svn://192.168.0.12/source@107 8346c931-da38-4b9b-9d4c-e48b93cbd075
2015-05-11 07:00:23 +00:00

338 lines
10 KiB
C++

#include "widget.h"
#include <QHBoxLayout>
#include <QSqlDatabase>
#include <QDebug>
#include <QDateEdit>
#include <QFileDialog>
#include <QPushButton>
#include <QSqlQuery>
#include <QSqlError>
#include <QThread>
#include "snavercafemanage.h"
#include "snaverblogmanage.h"
#include "sdaumcafemanage.h"
#include <QApplication>
Widget::Widget(QWidget *parent) : QWidget(parent) , m_nMode(E_MODE_WAIT)
{
connect(&m_timer, SIGNAL(timeout()), this, SLOT(Update()));
QVBoxLayout *vlayout = new QVBoxLayout;
{
m_pResultList = new QListWidget;
vlayout->addWidget(setRealGroupWidgets());
vlayout->addWidget(m_pResultList);
}
setLayout(vlayout);
m_pNaverCafe = new SNaverCafeManage(this);
m_pNaverBlog = new SNaverBlogManage(this);
m_pDaumCafe = new SDaumCafeManage(this);
m_pManage[0] = m_pNaverCafe;
m_pManage[1] = m_pNaverBlog;
m_pManage[2] = m_pDaumCafe;
m_db = QSqlDatabase::addDatabase("QMYSQL");
m_db.setHostName("bigbird.iptime.org");
m_db.setUserName("admin");
m_db.setPassword("admin123");
m_db.setDatabaseName("concepters");
if (!m_db.open())
{
InsertLog("MySql Error...");
return;
}
for (int i = 0 ; i < C_CRAWLER_MAX ; i++)
m_pManage[i]->SetParent(this);
setWindowTitle("CrawlerList " + QString::number(QCoreApplication::applicationPid()));
RefreshButton();
m_timer.start(1000);
}
Widget::~Widget()
{
if (m_nMode == E_MODE_RUN)
{
if (m_pgbManual->isChecked() == false)
{
if (m_strCrawlingID.isEmpty() == false)
{
SetCrawlingState("Finish");
}
}
}
UnLockTables();
m_db.close();
for (int i = 0 ; i < C_CRAWLER_MAX ; i++)
m_pManage[i]->SetParent(0);
}
QGroupBox *Widget::setRealGroupWidgets()
{
m_pcb = new QComboBox;
m_pcb->setInsertPolicy(QComboBox::InsertAtCurrent);
QPushButton *pbtRefresh = new QPushButton("Refresh",this);
QPushButton *pbtStart = new QPushButton("Start",this);
QPushButton *pbtStop = new QPushButton("Stop",this);
{
QObject::connect(pbtStart,SIGNAL(clicked()),this,SLOT(StartButton()));
QObject::connect(pbtStop,SIGNAL(clicked()),this,SLOT(StopButton()));
QObject::connect(pbtRefresh,SIGNAL(clicked()),this,SLOT(RefreshButton()));
}
QVBoxLayout *vlayout = new QVBoxLayout;
{
QHBoxLayout *hlayout = new QHBoxLayout;
hlayout->addWidget(m_pcb,Qt::AlignLeft);
hlayout->addWidget(pbtRefresh);
vlayout->addLayout(hlayout);
}
m_pedTime = new QLineEdit(this);
m_pedTime->setText(QString("3"));
{
QHBoxLayout *hlayout = new QHBoxLayout;
hlayout->addWidget(m_pedTime);
hlayout->addWidget(pbtStart);
hlayout->addWidget(pbtStop);
vlayout->addLayout(hlayout);
}
m_pgbManual = new QGroupBox(tr("Manual"));
m_pgbManual->setCheckable(true);
m_pgbManual->setChecked(true);
m_pgbManual->setLayout(vlayout);
return m_pgbManual;
}
void Widget::InsertLog(QString str)
{
QTime time = QTime::currentTime();
QString strOut = time.toString("[hh:mm:ss] ") + str;
m_pResultList->addItem(strOut);
QDate date = QDate::currentDate();
/*
QString _str;
if(!m_pgbManual->isChecked())
{
_str = "RealTime";
}
else
{
_str = m_pcb->currentText();
//qDebug() << _str;
_str = _str.replace("|","_");
_str = _str.replace(" ","");
_str = _str.replace(",","_");
_str = _str.replace("~","_");
_str = _str.replace("->","_");
//qDebug() << _str;
}
*/
QFile file(date.toString(Qt::ISODate)+ "_" + QString::number(QCoreApplication::applicationPid())+ ".log");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
return;
QTextStream out(&file);
out << strOut << "\n";
file.close();
if (m_pResultList->count() > 1024)
{
m_pResultList->removeItemWidget(m_pResultList->item(0));
QListWidgetItem* item = m_pResultList->takeItem(0);
delete item;
}
m_pResultList->setCurrentRow( m_pResultList->count() - 1 );
m_pResultList->repaint();
}
void Widget::SetCrawlingState(QString _str)
{
QSqlQuery query;
if (_str == QString("Finish"))
{
if (m_pgbManual->isChecked())
query.exec("UPDATE crawling set state = 2 where id = '" + m_strCrawlingID + "'");
else
query.exec("UPDATE crawling set state = 0 where id = '" + m_strCrawlingID + "'");
m_pgbManual->setEnabled(true);
m_nMode = E_MODE_WAIT;
}
if (_str == QString("Start"))
{
//if (m_pgbManual->isChecked() == false)
query.exec("UPDATE crawling set state = 1 where id = '" + m_strCrawlingID + "'");
m_pgbManual->setEnabled(false);
}
}
void Widget::Start()
{
QSqlQuery query;
query.exec("SELECT keyword.start,keyword.end, keyword.searches,keyword.authorship,keyword.id,datagroup.id,keyword.platform "
"FROM crawling INNER JOIN keyword ON crawling.keyword_id = keyword.id "
"inner join datagroup on crawling.datagroup_id = datagroup.id "
"where crawling.id = '" + m_strCrawlingID + "'");
query.next();
/*
QString str = + " , ";
str += query.value(1).toString() + " ~ ";
str += query.value(2).toString() + " -> ";
str += query.value(3).toString();
*/
m_nPlatform = 0;
if(0 <= query.value(6).toInt() && query.value(6).toInt() < C_CRAWLER_MAX)
m_nPlatform = query.value(6).toInt();
else
{
InsertLog("Starting Crawler is failed");
return;
}
if (m_pgbManual->isChecked())
{
m_pManage[m_nPlatform]->Start(QDate::fromString(query.value(0).toString(),"yyyy-MM-dd"),
QDate::fromString(query.value(1).toString(),"yyyy-MM-dd"),
query.value(2).toString().trimmed(),// keyword
query.value(3).toString().trimmed(),// authorship
query.value(4).toString().trimmed(),// keyword_id
query.value(5).toString().trimmed(),
1,
m_pedTime->text().trimmed());
}
else
{
m_pManage[m_nPlatform]->Start(QDate::currentDate(),QDate::currentDate(),
query.value(2).toString().trimmed(),// keyword
query.value(3).toString().trimmed(),// authorship
query.value(4).toString().trimmed(),// keyword_id
query.value(5).toString().trimmed(),
1,
m_pedTime->text().trimmed());
}
SetCrawlingState("Start");
m_nMode = E_MODE_RUN;
}
void Widget::StartButton()
{
m_strCrawlingID = m_pcb->currentData().toString();
Start();
}
void Widget::StopButton()
{
m_nMode = E_MODE_WAIT;
}
bool Widget::LockTable()
{
QSqlQuery query;
return query.exec(QString("lock tables crawling write, datagroup write, keyword write" ).toUtf8());
//lock tables crawling write, keyword write;
}
void Widget::UnLockTables()
{
QSqlQuery query;
query.exec(QString("unlock tables").toUtf8());
}
void Widget::Update()
{
if (m_db.isOpen() == false)
{
if (m_db.open())
{
InsertLog("MySql Open Error...");
m_timer.stop();
return;
}
}
if (m_pgbManual->isChecked())
{
// Menual Mode
switch(m_nMode)
{
case E_MODE_WAIT:return;
}
}
else
{
// RealTime Mode
switch(m_nMode)
{
case E_MODE_WAIT:
if (LockTable() == false)
{
UnLockTables();
return;
}
QSqlQuery query;
if (query.exec("SELECT crawling.id,keyword.start,keyword.end "
"FROM crawling INNER JOIN keyword ON crawling.keyword_id = keyword.id "
"where crawling.state = 0 and keyword.realtime = 1 and keyword.state is null") == false)
{
InsertLog(query.lastError().text());
UnLockTables();
return;
}
QDate dateNow = QDate::currentDate();
m_strCrawlingID.clear();
while (query.next())
{
QDate dateStart = QDate::fromString(query.value(1).toString(),"yyyy-MM-dd");
QDate dateEnd = QDate::fromString(query.value(2).toString(),"yyyy-MM-dd");
if (dateNow < dateStart) continue;
if (dateNow > dateEnd) continue;
m_strCrawlingID = query.value(0).toString();
break;
}
if(m_strCrawlingID.isEmpty() == false)
Start();
UnLockTables();
return;
}
}
m_pManage[m_nPlatform]->Update();
}
void Widget::RefreshButton()
{
m_pcb->clear();
QSqlQuery query("SELECT keyword.searches,keyword.authorship,keyword.start,keyword.end,datagroup.name,keyword.platform,crawling.state,crawling.id "
"FROM crawling INNER JOIN keyword ON crawling.keyword_id = keyword.id "
"inner join datagroup on crawling.datagroup_id = datagroup.id where crawling.state = 0 and keyword.realtime = 0 ");
while (query.next())
{
QString str;
str += query.value(0).toString() + " , ";
str += query.value(1).toString() + " , ";
str += query.value(2).toString() + " ~ ";
str += query.value(3).toString() + " -> ";
str += query.value(4).toString();
switch(query.value(5).toString().toInt())
{
case 0:str += ", Naver Cafe";break;
case 1:str += ", Naver Blog";break;
case 2:str += ", Daum Cafe"; break;
}
m_pcb->addItem(str,query.value(7));
}
}