mirror of
https://github.com/tnodir/fort
synced 2024-11-15 06:32:56 +00:00
UI: Connections: Show only blocked or allowed connections.
And remove only first rows.
This commit is contained in:
parent
2c2d876f33
commit
69e0ba1b4e
8
src/ui/3rdparty/sqlite/sqlitedb.cpp
vendored
8
src/ui/3rdparty/sqlite/sqlitedb.cpp
vendored
@ -135,6 +135,14 @@ bool SqliteDb::prepare(SqliteStmt &stmt, const char *sql, const QVariantList &va
|
||||
return stmt.prepare(db(), sql) && (vars.isEmpty() || stmt.bindVars(vars));
|
||||
}
|
||||
|
||||
bool SqliteDb::done(SqliteStmt *stmt)
|
||||
{
|
||||
const SqliteStmt::StepResult res = stmt->step();
|
||||
const bool ok = (res == SqliteStmt::StepDone && changes() != 0);
|
||||
stmt->reset();
|
||||
return ok;
|
||||
}
|
||||
|
||||
qint64 SqliteDb::lastInsertRowid() const
|
||||
{
|
||||
return sqlite3_last_insert_rowid(m_db);
|
||||
|
1
src/ui/3rdparty/sqlite/sqlitedb.h
vendored
1
src/ui/3rdparty/sqlite/sqlitedb.h
vendored
@ -37,6 +37,7 @@ public:
|
||||
int resultCount = 1, bool *ok = nullptr);
|
||||
|
||||
bool prepare(SqliteStmt &stmt, const char *sql, const QVariantList &vars = QVariantList());
|
||||
bool done(SqliteStmt *stmt);
|
||||
|
||||
qint64 lastInsertRowid() const;
|
||||
int changes() const;
|
||||
|
@ -136,12 +136,12 @@ QLayout *ConnectionsWindow::setupHeader()
|
||||
|
||||
m_actClearConns = editMenu->addAction(IconCache::icon(":/icons/trash.png"), QString());
|
||||
|
||||
connect(m_actCopy, &QAction::triggered, this, [&] {
|
||||
GuiUtil::setClipboardData(m_connListView->selectedText());
|
||||
});
|
||||
connect(m_actCopy, &QAction::triggered, this,
|
||||
[&] { GuiUtil::setClipboardData(m_connListView->selectedText()); });
|
||||
connect(m_actRemoveConn, &QAction::triggered, this, [&] {
|
||||
if (fortManager()->showQuestionBox(tr("Are you sure to remove selected connection(s)?"))) {
|
||||
deleteSelectedConns();
|
||||
if (fortManager()->showQuestionBox(
|
||||
tr("Are you sure to remove connections till this row?"))) {
|
||||
deleteConn(m_connListView->currentRow());
|
||||
}
|
||||
});
|
||||
connect(m_actClearConns, &QAction::triggered, this, [&] {
|
||||
@ -239,7 +239,9 @@ void ConnectionsWindow::setupTableConnList()
|
||||
m_connListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
m_connListView->setSelectionBehavior(QAbstractItemView::SelectItems);
|
||||
|
||||
// m_connListView->setSortingEnabled(true);
|
||||
// TODO: Add ability to select the allowed/blocked mode from UI
|
||||
connListModel()->setBlockedMode(true);
|
||||
|
||||
m_connListView->setModel(connListModel());
|
||||
|
||||
m_connListView->setMenu(m_btEdit->menu());
|
||||
@ -319,20 +321,12 @@ void ConnectionsWindow::syncShowHostNames()
|
||||
void ConnectionsWindow::deleteConn(int row)
|
||||
{
|
||||
const auto connRow = connListModel()->connRowAt(row);
|
||||
connListModel()->deleteConn(connRow.connId, connRow.blocked, row);
|
||||
}
|
||||
|
||||
void ConnectionsWindow::deleteSelectedConns()
|
||||
{
|
||||
const auto rows = m_connListView->selectedRows();
|
||||
for (int i = rows.size(); --i >= 0;) {
|
||||
deleteConn(rows.at(i));
|
||||
}
|
||||
connListModel()->deleteConn(connRow.rowId, connRow.blocked, row);
|
||||
}
|
||||
|
||||
int ConnectionsWindow::connListCurrentIndex() const
|
||||
{
|
||||
return m_connListView->currentIndex().row();
|
||||
return m_connListView->currentRow();
|
||||
}
|
||||
|
||||
QString ConnectionsWindow::connListCurrentPath() const
|
||||
|
@ -48,8 +48,6 @@ private:
|
||||
|
||||
void deleteConn(int row);
|
||||
|
||||
void deleteSelectedConns();
|
||||
|
||||
int connListCurrentIndex() const;
|
||||
QString connListCurrentPath() const;
|
||||
|
||||
|
@ -2,6 +2,11 @@
|
||||
|
||||
ListView::ListView(QWidget *parent) : QListView(parent) { }
|
||||
|
||||
int ListView::currentRow() const
|
||||
{
|
||||
return currentIndex().row();
|
||||
}
|
||||
|
||||
void ListView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
|
||||
{
|
||||
QListView::currentChanged(current, previous);
|
||||
|
@ -10,6 +10,8 @@ class ListView : public QListView
|
||||
public:
|
||||
explicit ListView(QWidget *parent = nullptr);
|
||||
|
||||
int currentRow() const;
|
||||
|
||||
signals:
|
||||
void currentIndexChanged(const QModelIndex &index);
|
||||
|
||||
|
@ -5,6 +5,11 @@
|
||||
|
||||
TableView::TableView(QWidget *parent) : QTableView(parent) { }
|
||||
|
||||
int TableView::currentRow() const
|
||||
{
|
||||
return currentIndex().row();
|
||||
}
|
||||
|
||||
QVector<int> TableView::selectedRows() const
|
||||
{
|
||||
QSet<int> rowsSet;
|
||||
@ -12,7 +17,7 @@ QVector<int> TableView::selectedRows() const
|
||||
for (const auto index : indexes) {
|
||||
rowsSet.insert(index.row());
|
||||
}
|
||||
rowsSet.insert(currentIndex().row());
|
||||
rowsSet.insert(currentRow());
|
||||
|
||||
auto rows = rowsSet.values();
|
||||
std::sort(rows.begin(), rows.end());
|
||||
|
@ -13,6 +13,7 @@ public:
|
||||
QMenu *menu() const { return m_menu; }
|
||||
void setMenu(QMenu *menu) { m_menu = menu; }
|
||||
|
||||
int currentRow() const;
|
||||
QVector<int> selectedRows() const;
|
||||
QModelIndexList sortedSelectedIndexes() const;
|
||||
|
||||
|
@ -213,5 +213,5 @@ void SchedulePage::setupTableTasksChanged()
|
||||
|
||||
int SchedulePage::currentTaskIndex() const
|
||||
{
|
||||
return m_tableTasks->currentIndex().row();
|
||||
return m_tableTasks->currentRow();
|
||||
}
|
||||
|
@ -797,7 +797,7 @@ void StatisticsPage::updateTrafUnit()
|
||||
|
||||
int StatisticsPage::appListCurrentIndex() const
|
||||
{
|
||||
return m_appListView->currentIndex().row();
|
||||
return m_appListView->currentRow();
|
||||
}
|
||||
|
||||
QString StatisticsPage::appListCurrentPath() const
|
||||
|
@ -619,7 +619,7 @@ void ProgramsWindow::deleteSelectedApps()
|
||||
|
||||
int ProgramsWindow::appListCurrentIndex() const
|
||||
{
|
||||
return m_appListView->currentIndex().row();
|
||||
return m_appListView->currentRow();
|
||||
}
|
||||
|
||||
QString ProgramsWindow::appListCurrentPath() const
|
||||
|
@ -443,7 +443,7 @@ void ZonesWindow::deleteSelectedZone()
|
||||
|
||||
int ZonesWindow::zoneListCurrentIndex() const
|
||||
{
|
||||
return m_zoneListView->currentIndex().row();
|
||||
return m_zoneListView->currentRow();
|
||||
}
|
||||
|
||||
FortManager *ZonesWindow::fortManager() const
|
||||
|
@ -352,7 +352,7 @@ QString AppListModel::sqlOrderColumn() const
|
||||
columnsStr = "8";
|
||||
break;
|
||||
default: // Creation Time
|
||||
columnsStr = "1";
|
||||
columnsStr = "1"; // App ID
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,14 @@ ConnListModel::ConnListModel(StatManager *statManager, QObject *parent) :
|
||||
{
|
||||
}
|
||||
|
||||
void ConnListModel::setBlockedMode(bool v)
|
||||
{
|
||||
if (m_blockedMode != v) {
|
||||
m_blockedMode = v;
|
||||
reset();
|
||||
}
|
||||
}
|
||||
|
||||
void ConnListModel::setResolveAddress(bool v)
|
||||
{
|
||||
if (m_resolveAddress != v) {
|
||||
@ -132,8 +140,8 @@ QVariant ConnListModel::data(const QModelIndex &index, int role) const
|
||||
if (role == Qt::ToolTipRole) {
|
||||
if (connRow.blocked) {
|
||||
// Show block reason in tool-tip
|
||||
const auto connBlock = getConnRowBlock(connRow.connId);
|
||||
return LogEntryBlockedIp::reasonToString(connBlock.blockReason);
|
||||
const auto blockRow = getConnRowBlock(connRow.rowId);
|
||||
return LogEntryBlockedIp::reasonToString(blockRow.blockReason);
|
||||
}
|
||||
}
|
||||
return connRow.inbound ? tr("In") : tr("Out");
|
||||
@ -169,11 +177,11 @@ QVariant ConnListModel::data(const QModelIndex &index, int role) const
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
void ConnListModel::deleteConn(qint64 connId, bool blocked, int row)
|
||||
void ConnListModel::deleteConn(qint64 rowIdTo, bool blocked, int row)
|
||||
{
|
||||
beginRemoveRows(QModelIndex(), row, row);
|
||||
beginRemoveRows(QModelIndex(), 0, row);
|
||||
|
||||
if (statManager()->deleteConn(connId, blocked)) {
|
||||
if (statManager()->deleteConn(rowIdTo, blocked)) {
|
||||
invalidateRowCache();
|
||||
}
|
||||
|
||||
@ -187,17 +195,17 @@ const ConnRow &ConnListModel::connRowAt(int row) const
|
||||
return m_connRow;
|
||||
}
|
||||
|
||||
ConnRowBlock ConnListModel::getConnRowBlock(qint64 connId) const
|
||||
ConnRowBlock ConnListModel::getConnRowBlock(qint64 rowId) const
|
||||
{
|
||||
static const char *const sql = "SELECT block_reason FROM conn_block"
|
||||
" WHERE conn_id = ?1";
|
||||
" WHERE conn_block_id = ?1";
|
||||
|
||||
return { quint8(sqliteDb()->executeEx(sql, { connId }).toInt()) };
|
||||
return { quint8(sqliteDb()->executeEx(sql, { rowId }).toInt()) };
|
||||
}
|
||||
|
||||
void ConnListModel::clear()
|
||||
{
|
||||
statManager()->deleteConns();
|
||||
statManager()->deleteConnAll();
|
||||
reset();
|
||||
|
||||
hostInfoCache()->clear();
|
||||
@ -205,11 +213,14 @@ void ConnListModel::clear()
|
||||
|
||||
bool ConnListModel::updateTableRow(int row) const
|
||||
{
|
||||
const qint64 rowId = rowIdMin() + row;
|
||||
|
||||
SqliteStmt stmt;
|
||||
if (!(sqliteDb()->prepare(stmt, sql().toLatin1(), { row })
|
||||
if (!(sqliteDb()->prepare(stmt, sql().toLatin1(), { rowId })
|
||||
&& stmt.step() == SqliteStmt::StepRow))
|
||||
return false;
|
||||
|
||||
m_connRow.rowId = rowId;
|
||||
m_connRow.connId = stmt.columnInt64(0);
|
||||
m_connRow.appId = stmt.columnInt64(1);
|
||||
m_connRow.connTime = stmt.columnUnixTime(2);
|
||||
@ -226,23 +237,50 @@ bool ConnListModel::updateTableRow(int row) const
|
||||
return true;
|
||||
}
|
||||
|
||||
int ConnListModel::doSqlCount() const
|
||||
{
|
||||
return int(rowIdMax() - rowIdMin()) + 1;
|
||||
}
|
||||
|
||||
QString ConnListModel::sqlBase() const
|
||||
{
|
||||
return "SELECT"
|
||||
" t.conn_id,"
|
||||
" t.app_id,"
|
||||
" t.conn_time,"
|
||||
" t.process_id,"
|
||||
" t.inbound,"
|
||||
" t.blocked,"
|
||||
" t.ip_proto,"
|
||||
" t.local_port,"
|
||||
" t.remote_port,"
|
||||
" t.local_ip,"
|
||||
" t.remote_ip,"
|
||||
" a.path"
|
||||
" FROM conn t"
|
||||
" JOIN app a ON a.app_id = t.app_id";
|
||||
return QString::fromLatin1("SELECT"
|
||||
" t.conn_id,"
|
||||
" t.app_id,"
|
||||
" t.conn_time,"
|
||||
" t.process_id,"
|
||||
" t.inbound,"
|
||||
" t.blocked,"
|
||||
" t.ip_proto,"
|
||||
" t.local_port,"
|
||||
" t.remote_port,"
|
||||
" t.local_ip,"
|
||||
" t.remote_ip,"
|
||||
" a.path"
|
||||
" FROM conn t"
|
||||
" JOIN %1 c ON c.conn_id = t.conn_id"
|
||||
" JOIN app a ON a.app_id = t.app_id")
|
||||
.arg(blockedMode() ? "conn_block" : "conn_traffic");
|
||||
}
|
||||
|
||||
QString ConnListModel::sqlWhere() const
|
||||
{
|
||||
return " WHERE c.id = ?1";
|
||||
}
|
||||
|
||||
QString ConnListModel::sqlLimitOffset() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
qint64 ConnListModel::rowIdMin() const
|
||||
{
|
||||
return blockedMode() ? statManager()->connBlockIdMin() : statManager()->connTrafIdMin();
|
||||
}
|
||||
|
||||
qint64 ConnListModel::rowIdMax() const
|
||||
{
|
||||
return blockedMode() ? statManager()->connBlockIdMax() : statManager()->connTrafIdMax();
|
||||
}
|
||||
|
||||
QString ConnListModel::formatIpPort(quint32 ip, quint16 port) const
|
||||
|
@ -23,6 +23,7 @@ struct ConnRow : TableRow
|
||||
|
||||
quint32 pid = 0;
|
||||
|
||||
qint64 rowId = 0;
|
||||
qint64 connId = 0;
|
||||
qint64 appId = 0;
|
||||
|
||||
@ -43,6 +44,9 @@ class ConnListModel : public TableSqlModel
|
||||
public:
|
||||
explicit ConnListModel(StatManager *statManager, QObject *parent = nullptr);
|
||||
|
||||
bool blockedMode() const { return m_blockedMode; }
|
||||
void setBlockedMode(bool v);
|
||||
|
||||
bool resolveAddress() const { return m_resolveAddress; }
|
||||
void setResolveAddress(bool v);
|
||||
|
||||
@ -63,11 +67,11 @@ public:
|
||||
int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
void deleteConn(qint64 connId, bool blocked, int row);
|
||||
void deleteConn(qint64 rowIdTo, bool blocked, int row);
|
||||
|
||||
const ConnRow &connRowAt(int row) const;
|
||||
|
||||
ConnRowBlock getConnRowBlock(qint64 connId) const;
|
||||
ConnRowBlock getConnRowBlock(qint64 rowId) const;
|
||||
|
||||
public slots:
|
||||
void clear();
|
||||
@ -76,12 +80,19 @@ protected:
|
||||
bool updateTableRow(int row) const override;
|
||||
TableRow &tableRow() const override { return m_connRow; }
|
||||
|
||||
int doSqlCount() const override;
|
||||
QString sqlBase() const override;
|
||||
QString sqlWhere() const override;
|
||||
QString sqlLimitOffset() const override;
|
||||
|
||||
private:
|
||||
qint64 rowIdMin() const;
|
||||
qint64 rowIdMax() const;
|
||||
|
||||
QString formatIpPort(quint32 ip, quint16 port) const;
|
||||
|
||||
private:
|
||||
bool m_blockedMode = false;
|
||||
bool m_resolveAddress = false;
|
||||
|
||||
int m_connBlockInc = 999999999; // to trigger on first check
|
||||
|
@ -72,16 +72,22 @@ CREATE TABLE conn(
|
||||
CREATE INDEX conn_app_id_idx ON conn(app_id);
|
||||
|
||||
CREATE TABLE conn_block(
|
||||
conn_id INTEGER PRIMARY KEY,
|
||||
id INTEGER PRIMARY KEY,
|
||||
conn_id INTEGER NOT NULL,
|
||||
block_reason INTEGER NOT NULL
|
||||
) WITHOUT ROWID;
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX conn_block_conn_id_uk ON conn_block(conn_id);
|
||||
|
||||
CREATE TABLE conn_traffic(
|
||||
conn_id INTEGER PRIMARY KEY,
|
||||
id INTEGER PRIMARY KEY,
|
||||
conn_id INTEGER NOT NULL,
|
||||
end_time INTEGER NOT NULL,
|
||||
in_bytes INTEGER NOT NULL,
|
||||
out_bytes INTEGER NOT NULL
|
||||
) WITHOUT ROWID;
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX conn_traffic_conn_id_uk ON conn_traffic(conn_id);
|
||||
|
||||
CREATE TABLE conn_flow(
|
||||
conn_id INTEGER PRIMARY KEY,
|
||||
|
@ -19,7 +19,7 @@ Q_LOGGING_CATEGORY(CLOG_STAT_MANAGER, "stat")
|
||||
#define logWarning() qCWarning(CLOG_STAT_MANAGER, )
|
||||
#define logCritical() qCCritical(CLOG_STAT_MANAGER, )
|
||||
|
||||
#define DATABASE_USER_VERSION 3
|
||||
#define DATABASE_USER_VERSION 4
|
||||
|
||||
#define ACTIVE_PERIOD_CHECK_SECS (60 * OS_TICKS_PER_SECOND)
|
||||
|
||||
@ -91,9 +91,20 @@ bool StatManager::initialize()
|
||||
return false;
|
||||
}
|
||||
|
||||
initializeConnBlockId();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void StatManager::initializeConnBlockId()
|
||||
{
|
||||
const auto vars = m_sqliteDb->executeEx(StatSql::sqlSelectMinMaxConnBlockId, {}, 2).toList();
|
||||
if (vars.size() == 2) {
|
||||
m_connBlockIdMin = vars.at(0).toLongLong();
|
||||
m_connBlockIdMax = vars.at(1).toLongLong();
|
||||
}
|
||||
}
|
||||
|
||||
void StatManager::initializeActivePeriod()
|
||||
{
|
||||
m_isActivePeriodSet = false;
|
||||
@ -328,7 +339,7 @@ bool StatManager::logStatTraf(quint16 procCount, const quint32 *procTrafBytes, q
|
||||
<< getTrafficStmt(StatSql::sqlDeleteTrafMonth, oldTrafMonth);
|
||||
}
|
||||
|
||||
stepStmtList(deleteTrafStmts);
|
||||
doStmtList(deleteTrafStmts);
|
||||
}
|
||||
|
||||
m_sqliteDb->commitTransaction();
|
||||
@ -363,6 +374,9 @@ bool StatManager::logBlockedIp(bool inbound, quint8 blockReason, quint8 ipProto,
|
||||
ok = (connId > 0);
|
||||
if (ok) {
|
||||
ok = createConnBlock(connId, blockReason);
|
||||
if (ok) {
|
||||
m_connBlockIdMax++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -374,12 +388,11 @@ void StatManager::deleteStatApp(qint64 appId)
|
||||
{
|
||||
m_sqliteDb->beginTransaction();
|
||||
|
||||
deleteAppStmtList(getIdStmt(StatSql::sqlSelectDeletedStatAppPaths, appId),
|
||||
{ getIdStmt(StatSql::sqlDeleteStatAppId, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafHour, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafDay, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafMonth, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafTotal, appId) });
|
||||
deleteAppStmtList({ getIdStmt(StatSql::sqlDeleteAppTrafHour, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafDay, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafMonth, appId),
|
||||
getIdStmt(StatSql::sqlDeleteAppTrafTotal, appId) },
|
||||
getIdStmt(StatSql::sqlSelectDeletedStatAppList, appId));
|
||||
|
||||
m_sqliteDb->commitTransaction();
|
||||
}
|
||||
@ -387,23 +400,23 @@ void StatManager::deleteStatApp(qint64 appId)
|
||||
bool StatManager::deleteOldConnBlock()
|
||||
{
|
||||
const int keepCount = m_conf->blockedIpKeepCount();
|
||||
const qint64 connId =
|
||||
m_sqliteDb->executeEx(StatSql::sqlSelectOldConnBlock, { keepCount }).toLongLong();
|
||||
if (connId > 0) {
|
||||
deleteRangeConnBlock(1, connId);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
const int totalCount = m_connBlockIdMax - m_connBlockIdMin + 1;
|
||||
const int oldCount = totalCount - keepCount;
|
||||
if (oldCount <= 0)
|
||||
return false;
|
||||
|
||||
deleteRangeConnBlock(m_connBlockIdMin, m_connBlockIdMin + oldCount);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StatManager::deleteConn(qint64 connId, bool blocked)
|
||||
bool StatManager::deleteConn(qint64 rowIdTo, bool blocked)
|
||||
{
|
||||
m_sqliteDb->beginTransaction();
|
||||
|
||||
if (blocked) {
|
||||
deleteRangeConnBlock(connId, connId);
|
||||
deleteRangeConnBlock(m_connBlockIdMin, rowIdTo);
|
||||
} else {
|
||||
// TODO: deleteRangeConnTraf(connId, connId);
|
||||
// TODO: deleteRangeConnTraf(m_connTrafIdMin, rowIdTo);
|
||||
}
|
||||
|
||||
m_sqliteDb->commitTransaction();
|
||||
@ -411,14 +424,13 @@ bool StatManager::deleteConn(qint64 connId, bool blocked)
|
||||
return true;
|
||||
}
|
||||
|
||||
void StatManager::deleteConns()
|
||||
void StatManager::deleteConnAll()
|
||||
{
|
||||
m_sqliteDb->beginTransaction();
|
||||
|
||||
deleteAppStmtList(getSqliteStmt(StatSql::sqlSelectDeletedAllConnAppPaths),
|
||||
{ getSqliteStmt(StatSql::sqlDeleteAllConnAppId),
|
||||
getSqliteStmt(StatSql::sqlDeleteAllConn),
|
||||
getSqliteStmt(StatSql::sqlDeleteAllConnBlock) });
|
||||
deleteAppStmtList({ getSqliteStmt(StatSql::sqlDeleteAllConn),
|
||||
getSqliteStmt(StatSql::sqlDeleteAllConnBlock) },
|
||||
getSqliteStmt(StatSql::sqlSelectDeletedAllConnAppList));
|
||||
|
||||
m_sqliteDb->commitTransaction();
|
||||
}
|
||||
@ -451,23 +463,22 @@ qint64 StatManager::getAppId(const QString &appPath)
|
||||
|
||||
qint64 StatManager::createAppId(const QString &appPath, qint64 unixTime, bool blocked)
|
||||
{
|
||||
qint64 appId = INVALID_APP_ID;
|
||||
|
||||
SqliteStmt *stmt = getSqliteStmt(StatSql::sqlInsertAppId);
|
||||
|
||||
stmt->bindText(1, appPath);
|
||||
stmt->bindInt64(2, unixTime);
|
||||
|
||||
if (stmt->step() == SqliteStmt::StepDone) {
|
||||
appId = m_sqliteDb->lastInsertRowid();
|
||||
if (m_sqliteDb->done(stmt)) {
|
||||
const qint64 appId = m_sqliteDb->lastInsertRowid();
|
||||
|
||||
if (!blocked) {
|
||||
emit appCreated(appId, appPath);
|
||||
}
|
||||
}
|
||||
stmt->reset();
|
||||
|
||||
return appId;
|
||||
return appId;
|
||||
}
|
||||
|
||||
return INVALID_APP_ID;
|
||||
}
|
||||
|
||||
qint64 StatManager::getOrCreateAppId(const QString &appPath, qint64 unixTime, bool blocked)
|
||||
@ -487,9 +498,16 @@ qint64 StatManager::getOrCreateAppId(const QString &appPath, qint64 unixTime, bo
|
||||
return appId;
|
||||
}
|
||||
|
||||
bool StatManager::deleteAppId(qint64 appId)
|
||||
{
|
||||
SqliteStmt *stmt = getIdStmt(StatSql::sqlDeleteAppId, appId);
|
||||
|
||||
return m_sqliteDb->done(stmt);
|
||||
}
|
||||
|
||||
void StatManager::getStatAppList(QStringList &list, QVector<qint64> &appIds)
|
||||
{
|
||||
SqliteStmt *stmt = getSqliteStmt(StatSql::sqlSelectStatAppPaths);
|
||||
SqliteStmt *stmt = getSqliteStmt(StatSql::sqlSelectStatAppList);
|
||||
|
||||
while (stmt->step() == SqliteStmt::StepRow) {
|
||||
appIds.append(stmt->columnInt64(0));
|
||||
@ -524,18 +542,12 @@ bool StatManager::updateTraffic(SqliteStmt *stmt, quint32 inBytes, quint32 outBy
|
||||
stmt->bindInt64(4, appId);
|
||||
}
|
||||
|
||||
const SqliteStmt::StepResult res = stmt->step();
|
||||
const bool ok = res == SqliteStmt::StepDone && m_sqliteDb->changes() != 0;
|
||||
stmt->reset();
|
||||
|
||||
return ok;
|
||||
return m_sqliteDb->done(stmt);
|
||||
}
|
||||
|
||||
qint64 StatManager::createConn(bool inbound, quint8 ipProto, quint16 localPort, quint16 remotePort,
|
||||
quint32 localIp, quint32 remoteIp, quint32 pid, qint64 unixTime, qint64 appId)
|
||||
{
|
||||
qint64 connId = 0;
|
||||
|
||||
SqliteStmt *stmt = getSqliteStmt(StatSql::sqlInsertConn);
|
||||
|
||||
stmt->bindInt64(1, appId);
|
||||
@ -548,12 +560,11 @@ qint64 StatManager::createConn(bool inbound, quint8 ipProto, quint16 localPort,
|
||||
stmt->bindInt(8, localIp);
|
||||
stmt->bindInt(9, remoteIp);
|
||||
|
||||
if (stmt->step() == SqliteStmt::StepDone) {
|
||||
connId = m_sqliteDb->lastInsertRowid();
|
||||
if (m_sqliteDb->done(stmt)) {
|
||||
return m_sqliteDb->lastInsertRowid();
|
||||
}
|
||||
stmt->reset();
|
||||
|
||||
return connId;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool StatManager::createConnBlock(qint64 connId, quint8 blockReason)
|
||||
@ -563,37 +574,37 @@ bool StatManager::createConnBlock(qint64 connId, quint8 blockReason)
|
||||
stmt->bindInt64(1, connId);
|
||||
stmt->bindInt(2, blockReason);
|
||||
|
||||
const bool ok = (stmt->step() == SqliteStmt::StepDone);
|
||||
stmt->reset();
|
||||
|
||||
return ok;
|
||||
return m_sqliteDb->done(stmt);
|
||||
}
|
||||
|
||||
void StatManager::deleteRangeConnBlock(qint64 connIdFrom, qint64 connIdTo)
|
||||
void StatManager::deleteRangeConnBlock(qint64 rowIdFrom, qint64 rowIdTo)
|
||||
{
|
||||
deleteAppStmtList(getId2Stmt(StatSql::sqlSelectDeletedRangeConnAppPaths, connIdFrom, connIdTo),
|
||||
{ getId2Stmt(StatSql::sqlDeleteRangeConnAppId, connIdFrom, connIdTo),
|
||||
getId2Stmt(StatSql::sqlDeleteRangeConn, connIdFrom, connIdTo),
|
||||
getId2Stmt(StatSql::sqlDeleteRangeConnBlock, connIdFrom, connIdTo) });
|
||||
deleteAppStmtList({ getId2Stmt(StatSql::sqlDeleteRangeConnForBlock, rowIdFrom, rowIdTo),
|
||||
getId2Stmt(StatSql::sqlDeleteRangeConnBlock, rowIdFrom, rowIdTo) },
|
||||
getId2Stmt(StatSql::sqlSelectDeletedRangeConnBlockAppList, rowIdFrom, rowIdTo));
|
||||
|
||||
m_connBlockIdMin = rowIdTo + 1;
|
||||
}
|
||||
|
||||
void StatManager::deleteAppStmtList(
|
||||
SqliteStmt *stmtAppPaths, const StatManager::QStmtList &stmtList)
|
||||
void StatManager::deleteAppStmtList(const StatManager::QStmtList &stmtList, SqliteStmt *stmtAppList)
|
||||
{
|
||||
// Delete Statements
|
||||
doStmtList(stmtList);
|
||||
|
||||
// Delete Cached AppIds
|
||||
{
|
||||
while (stmtAppPaths->step() == SqliteStmt::StepRow) {
|
||||
const QString appPath = stmtAppPaths->columnText(0);
|
||||
while (stmtAppList->step() == SqliteStmt::StepRow) {
|
||||
const qint64 appId = stmtAppList->columnInt64(0);
|
||||
const QString appPath = stmtAppList->columnText(1);
|
||||
|
||||
deleteAppId(appId);
|
||||
clearCachedAppId(appPath);
|
||||
}
|
||||
stmtAppPaths->reset();
|
||||
stmtAppList->reset();
|
||||
}
|
||||
|
||||
// Delete Statements
|
||||
stepStmtList(stmtList);
|
||||
}
|
||||
|
||||
void StatManager::stepStmtList(const QStmtList &stmtList)
|
||||
void StatManager::doStmtList(const QStmtList &stmtList)
|
||||
{
|
||||
for (SqliteStmt *stmt : stmtList) {
|
||||
stmt->step();
|
||||
|
@ -23,6 +23,12 @@ public:
|
||||
~StatManager() override;
|
||||
CLASS_DELETE_COPY_MOVE(StatManager)
|
||||
|
||||
qint64 connBlockIdMin() const { return m_connBlockIdMin; }
|
||||
qint64 connBlockIdMax() const { return m_connBlockIdMax; }
|
||||
|
||||
qint64 connTrafIdMin() const { return m_connTrafIdMin; }
|
||||
qint64 connTrafIdMax() const { return m_connTrafIdMax; }
|
||||
|
||||
const FirewallConf *firewallConf() const { return m_conf; }
|
||||
void setFirewallConf(const FirewallConf *conf);
|
||||
|
||||
@ -42,8 +48,8 @@ public:
|
||||
void deleteStatApp(qint64 appId);
|
||||
|
||||
bool deleteOldConnBlock();
|
||||
bool deleteConn(qint64 connId, bool blocked);
|
||||
void deleteConns();
|
||||
bool deleteConn(qint64 rowIdTo, bool blocked);
|
||||
void deleteConnAll();
|
||||
|
||||
void resetAppTrafTotals();
|
||||
|
||||
@ -63,6 +69,7 @@ public slots:
|
||||
private:
|
||||
using QStmtList = QList<SqliteStmt *>;
|
||||
|
||||
void initializeConnBlockId();
|
||||
void initializeActivePeriod();
|
||||
void initializeQuota();
|
||||
|
||||
@ -79,6 +86,7 @@ private:
|
||||
qint64 getAppId(const QString &appPath);
|
||||
qint64 createAppId(const QString &appPath, qint64 unixTime, bool blocked = false);
|
||||
qint64 getOrCreateAppId(const QString &appPath, qint64 unixTime = 0, bool blocked = false);
|
||||
bool deleteAppId(qint64 appId);
|
||||
|
||||
void updateTrafficList(const QStmtList &insertStmtList, const QStmtList &updateStmtList,
|
||||
quint32 inBytes, quint32 outBytes, qint64 appId = 0);
|
||||
@ -88,11 +96,11 @@ private:
|
||||
qint64 createConn(bool inbound, quint8 ipProto, quint16 localPort, quint16 remotePort,
|
||||
quint32 localIp, quint32 remoteIp, quint32 pid, qint64 unixTime, qint64 appId);
|
||||
bool createConnBlock(qint64 connId, quint8 blockReason);
|
||||
void deleteRangeConnBlock(qint64 connIdFrom, qint64 connIdTo);
|
||||
void deleteRangeConnBlock(qint64 rowIdFrom, qint64 rowIdTo);
|
||||
|
||||
void deleteAppStmtList(SqliteStmt *stmtAppPaths, const QStmtList &stmtList);
|
||||
void deleteAppStmtList(const QStmtList &stmtList, SqliteStmt *stmtAppList);
|
||||
|
||||
void stepStmtList(const QStmtList &stmtList);
|
||||
void doStmtList(const QStmtList &stmtList);
|
||||
|
||||
SqliteStmt *getTrafficStmt(const char *sql, qint32 trafTime);
|
||||
SqliteStmt *getIdStmt(const char *sql, qint64 id);
|
||||
@ -114,6 +122,12 @@ private:
|
||||
qint32 m_lastTrafMonth = 0;
|
||||
qint32 m_lastTick = 0;
|
||||
|
||||
qint64 m_connBlockIdMin = 0;
|
||||
qint64 m_connBlockIdMax = 0;
|
||||
|
||||
qint64 m_connTrafIdMin = 0;
|
||||
qint64 m_connTrafIdMax = 0;
|
||||
|
||||
QuotaManager *m_quotaManager = nullptr;
|
||||
const FirewallConf *m_conf = nullptr;
|
||||
|
||||
|
@ -4,17 +4,11 @@ const char *const StatSql::sqlSelectAppId = "SELECT app_id FROM app WHERE path =
|
||||
|
||||
const char *const StatSql::sqlInsertAppId = "INSERT INTO app(path, creat_time) VALUES(?1, ?2);";
|
||||
|
||||
const char *const StatSql::sqlSelectDeletedStatAppPaths =
|
||||
"SELECT path FROM app WHERE app_id = ?1"
|
||||
" and (SELECT 1 FROM conn WHERE app_id = ?1 LIMIT 1) is null;";
|
||||
const char *const StatSql::sqlDeleteAppId = "DELETE FROM app WHERE app_id = ?1;";
|
||||
|
||||
const char *const StatSql::sqlDeleteStatAppId =
|
||||
"DELETE FROM app WHERE app_id = ?1"
|
||||
" and (SELECT 1 FROM conn WHERE app_id = ?1 LIMIT 1) is null;";
|
||||
|
||||
const char *const StatSql::sqlSelectStatAppPaths = "SELECT app_id, path"
|
||||
" FROM app JOIN traffic_app USING(app_id)"
|
||||
" ORDER BY app_id;";
|
||||
const char *const StatSql::sqlSelectStatAppList = "SELECT t.app_id, t.path FROM app t"
|
||||
" JOIN traffic_app ta ON ta.app_id = t.app_id"
|
||||
" ORDER BY t.app_id;";
|
||||
|
||||
const char *const StatSql::sqlInsertTrafAppHour =
|
||||
"INSERT INTO traffic_app_hour(app_id, traf_time, in_bytes, out_bytes)"
|
||||
@ -47,22 +41,22 @@ const char *const StatSql::sqlInsertTrafMonth =
|
||||
const char *const StatSql::sqlUpdateTrafAppHour = "UPDATE traffic_app_hour"
|
||||
" SET in_bytes = in_bytes + ?2,"
|
||||
" out_bytes = out_bytes + ?3"
|
||||
" WHERE app_id = ?4 and traf_time = ?1;";
|
||||
" WHERE app_id = ?4 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlUpdateTrafAppDay = "UPDATE traffic_app_day"
|
||||
" SET in_bytes = in_bytes + ?2,"
|
||||
" out_bytes = out_bytes + ?3"
|
||||
" WHERE app_id = ?4 and traf_time = ?1;";
|
||||
" WHERE app_id = ?4 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlUpdateTrafAppMonth = "UPDATE traffic_app_month"
|
||||
" SET in_bytes = in_bytes + ?2,"
|
||||
" out_bytes = out_bytes + ?3"
|
||||
" WHERE app_id = ?4 and traf_time = ?1;";
|
||||
" WHERE app_id = ?4 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlUpdateTrafAppTotal = "UPDATE traffic_app"
|
||||
" SET in_bytes = in_bytes + ?2,"
|
||||
" out_bytes = out_bytes + ?3"
|
||||
" WHERE app_id = ?4 and 0 != ?1;";
|
||||
" WHERE app_id = ?4 AND 0 != ?1;";
|
||||
|
||||
const char *const StatSql::sqlUpdateTrafHour = "UPDATE traffic_hour"
|
||||
" SET in_bytes = in_bytes + ?2,"
|
||||
@ -101,19 +95,19 @@ const char *const StatSql::sqlSelectMinTrafTotal = "SELECT min(traf_time) FROM t
|
||||
|
||||
const char *const StatSql::sqlSelectTrafAppHour = "SELECT in_bytes, out_bytes"
|
||||
" FROM traffic_app_hour"
|
||||
" WHERE app_id = ?2 and traf_time = ?1;";
|
||||
" WHERE app_id = ?2 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlSelectTrafAppDay = "SELECT in_bytes, out_bytes"
|
||||
" FROM traffic_app_day"
|
||||
" WHERE app_id = ?2 and traf_time = ?1;";
|
||||
" WHERE app_id = ?2 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlSelectTrafAppMonth = "SELECT in_bytes, out_bytes"
|
||||
" FROM traffic_app_month"
|
||||
" WHERE app_id = ?2 and traf_time = ?1;";
|
||||
" WHERE app_id = ?2 AND traf_time = ?1;";
|
||||
|
||||
const char *const StatSql::sqlSelectTrafAppTotal = "SELECT in_bytes, out_bytes"
|
||||
" FROM traffic_app"
|
||||
" WHERE app_id = ?2 and 0 != ?1;";
|
||||
" WHERE app_id = ?2 AND 0 != ?1;";
|
||||
|
||||
const char *const StatSql::sqlSelectTrafHour = "SELECT in_bytes, out_bytes"
|
||||
" FROM traffic_hour WHERE traf_time = ?1;";
|
||||
@ -128,13 +122,13 @@ const char *const StatSql::sqlSelectTrafTotal = "SELECT sum(in_bytes), sum(out_b
|
||||
" FROM traffic_app WHERE 0 != ?1;";
|
||||
|
||||
const char *const StatSql::sqlDeleteTrafAppHour = "DELETE FROM traffic_app_hour"
|
||||
" WHERE traf_time < ?1 and app_id > 0;";
|
||||
" WHERE traf_time < ?1 AND app_id > 0;";
|
||||
|
||||
const char *const StatSql::sqlDeleteTrafAppDay = "DELETE FROM traffic_app_day"
|
||||
" WHERE traf_time < ?1 and app_id > 0;";
|
||||
" WHERE traf_time < ?1 AND app_id > 0;";
|
||||
|
||||
const char *const StatSql::sqlDeleteTrafAppMonth = "DELETE FROM traffic_app_month"
|
||||
" WHERE traf_time < ?1 and app_id > 0;";
|
||||
" WHERE traf_time < ?1 AND app_id > 0;";
|
||||
|
||||
const char *const StatSql::sqlDeleteTrafHour = "DELETE FROM traffic_hour WHERE traf_time < ?1;";
|
||||
|
||||
@ -154,6 +148,10 @@ const char *const StatSql::sqlDeleteAppTrafMonth = "DELETE FROM traffic_app_mont
|
||||
const char *const StatSql::sqlDeleteAppTrafTotal = "DELETE FROM traffic_app"
|
||||
" WHERE app_id = ?1;";
|
||||
|
||||
const char *const StatSql::sqlSelectDeletedStatAppList =
|
||||
"SELECT app_id, path FROM app WHERE app_id = ?1"
|
||||
" AND (SELECT 1 FROM conn WHERE app_id = ?1 LIMIT 1) IS NULL;";
|
||||
|
||||
const char *const StatSql::sqlResetAppTrafTotals =
|
||||
"UPDATE traffic_app"
|
||||
" SET traf_time = ?1, in_bytes = 0, out_bytes = 0;";
|
||||
@ -166,37 +164,28 @@ const char *const StatSql::sqlInsertConn =
|
||||
const char *const StatSql::sqlInsertConnBlock = "INSERT INTO conn_block(conn_id, block_reason)"
|
||||
" VALUES(?1, ?2);";
|
||||
|
||||
const char *const StatSql::sqlSelectOldConnBlock = "SELECT conn_id FROM conn_block"
|
||||
" ORDER BY conn_id DESC"
|
||||
" LIMIT 1 OFFSET ?1;";
|
||||
const char *const StatSql::sqlSelectMinMaxConnBlockId = "SELECT MIN(id), MAX(id) FROM conn_block;";
|
||||
|
||||
const char *const StatSql::sqlSelectDeletedRangeConnAppPaths =
|
||||
"SELECT path FROM app WHERE app_id in ("
|
||||
" SELECT app_id FROM conn t"
|
||||
" LEFT JOIN traffic_app ta USING(app_id)"
|
||||
" WHERE conn_id between ?1 and ?2 and ta.app_id is null"
|
||||
") and (SELECT 1 FROM conn c WHERE c.conn_id not between ?1 and ?2"
|
||||
" and c.app_id = app.app_id LIMIT 1) is null;";
|
||||
|
||||
const char *const StatSql::sqlDeleteRangeConnAppId =
|
||||
"DELETE FROM app WHERE app_id in ("
|
||||
" SELECT app_id FROM conn"
|
||||
" LEFT JOIN traffic_app ta USING(app_id)"
|
||||
" WHERE conn_id between ?1 and ?2 and ta.app_id is null"
|
||||
") and (SELECT 1 FROM conn c WHERE c.conn_id not between ?1 and ?2"
|
||||
" and c.app_id = app.app_id LIMIT 1) is null;";
|
||||
|
||||
const char *const StatSql::sqlDeleteRangeConn = "DELETE FROM conn WHERE conn_id between ?1 and ?2;";
|
||||
const char *const StatSql::sqlDeleteRangeConnForBlock =
|
||||
"DELETE FROM conn WHERE conn_id IN ("
|
||||
" SELECT conn_id FROM conn_block WHERE id BETWEEN ?1 AND ?2"
|
||||
");";
|
||||
|
||||
const char *const StatSql::sqlDeleteRangeConnBlock =
|
||||
"DELETE FROM conn_block WHERE conn_id between ?1 and ?2;";
|
||||
"DELETE FROM conn_block WHERE id BETWEEN ?1 AND ?2;";
|
||||
|
||||
const char *const StatSql::sqlSelectDeletedAllConnAppPaths =
|
||||
"SELECT path FROM app WHERE app_id not in (SELECT app_id FROM traffic_app);";
|
||||
|
||||
const char *const StatSql::sqlDeleteAllConnAppId =
|
||||
"DELETE FROM app WHERE app_id not in (SELECT app_id FROM traffic_app);";
|
||||
const char *const StatSql::sqlSelectDeletedRangeConnBlockAppList =
|
||||
"SELECT t.app_id, t.path FROM app t"
|
||||
" LEFT JOIN traffic_app ta ON ta.app_id = t.app_id"
|
||||
" WHERE ta.app_id IS NULL AND ("
|
||||
" SELECT 1 FROM conn c WHERE c.app_id = t.app_id LIMIT 1"
|
||||
" ) IS NULL;";
|
||||
|
||||
const char *const StatSql::sqlDeleteAllConn = "DELETE FROM conn;";
|
||||
|
||||
const char *const StatSql::sqlDeleteAllConnBlock = "DELETE FROM conn_block;";
|
||||
|
||||
const char *const StatSql::sqlSelectDeletedAllConnAppList =
|
||||
"SELECT t.app_id, t.path FROM app t"
|
||||
" LEFT JOIN traffic_app ta ON ta.app_id = t.app_id"
|
||||
" WHERE ta.app_id IS NULL;";
|
||||
|
@ -6,11 +6,9 @@ class StatSql
|
||||
public:
|
||||
static const char *const sqlSelectAppId;
|
||||
static const char *const sqlInsertAppId;
|
||||
static const char *const sqlDeleteAppId;
|
||||
|
||||
static const char *const sqlSelectDeletedStatAppPaths;
|
||||
static const char *const sqlDeleteStatAppId;
|
||||
|
||||
static const char *const sqlSelectStatAppPaths;
|
||||
static const char *const sqlSelectStatAppList;
|
||||
|
||||
static const char *const sqlInsertTrafAppHour;
|
||||
static const char *const sqlInsertTrafAppDay;
|
||||
@ -64,22 +62,22 @@ public:
|
||||
static const char *const sqlDeleteAppTrafMonth;
|
||||
static const char *const sqlDeleteAppTrafTotal;
|
||||
|
||||
static const char *const sqlSelectDeletedStatAppList;
|
||||
|
||||
static const char *const sqlResetAppTrafTotals;
|
||||
|
||||
static const char *const sqlInsertConn;
|
||||
static const char *const sqlInsertConnBlock;
|
||||
|
||||
static const char *const sqlSelectOldConnBlock;
|
||||
static const char *const sqlSelectMinMaxConnBlockId;
|
||||
|
||||
static const char *const sqlSelectDeletedRangeConnAppPaths;
|
||||
static const char *const sqlDeleteRangeConnAppId;
|
||||
static const char *const sqlDeleteRangeConn;
|
||||
static const char *const sqlDeleteRangeConnForBlock;
|
||||
static const char *const sqlDeleteRangeConnBlock;
|
||||
static const char *const sqlSelectDeletedRangeConnBlockAppList;
|
||||
|
||||
static const char *const sqlSelectDeletedAllConnAppPaths;
|
||||
static const char *const sqlDeleteAllConnAppId;
|
||||
static const char *const sqlDeleteAllConn;
|
||||
static const char *const sqlDeleteAllConnBlock;
|
||||
static const char *const sqlSelectDeletedAllConnAppList;
|
||||
};
|
||||
|
||||
#endif // STATSQL_H
|
||||
|
@ -10,7 +10,7 @@ int TableSqlModel::rowCount(const QModelIndex &parent) const
|
||||
Q_UNUSED(parent);
|
||||
|
||||
if (m_rowCount < 0) {
|
||||
m_rowCount = sqliteDb()->executeEx(sqlCount().toLatin1()).toInt();
|
||||
m_rowCount = doSqlCount();
|
||||
}
|
||||
|
||||
return m_rowCount;
|
||||
@ -55,6 +55,11 @@ void TableSqlModel::updateRowCache(int row) const
|
||||
}
|
||||
}
|
||||
|
||||
int TableSqlModel::doSqlCount() const
|
||||
{
|
||||
return sqliteDb()->executeEx(sqlCount().toLatin1()).toInt();
|
||||
}
|
||||
|
||||
QString TableSqlModel::sqlCount() const
|
||||
{
|
||||
return "SELECT count(*) FROM (" + sqlBase() + ");";
|
||||
@ -62,7 +67,7 @@ QString TableSqlModel::sqlCount() const
|
||||
|
||||
QString TableSqlModel::sql() const
|
||||
{
|
||||
return sqlBase() + sqlOrder() + " LIMIT 1 OFFSET ?1;";
|
||||
return sqlBase() + sqlWhere() + sqlOrder() + sqlLimitOffset() + ';';
|
||||
}
|
||||
|
||||
QString TableSqlModel::sqlOrder() const
|
||||
@ -82,3 +87,13 @@ QString TableSqlModel::sqlOrderColumn() const
|
||||
{
|
||||
return QString::number(sortColumn());
|
||||
}
|
||||
|
||||
QString TableSqlModel::sqlWhere() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString TableSqlModel::sqlLimitOffset() const
|
||||
{
|
||||
return " LIMIT 1 OFFSET ?1";
|
||||
}
|
||||
|
@ -32,12 +32,16 @@ protected:
|
||||
virtual bool updateTableRow(int row) const = 0;
|
||||
virtual TableRow &tableRow() const = 0;
|
||||
|
||||
virtual int doSqlCount() const;
|
||||
|
||||
virtual QString sqlCount() const;
|
||||
virtual QString sql() const;
|
||||
virtual QString sqlBase() const = 0;
|
||||
virtual QString sqlOrder() const;
|
||||
virtual QString sqlOrderAsc() const;
|
||||
virtual QString sqlOrderColumn() const;
|
||||
virtual QString sqlWhere() const;
|
||||
virtual QString sqlLimitOffset() const;
|
||||
|
||||
int sortColumn() const { return m_sortColumn; }
|
||||
void setSortColumn(int v) { m_sortColumn = v; }
|
||||
|
Loading…
Reference in New Issue
Block a user