네이버카페리스트 관리 git-svn-id: svn://192.168.0.12/source@224 8346c931-da38-4b9b-9d4c-e48b93cbd075
375 lines
9.4 KiB
C++
375 lines
9.4 KiB
C++
#include "widget.h"
|
|
#include "ui_widget.h"
|
|
#include <QHBoxLayout>
|
|
#include <QVBoxLayout>
|
|
#include <QLabel>
|
|
#include <QLineEdit>
|
|
#include <QPushButton>
|
|
#include <QDebug>
|
|
#include <QSqlQuery>
|
|
#include <QMessageBox>
|
|
#include <QSqlError>
|
|
#include <QSqlQueryModel>
|
|
#include <QSqlRecord>
|
|
#include <QSize>
|
|
#include <QRegExp>
|
|
#include <QWebPage>
|
|
#include <QWebElement>
|
|
#include <QWebFrame>
|
|
#include <QUrl>
|
|
void SleepThread::run()
|
|
{
|
|
QThread::sleep(1);
|
|
}
|
|
|
|
|
|
Widget::Widget(QWidget *parent) :
|
|
QWidget(parent),
|
|
ui(new Ui::Widget), m_bUsed(false)
|
|
{
|
|
ui->setupUi(this);
|
|
QVBoxLayout *vlayout = new QVBoxLayout();
|
|
initTable();
|
|
vlayout->addWidget(m_pTable);
|
|
vlayout->addLayout(initInputLayout());
|
|
vlayout->addLayout(initButtonLayout());
|
|
setWindowTitle("NaverCafeListManager");
|
|
resize(600, 400);
|
|
setLayout(vlayout);
|
|
initWebPage();
|
|
initDatabase();
|
|
pushRefresh();
|
|
}
|
|
|
|
QHBoxLayout* Widget::initButtonLayout()
|
|
{
|
|
QHBoxLayout *hlayout = new QHBoxLayout();
|
|
|
|
m_pbtnAdd = new QPushButton("Add");
|
|
m_pbtnDel = new QPushButton("Del");
|
|
m_pbtnModify = new QPushButton("Modify");
|
|
m_pbtnRefresh = new QPushButton("Refresh");
|
|
m_pbtnGetClubid = new QPushButton("GetClubID");
|
|
|
|
connect(m_pbtnAdd, SIGNAL(clicked()), this, SLOT(pushAdd()));
|
|
connect(m_pbtnDel, SIGNAL(clicked()), this, SLOT(pushDel()));
|
|
connect(m_pbtnModify, SIGNAL(clicked()), this, SLOT(pushModify()));
|
|
connect(m_pbtnRefresh, SIGNAL(clicked()), this, SLOT(pushRefresh()));
|
|
connect(m_pbtnGetClubid, SIGNAL(clicked()), this, SLOT(pushGetClubId()));
|
|
|
|
hlayout->addWidget(m_pbtnAdd);
|
|
hlayout->addWidget(m_pbtnDel);
|
|
hlayout->addWidget(m_pbtnModify);
|
|
hlayout->addWidget(m_pbtnRefresh);
|
|
hlayout->addWidget(m_pbtnGetClubid);
|
|
|
|
return hlayout;
|
|
}
|
|
|
|
QHBoxLayout* Widget::initInputLayout()
|
|
{
|
|
QHBoxLayout *hlayout = new QHBoxLayout();
|
|
|
|
m_pleUrl = new QLineEdit;
|
|
m_pleGroup = new QLineEdit;
|
|
m_pleClubId = new QLineEdit;
|
|
|
|
hlayout->addWidget(new QLabel("Url:"));
|
|
hlayout->addWidget(m_pleUrl, 3);
|
|
hlayout->addWidget(new QLabel("Group:"));
|
|
hlayout->addWidget(m_pleGroup, 1);
|
|
|
|
hlayout->addWidget(new QLabel("Club ID:"));
|
|
hlayout->addWidget(m_pleClubId, 2);
|
|
return hlayout;
|
|
}
|
|
|
|
|
|
void Widget::initTable()
|
|
{
|
|
m_pTable = new STable;
|
|
m_pQueryTable = new QSqlQueryModel;
|
|
m_pTable->setModel(m_pQueryTable);
|
|
|
|
m_pTable->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
m_pTable->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
m_pTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
|
|
m_pTable->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
|
|
|
//connect(m_pTable->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), this, SLOT(clickTable(QModelIndex, QModelIndex)));
|
|
connect(m_pTable, SIGNAL(clicked(QModelIndex)), this, SLOT(clickTable(QModelIndex)));
|
|
}
|
|
|
|
Widget::~Widget()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void Widget::pushAdd()
|
|
{
|
|
if(!checkUrl() || !checkGroup())
|
|
{
|
|
return;
|
|
}
|
|
QString strquery;
|
|
|
|
if(isClubIdNull())
|
|
{
|
|
strquery = "insert into navercafelist (url, group_num) values (";
|
|
strquery += ("'" + m_pleUrl->text().trimmed() + "',");
|
|
strquery += m_pleGroup->text().trimmed() + ")";
|
|
}
|
|
else
|
|
{
|
|
if(checkClubId())
|
|
{
|
|
strquery = "insert into navercafelist (url, group_num, clubid) values (";
|
|
strquery += ("'" + m_pleUrl->text().trimmed() + "',");
|
|
strquery += m_pleGroup->text().trimmed() + ",";
|
|
strquery += m_pleClubId->text().trimmed() + ")";
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
QSqlQuery query;
|
|
if(!query.exec(strquery))
|
|
{
|
|
showMessage(query.lastError().text() + "\n\n" + "Check url, group and clubid");
|
|
return;
|
|
}
|
|
pushRefresh();
|
|
}
|
|
|
|
void Widget::pushDel()
|
|
{
|
|
QStringList ids = selectedIds();
|
|
QString strquery = "delete from navercafelist where id = ";
|
|
QSqlQuery query;
|
|
foreach(QString id, ids)
|
|
{
|
|
if(!query.exec(QString(strquery + id)))
|
|
{
|
|
showMessage(query.lastError().text() + "\n\nError occurs");
|
|
return;
|
|
}
|
|
}
|
|
|
|
pushRefresh();
|
|
}
|
|
|
|
void Widget::pushModify()
|
|
{
|
|
if(!checkUrl() || !checkGroup())
|
|
{
|
|
return;
|
|
}
|
|
QStringList ids = selectedIds();
|
|
|
|
QString strquery = "update navercafelist set url = '";
|
|
strquery += m_pleUrl->text().trimmed() + "', group_num = ";
|
|
strquery += m_pleGroup->text().trimmed();
|
|
if(!isClubIdNull())
|
|
{
|
|
if(checkClubId())
|
|
{
|
|
strquery += ", clubid = " + m_pleClubId->text().trimmed();
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
strquery += " where id = ";
|
|
QSqlQuery query;
|
|
foreach(QString id, ids)
|
|
{
|
|
if(!query.exec(strquery + id.trimmed()))
|
|
{
|
|
showMessage(query.lastError().text() + "\n\nError occurs.\nCheck url and group");
|
|
return;
|
|
}
|
|
}
|
|
|
|
pushRefresh();
|
|
}
|
|
|
|
void Widget::pushRefresh()
|
|
{
|
|
if(!connectDatabase())
|
|
{
|
|
return;
|
|
}
|
|
m_pQueryTable->setQuery("select id, url, group_num, clubid from navercafelist");
|
|
}
|
|
|
|
void Widget::clickTable(const QModelIndex &index)
|
|
{
|
|
m_pleUrl->setText(m_pQueryTable->record(index.row()).value(E_COLUMN_URL).toString().trimmed());
|
|
m_pleGroup->setText(m_pQueryTable->record(index.row()).value(E_COLUMN_GROUP).toString().trimmed());
|
|
m_pleClubId->setText((m_pQueryTable->record(index.row()).value(E_COLUMN_CLUBID).toInt() < 1)? "" : (m_pQueryTable->record(index.row()).value(E_COLUMN_CLUBID).toString().trimmed()));
|
|
}
|
|
|
|
|
|
bool Widget::initDatabase()
|
|
{
|
|
m_db = QSqlDatabase::addDatabase("QMYSQL");
|
|
m_db.setHostName("bigbird.iptime.org");
|
|
m_db.setUserName("admin");
|
|
m_db.setPassword("admin123");
|
|
m_db.setDatabaseName("concepters");
|
|
return connectDatabase();
|
|
}
|
|
|
|
bool Widget::connectDatabase()
|
|
{
|
|
if(!m_db.isOpen() && !m_db.open())
|
|
{
|
|
showMessage("DB Error");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void Widget::showMessage(QString strMessage)
|
|
{
|
|
QMessageBox msg;
|
|
msg.setIcon(QMessageBox::Critical);
|
|
msg.setText(strMessage);
|
|
msg.exec();
|
|
}
|
|
|
|
bool Widget::checkGroup()
|
|
{
|
|
bool ok;
|
|
m_pleGroup->text().trimmed().toInt(&ok);
|
|
if(!ok)
|
|
{
|
|
showMessage("Put Number in the group field, Insert Error");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool Widget::checkUrl()
|
|
{
|
|
QRegExp rx("^http://cafe.naver.com/.+");
|
|
if(rx.indexIn(m_pleUrl->text().trimmed()) < 0)
|
|
{
|
|
showMessage("Check url form \nhttp://cafe.naver.com/xxxxxxxx");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
QStringList Widget::selectedIds()
|
|
{
|
|
QStringList ids;
|
|
foreach(QModelIndex index, m_pTable->selectionModel()->selectedRows(E_COLUMN_ID))
|
|
{
|
|
ids.append(index.data(Qt::DisplayRole).toString().trimmed());
|
|
}
|
|
ids.removeDuplicates();
|
|
return ids;
|
|
}
|
|
|
|
bool Widget::isClubIdNull()
|
|
{
|
|
if(m_pleClubId->text().trimmed().length() < 1)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void Widget::pushGetClubId()
|
|
{
|
|
QSet<QString> urls;
|
|
foreach(QModelIndex index, m_pTable->selectionModel()->selectedRows(E_COLUMN_URL))
|
|
{
|
|
urls.insert(index.data(Qt::DisplayRole).toString().trimmed());
|
|
}
|
|
|
|
for(QSet<QString>::iterator iterPos = urls.begin(); iterPos != urls.end(); iterPos++)
|
|
{
|
|
loadUrl(QString(*iterPos));
|
|
}
|
|
}
|
|
|
|
bool Widget::checkClubId()
|
|
{
|
|
QRegExp rx("^[\\d]+$");
|
|
if(rx.indexIn(m_pleClubId->text().trimmed()) < 0)
|
|
{
|
|
showMessage("Check ClubId\nClubid is consist of Only Numbers");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void Widget::loadUrl(QString url)
|
|
{
|
|
while(m_bUsed)
|
|
{
|
|
m_thread.run();
|
|
m_thread.wait();
|
|
}
|
|
m_bUsed = true;
|
|
m_pPage->settings()->clearMemoryCaches();
|
|
m_pPage->mainFrame()->load(QUrl(url));
|
|
}
|
|
|
|
void Widget::initWebPage()
|
|
{
|
|
m_pPage = new QWebPage;
|
|
m_pPage->settings()->setAttribute(QWebSettings::AutoLoadImages,false);
|
|
|
|
connect(m_pPage, SIGNAL(loadFinished(bool)), this, SLOT(readWebPage(bool)));
|
|
}
|
|
|
|
void Widget::readWebPage(bool ok)
|
|
{
|
|
if(!ok)
|
|
{
|
|
showMessage("Load Url Failed");
|
|
m_bUsed = false;
|
|
return;
|
|
}
|
|
|
|
QWebElementCollection as = m_pPage->mainFrame()->findAllElements("a");
|
|
QString href;
|
|
foreach(QWebElement a, as)
|
|
{
|
|
if(a.attribute("name").compare("myCafeUrlLink", Qt::CaseInsensitive) == 0)
|
|
{
|
|
href = a.attribute("href");
|
|
break;
|
|
}
|
|
}
|
|
|
|
QRegExp rx("clubid=([\\d]+)");
|
|
int pos = 0;
|
|
while((pos = rx.indexIn(href, pos)) != -1)
|
|
{
|
|
//updateAllClubId(m_pPage->mainFrame()->baseUrl().toString(), rx.cap(1));
|
|
m_pleClubId->setText(rx.cap(1));
|
|
pos += rx.matchedLength();
|
|
}
|
|
m_bUsed = false;
|
|
}
|
|
|
|
void Widget::updateAllClubId(QString url, QString clubid)
|
|
{
|
|
QString strquery = "update navercrawler set clubid = " + clubid.trimmed() + " where url = " + url.trimmed();
|
|
QSqlQuery query;
|
|
if(!query.exec(strquery))
|
|
{
|
|
showMessage(query.lastError().text() + "\n\n" + query.lastQuery());
|
|
}
|
|
}
|