|
@@ -0,0 +1,782 @@
|
|
|
+#include <QDateTime>
|
|
|
+#include "qappctrl.h"
|
|
|
+#include "helpers.h"
|
|
|
+#include "defines.h"
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _countof(a) (sizeof(a) / sizeof(*a))
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+typedef struct _SCHEMA_MODEL_ROLES
|
|
|
+{
|
|
|
+ int nRole;
|
|
|
+ const char *pszRoleName;
|
|
|
+}SCHEMA_MODEL_ROLES, *LPSCHEMA_MODEL_ROLES;
|
|
|
+typedef const SCHEMA_MODEL_ROLES *LPCSCHEMA_MODEL_ROLES;
|
|
|
+
|
|
|
+static const SCHEMA_MODEL_ROLES g_roles[] =
|
|
|
+{
|
|
|
+ {QGfaMySqlSchemaModel::SMR_Name, "name"},
|
|
|
+ {QGfaMySqlSchemaModel::SMR_Info, "infoRaw"},
|
|
|
+ {QGfaMySqlSchemaModel::SMR_InfoFormatted, "infoFormatted"}
|
|
|
+};
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem::QGfaMySqlSchemaTreeItem(QGfaMySqlSchemaTreeItem *pParentItem) : m_parentItem(pParentItem)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem::QGfaMySqlSchemaTreeItem(const QVariant &name, const QVariant &data, const QVariant &dataF, QGfaMySqlSchemaTreeItem *pParentItem) : m_parentItem(pParentItem)
|
|
|
+{
|
|
|
+ m_itemData.append(name);
|
|
|
+ m_itemData.append(data);
|
|
|
+ m_itemData.append(dataF.isValid() ? dataF : data);
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem::~QGfaMySqlSchemaTreeItem(void)
|
|
|
+{
|
|
|
+ qDeleteAll(m_childItems);
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlSchemaTreeItem::appendChild(QGfaMySqlSchemaTreeItem *item)
|
|
|
+{
|
|
|
+ m_childItems.append(item);
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlSchemaTreeItem::clear(void)
|
|
|
+{
|
|
|
+ qDeleteAll(m_childItems);
|
|
|
+ m_childItems.clear();
|
|
|
+ m_itemData.clear();
|
|
|
+ m_parentItem = NULL;
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem *QGfaMySqlSchemaTreeItem::child(int row)
|
|
|
+{
|
|
|
+ if (row < 0 || row >= m_childItems.size())
|
|
|
+ return NULL;
|
|
|
+ return m_childItems.at(row);
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaTreeItem::childCount() const
|
|
|
+{
|
|
|
+ return m_childItems.count();
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaTreeItem::columnCount() const
|
|
|
+{
|
|
|
+ return _countof(g_roles);
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaMySqlSchemaTreeItem::data(int column) const
|
|
|
+{
|
|
|
+ if (column < 0 || column >= m_itemData.size())
|
|
|
+ return QVariant();
|
|
|
+ return m_itemData.at(column);
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem *QGfaMySqlSchemaTreeItem::parentItem()
|
|
|
+{
|
|
|
+ return m_parentItem;
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaTreeItem::row() const
|
|
|
+{
|
|
|
+ if (m_parentItem)
|
|
|
+ return m_parentItem->m_childItems.indexOf(const_cast<QGfaMySqlSchemaTreeItem*>(this));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaTreeItem* QGfaMySqlSchemaTreeItem::getChildItemByName(const char *pszName)
|
|
|
+{
|
|
|
+ for(QGfaMySqlSchemaTreeItem* pItem : m_childItems)
|
|
|
+ {
|
|
|
+ QVariant name = pItem->data(0);
|
|
|
+
|
|
|
+ if(name.isValid())
|
|
|
+ {
|
|
|
+ if(name == QVariant(pszName))
|
|
|
+ return pItem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaTreeItem::compareValue(const QVariant &val) const
|
|
|
+{
|
|
|
+ if((m_itemData.size() >= 3) && val.isValid())
|
|
|
+ {
|
|
|
+ if(m_itemData[1].type() == val.type())
|
|
|
+ return !(m_itemData[1] == val);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+bool QGfaMySqlSchemaTreeItem::updateValue(const QVariant &val, const QVariant &valF)
|
|
|
+{
|
|
|
+ bool bUpdated = false;
|
|
|
+
|
|
|
+ if(m_itemData.size() >= 3)
|
|
|
+ {
|
|
|
+ if(val.isValid())
|
|
|
+ {
|
|
|
+ if(m_itemData[1] != val)
|
|
|
+ {
|
|
|
+ m_itemData[1] = val;
|
|
|
+ bUpdated = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(valF.isValid())
|
|
|
+ {
|
|
|
+ if(m_itemData[2] != valF)
|
|
|
+ {
|
|
|
+ m_itemData[2] = valF;
|
|
|
+ bUpdated = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(m_itemData[2] != val)
|
|
|
+ {
|
|
|
+ m_itemData[2] = val;
|
|
|
+ bUpdated = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(m_itemData[1].isValid() || m_itemData[2].isValid())
|
|
|
+ {
|
|
|
+ m_itemData[1] = QVariant();
|
|
|
+ m_itemData[2] = QVariant();
|
|
|
+ bUpdated = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return bUpdated;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QGfaMySqlSchemaModel::QGfaMySqlSchemaModel(QObject *pParent) : QAbstractItemModel(pParent)
|
|
|
+{
|
|
|
+ m_pRootItem = new QGfaMySqlSchemaTreeItem();
|
|
|
+
|
|
|
+ for(size_t i = 0; i < _countof(g_roles); ++i)
|
|
|
+ {
|
|
|
+ m_roleNameMapping[g_roles[i].nRole] = g_roles[i].pszRoleName;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlSchemaModel::~QGfaMySqlSchemaModel(void)
|
|
|
+{
|
|
|
+ delete m_pRootItem;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlSchemaModel::clearAll(void)
|
|
|
+{
|
|
|
+ beginResetModel();
|
|
|
+ m_pRootItem->clear();
|
|
|
+ endResetModel();
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaMySqlSchemaModel::data(const QModelIndex &index, int role) const
|
|
|
+{
|
|
|
+ if(!index.isValid())
|
|
|
+ return QVariant();
|
|
|
+
|
|
|
+ if((role < SMR_Name) || (role >= SMR_Invalid))
|
|
|
+ return QVariant();
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *item = static_cast<QGfaMySqlSchemaTreeItem*>(index.internalPointer());
|
|
|
+ // Do not use index.column as shown in some examples!
|
|
|
+ return item->data(role - SMR_Name);
|
|
|
+}
|
|
|
+
|
|
|
+Qt::ItemFlags QGfaMySqlSchemaModel::flags(const QModelIndex &index) const
|
|
|
+{
|
|
|
+ if(!index.isValid())
|
|
|
+ return Qt::NoItemFlags;
|
|
|
+ return QAbstractItemModel::flags(index);
|
|
|
+}
|
|
|
+
|
|
|
+QVariant QGfaMySqlSchemaModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
|
+{
|
|
|
+ if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
|
|
|
+ return m_pRootItem->data(section);
|
|
|
+ return QVariant();
|
|
|
+}
|
|
|
+
|
|
|
+QModelIndex QGfaMySqlSchemaModel::index(int row, int column, const QModelIndex &parentIndex) const
|
|
|
+{
|
|
|
+ if(!hasIndex(row, column, parentIndex))
|
|
|
+ return QModelIndex();
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *pParentItem;
|
|
|
+
|
|
|
+ if(!parentIndex.isValid())
|
|
|
+ pParentItem = m_pRootItem;
|
|
|
+ else
|
|
|
+ pParentItem = static_cast<QGfaMySqlSchemaTreeItem*>(parentIndex.internalPointer());
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *pChildItem = pParentItem->child(row);
|
|
|
+ if(pChildItem)
|
|
|
+ return createIndex(row, column, pChildItem);
|
|
|
+ return QModelIndex();
|
|
|
+}
|
|
|
+
|
|
|
+QModelIndex QGfaMySqlSchemaModel::parent(const QModelIndex &index) const
|
|
|
+{
|
|
|
+ if (!index.isValid())
|
|
|
+ return QModelIndex();
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *pChildItem = static_cast<QGfaMySqlSchemaTreeItem*>(index.internalPointer());
|
|
|
+ QGfaMySqlSchemaTreeItem *pParentItem = pChildItem->parentItem();
|
|
|
+
|
|
|
+ if (pParentItem == m_pRootItem)
|
|
|
+ return QModelIndex();
|
|
|
+
|
|
|
+ return createIndex(pParentItem->row(), 0, pParentItem);
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaModel::rowCount(const QModelIndex &parentIndex) const
|
|
|
+{
|
|
|
+ QGfaMySqlSchemaTreeItem *pParentItem;
|
|
|
+ if (parentIndex.column() > 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (!parentIndex.isValid())
|
|
|
+ pParentItem = m_pRootItem;
|
|
|
+ else
|
|
|
+ pParentItem = static_cast<QGfaMySqlSchemaTreeItem*>(parentIndex.internalPointer());
|
|
|
+
|
|
|
+ return pParentItem->childCount();
|
|
|
+}
|
|
|
+
|
|
|
+int QGfaMySqlSchemaModel::columnCount(const QModelIndex &parentIndex) const
|
|
|
+{
|
|
|
+ if(parentIndex.isValid())
|
|
|
+ return static_cast<QGfaMySqlSchemaTreeItem*>(parentIndex.internalPointer())->columnCount();
|
|
|
+ return m_pRootItem->columnCount();
|
|
|
+}
|
|
|
+
|
|
|
+QHash<int, QByteArray> QGfaMySqlSchemaModel::roleNames() const
|
|
|
+{
|
|
|
+ return m_roleNameMapping;
|
|
|
+}
|
|
|
+
|
|
|
+#define MODEL_NAME_SCHEMA_TABLES "Tables"
|
|
|
+#define MODEL_NAME_TABLE_ENGINE "Engine"
|
|
|
+#define MODEL_NAME_TABLE_VERSION "Version"
|
|
|
+#define MODEL_NAME_TABLE_CREATE_TIME "Created"
|
|
|
+#define MODEL_NAME_TABLE_ROW_FORMAT "Row format"
|
|
|
+#define MODEL_NAME_TABLE_COLLATION "Collation"
|
|
|
+
|
|
|
+void QGfaMySqlSchemaModel::updateDatabaseValues(int nCntDbs, LPCGFA_MYSQL_SCHEMA pdbs)
|
|
|
+{
|
|
|
+ for(int i = 0; i < nCntDbs; ++i)
|
|
|
+ {
|
|
|
+ const GFA_MYSQL_SCHEMA &dbs = pdbs[i];
|
|
|
+ QGfaMySqlSchemaTreeItem *pDb, *pTbls, *pTbl, *pItem;
|
|
|
+
|
|
|
+ if(!(pDb = m_pRootItem->getChildItemByName(dbs.szName)))
|
|
|
+ return;
|
|
|
+ QModelIndex indDb = index(pDb->row(), 0);
|
|
|
+
|
|
|
+ if(pDb->updateValue((qint64)dbs.nSizeTotal, ::FormatByteSize(dbs.nSizeTotal, false)))
|
|
|
+ emit dataChanged(indDb, indDb, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pTbls = pDb->getChildItemByName(MODEL_NAME_SCHEMA_TABLES)))
|
|
|
+ return;
|
|
|
+ QModelIndex indTbls = index(pTbls->row(), 0, indDb);
|
|
|
+
|
|
|
+ if(pTbls->compareValue(dbs.nNumTables))
|
|
|
+ return;
|
|
|
+
|
|
|
+ for(int j = 0; j < (int)dbs.nNumTables; ++j)
|
|
|
+ {
|
|
|
+ QModelIndex indItem;
|
|
|
+ const GFA_MYSQL_TABLE &tbl = dbs.tables[j];
|
|
|
+
|
|
|
+ if(!(pTbl = pTbls->getChildItemByName(tbl.szName)))
|
|
|
+ return;
|
|
|
+ QModelIndex indTbl = index(pTbl->row(), 0, indTbls);
|
|
|
+ if(pTbl->updateValue((qint64)tbl.nSizeTotal, ::FormatByteSize(tbl.nSizeTotal, false)))
|
|
|
+ emit dataChanged(indTbl, indTbl, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pItem = pTbl->getChildItemByName(MODEL_NAME_TABLE_CREATE_TIME)))
|
|
|
+ return;
|
|
|
+ indItem = index(pItem->row(), 0, indTbl);
|
|
|
+ if(pItem->updateValue((qint64)tbl.nCreateTime, QDateTime::fromMSecsSinceEpoch((qint64)tbl.nCreateTime * 1000LL)))
|
|
|
+ emit dataChanged(indItem, indItem, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pItem = pTbl->getChildItemByName(MODEL_NAME_TABLE_ENGINE)))
|
|
|
+ return;
|
|
|
+ indItem = index(pItem->row(), 0, indTbl);
|
|
|
+ if(pItem->updateValue(tbl.szEngine))
|
|
|
+ emit dataChanged(indItem, indItem, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pItem = pTbl->getChildItemByName(MODEL_NAME_TABLE_VERSION)))
|
|
|
+ return;
|
|
|
+ indItem = index(pItem->row(), 0, indTbl);
|
|
|
+ if(pItem->updateValue(tbl.nVersion))
|
|
|
+ emit dataChanged(indItem, indItem, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pItem = pTbl->getChildItemByName(MODEL_NAME_TABLE_ROW_FORMAT)))
|
|
|
+ return;
|
|
|
+ indItem = index(pItem->row(), 0, indTbl);
|
|
|
+ if(pItem->updateValue(tbl.szRowFormat))
|
|
|
+ emit dataChanged(indItem, indItem, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+
|
|
|
+ if(!(pItem = pTbl->getChildItemByName(MODEL_NAME_TABLE_COLLATION)))
|
|
|
+ return;
|
|
|
+ indItem = index(pItem->row(), 0, indTbl);
|
|
|
+ if(pItem->updateValue(tbl.szCollation))
|
|
|
+ emit dataChanged(indItem, indItem, QVector<int>({SMR_Info, SMR_InfoFormatted}));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// checks if a Database or Table has been removed or added
|
|
|
+bool QGfaMySqlSchemaModel::getDatabaseLayoutChanged(int nCntDbs, LPCGFA_MYSQL_SCHEMA pdbs) const
|
|
|
+{
|
|
|
+ if(m_pRootItem->childCount() != nCntDbs)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ for(int i = 0; i < nCntDbs; ++i)
|
|
|
+ {
|
|
|
+ const GFA_MYSQL_SCHEMA &dbs = pdbs[i];
|
|
|
+ QGfaMySqlSchemaTreeItem *pDb, *pTbls;
|
|
|
+
|
|
|
+ if(!(pDb = m_pRootItem->getChildItemByName(dbs.szName)))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if(!(pTbls = pDb->getChildItemByName(MODEL_NAME_SCHEMA_TABLES)))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if(pTbls->compareValue(dbs.nNumTables))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ for(int j = 0; j < (int)dbs.nNumTables; ++j)
|
|
|
+ {
|
|
|
+ const GFA_MYSQL_TABLE &tbl = dbs.tables[j];
|
|
|
+
|
|
|
+ if(!(pTbls->getChildItemByName(tbl.szName)))
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlSchemaModel::setModelData(unsigned int nCntDbs, LPCGFA_MYSQL_SCHEMA pdbs)
|
|
|
+{
|
|
|
+ if(getDatabaseLayoutChanged(nCntDbs, pdbs))
|
|
|
+ {
|
|
|
+ // if not only values, but databases or tables have changed, completely reset the treeview control
|
|
|
+ beginResetModel();
|
|
|
+ m_pRootItem->clear();
|
|
|
+
|
|
|
+ for(unsigned int i = 0; i < nCntDbs; ++i)
|
|
|
+ {
|
|
|
+ QGfaMySqlSchemaTreeItem *pTiTmp, *pTiTbls;
|
|
|
+ const GFA_MYSQL_SCHEMA &dbs = pdbs[i];
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *pTiDb = new QGfaMySqlSchemaTreeItem(dbs.szName, dbs.nSizeTotal, ::FormatByteSize(dbs.nSizeTotal, false), m_pRootItem);
|
|
|
+
|
|
|
+ pTiTbls = new QGfaMySqlSchemaTreeItem(MODEL_NAME_SCHEMA_TABLES, dbs.nNumTables, QVariant(), pTiDb);
|
|
|
+
|
|
|
+ for(unsigned int j = 0; j < dbs.nNumTables; ++j)
|
|
|
+ {
|
|
|
+ const GFA_MYSQL_TABLE &tbl = dbs.tables[j];
|
|
|
+
|
|
|
+ QGfaMySqlSchemaTreeItem *pTiTbl = new QGfaMySqlSchemaTreeItem(tbl.szName, tbl.nSizeTotal, ::FormatByteSize(tbl.nSizeTotal, false), pTiTbls);
|
|
|
+
|
|
|
+ pTiTmp = new QGfaMySqlSchemaTreeItem(MODEL_NAME_TABLE_CREATE_TIME, (qint64)tbl.nCreateTime, QDateTime::fromMSecsSinceEpoch((qint64)tbl.nCreateTime * 1000LL), pTiTbl);
|
|
|
+ pTiTbl->appendChild(pTiTmp);
|
|
|
+ pTiTmp = new QGfaMySqlSchemaTreeItem(MODEL_NAME_TABLE_ENGINE, tbl.szEngine, QVariant(), pTiTbl);
|
|
|
+ pTiTbl->appendChild(pTiTmp);
|
|
|
+ pTiTmp = new QGfaMySqlSchemaTreeItem(MODEL_NAME_TABLE_VERSION, tbl.nVersion, QVariant(), pTiTbl);
|
|
|
+ pTiTbl->appendChild(pTiTmp);
|
|
|
+ pTiTmp = new QGfaMySqlSchemaTreeItem(MODEL_NAME_TABLE_ROW_FORMAT, tbl.szRowFormat, QVariant(), pTiTbl);
|
|
|
+ pTiTbl->appendChild(pTiTmp);
|
|
|
+ pTiTmp = new QGfaMySqlSchemaTreeItem(MODEL_NAME_TABLE_COLLATION, tbl.szCollation, QVariant(), pTiTbl);
|
|
|
+ pTiTbl->appendChild(pTiTmp);
|
|
|
+
|
|
|
+ pTiTbls->appendChild(pTiTbl);
|
|
|
+ }
|
|
|
+
|
|
|
+ pTiDb->appendChild(pTiTbls);
|
|
|
+ m_pRootItem->appendChild(pTiDb);
|
|
|
+ }
|
|
|
+ endResetModel();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ updateDatabaseValues(nCntDbs, pdbs);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QGfaMySqlInfo::QGfaMySqlInfo(QObject *pParent) : QObject(pParent)
|
|
|
+{
|
|
|
+ memset(&m_sysInfoDbShadow, 0, sizeof(m_sysInfoDbShadow));
|
|
|
+}
|
|
|
+
|
|
|
+QGfaMySqlInfo::~QGfaMySqlInfo(void)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+bool QGfaMySqlInfo::isInit(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.bIsInit;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+// Server
|
|
|
+
|
|
|
+bool QGfaMySqlInfo::svrRunning(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.bRunning;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrRunning(bool val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.svr.bRunning != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.svr.bRunning = val;
|
|
|
+ emit svrRunningChanged(m_sysInfoDbShadow.svr.bRunning);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+bool QGfaMySqlInfo::svrInnoDbFilePerTableSpace(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.bInnoDbFilePerTable;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrInnoDbFilePerTableSpace(bool val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.svr.bInnoDbFilePerTable != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.svr.bInnoDbFilePerTable = val;
|
|
|
+ emit svrInnoDbFilePerTableSpaceChanged(m_sysInfoDbShadow.svr.bInnoDbFilePerTable);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+qint32 QGfaMySqlInfo::svrPid(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.pid;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrPid(pid_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.svr.pid != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.svr.pid = val;
|
|
|
+ emit svrPidChanged(m_sysInfoDbShadow.svr.pid);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint64 QGfaMySqlInfo::svrUpTime(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.nUptimeSec;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrUpTime(time_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.svr.nUptimeSec != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.svr.nUptimeSec = val;
|
|
|
+ emit svrUpTimeChanged(m_sysInfoDbShadow.svr.nUptimeSec);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint64 QGfaMySqlInfo::svrDiscUsage(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.nDiscUsageTotal;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrDiscUsage(size_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.svr.nDiscUsageTotal != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.svr.nDiscUsageTotal = val;
|
|
|
+ emit svrDiscUsageChanged(m_sysInfoDbShadow.svr.nDiscUsageTotal);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QString QGfaMySqlInfo::svrVersion(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.szVersion;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrVersion(const char *val)
|
|
|
+{
|
|
|
+ if(val && *val)
|
|
|
+ {
|
|
|
+ if(strcmp(m_sysInfoDbShadow.svr.szVersion, val))
|
|
|
+ {
|
|
|
+ if(strlen(val) < GFA_MYSQL_MAX_SVR_VERSION_LENGTH)
|
|
|
+ {
|
|
|
+ strcpy(m_sysInfoDbShadow.svr.szVersion, val);
|
|
|
+ emit svrVersionChanged(m_sysInfoDbShadow.svr.szVersion);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(*m_sysInfoDbShadow.svr.szVersion)
|
|
|
+ {
|
|
|
+ memset(m_sysInfoDbShadow.svr.szVersion, 0, GFA_MYSQL_MAX_SVR_VERSION_LENGTH);
|
|
|
+ emit svrVersionChanged(m_sysInfoDbShadow.svr.szVersion);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QString QGfaMySqlInfo::svrDataDir(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.svr.szDataDir;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrDataDir(const char *val)
|
|
|
+{
|
|
|
+ if(val && *val)
|
|
|
+ {
|
|
|
+ if(strcmp(m_sysInfoDbShadow.svr.szDataDir, val))
|
|
|
+ {
|
|
|
+ if(strlen(val) < GFA_MYSQL_MAX_DATADIR_LENGTH)
|
|
|
+ {
|
|
|
+ strcpy(m_sysInfoDbShadow.svr.szDataDir, val);
|
|
|
+ emit svrDataDirChanged(m_sysInfoDbShadow.svr.szDataDir);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(*m_sysInfoDbShadow.svr.szDataDir)
|
|
|
+ {
|
|
|
+ memset(m_sysInfoDbShadow.svr.szDataDir, 0, GFA_MYSQL_MAX_DATADIR_LENGTH);
|
|
|
+ emit svrDataDirChanged(m_sysInfoDbShadow.svr.szDataDir);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint32 QGfaMySqlInfo::svrNumDataBases(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.nNumDatabases;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setSvrNumDataBases(unsigned int val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.nNumDatabases != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.nNumDatabases = val;
|
|
|
+ emit svrNumDataBasesChanged(m_sysInfoDbShadow.nNumDatabases);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+QGfaMySqlSchemaModel* QGfaMySqlInfo::schemaModel(void)
|
|
|
+{
|
|
|
+ return &m_mySqlSchemaModel;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+// CPU
|
|
|
+
|
|
|
+double QGfaMySqlInfo::cpuTime(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.at.fCpuTime;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setCpuTime(double val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.at.fCpuTime != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.at.fCpuTime = val;
|
|
|
+ emit cpuTimeChanged(m_sysInfoDbShadow.res.at.fCpuTime);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+double QGfaMySqlInfo::cpuCur(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.at.fCpuCur;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setCpuCur(double val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.at.fCpuCur != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.at.fCpuCur = val;
|
|
|
+ emit cpuCurChanged(m_sysInfoDbShadow.res.at.fCpuCur);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+double QGfaMySqlInfo::cpuAvg(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.at.fCpuAvg;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setCpuAvg(double val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.at.fCpuAvg != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.at.fCpuAvg = val;
|
|
|
+ emit cpuAvgChanged(m_sysInfoDbShadow.res.at.fCpuAvg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+// Memory
|
|
|
+
|
|
|
+quint32 QGfaMySqlInfo::vmPeak(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.am.vmPeak;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setVmPeak(size_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.am.vmPeak != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.am.vmPeak = val;
|
|
|
+ emit vmPeakChanged(m_sysInfoDbShadow.res.am.vmPeak);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint32 QGfaMySqlInfo::vmSize(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.am.vmSize;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setVmSize(size_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.am.vmSize != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.am.vmSize = val;
|
|
|
+ emit vmSizeChanged(m_sysInfoDbShadow.res.am.vmSize);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint32 QGfaMySqlInfo::vmHWM(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.am.vmHWM;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setVmHWM(size_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.am.vmHWM != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.am.vmHWM = val;
|
|
|
+ emit vmHWMChanged(m_sysInfoDbShadow.res.am.vmHWM);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+quint32 QGfaMySqlInfo::vmRSS(void) const
|
|
|
+{
|
|
|
+ return m_sysInfoDbShadow.res.am.vmRSS;
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::setVmRSS(size_t val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.res.am.vmRSS != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.res.am.vmRSS = val;
|
|
|
+ emit vmRSSChanged(m_sysInfoDbShadow.res.am.vmRSS);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+void QGfaMySqlInfo::onMySqlInitEvent(bool val)
|
|
|
+{
|
|
|
+ if(m_sysInfoDbShadow.bIsInit != val)
|
|
|
+ {
|
|
|
+ m_sysInfoDbShadow.bIsInit = val;
|
|
|
+ emit isInitChanged(m_sysInfoDbShadow.bIsInit);
|
|
|
+
|
|
|
+ if(!m_sysInfoDbShadow.bIsInit)
|
|
|
+ {
|
|
|
+ setSvrRunning(false);
|
|
|
+ setSvrInnoDbFilePerTableSpace(false);
|
|
|
+ setSvrPid(0);
|
|
|
+ setSvrUpTime(0);
|
|
|
+ setSvrDiscUsage(0);
|
|
|
+ setSvrVersion(NULL);
|
|
|
+ setSvrDataDir(NULL);
|
|
|
+ setSvrNumDataBases(0);
|
|
|
+
|
|
|
+ setCpuTime(0);
|
|
|
+ setCpuCur(0);
|
|
|
+ setCpuAvg(0);
|
|
|
+
|
|
|
+ setVmPeak(0);
|
|
|
+ setVmSize(0);
|
|
|
+ setVmHWM(0);
|
|
|
+ setVmRSS(0);
|
|
|
+
|
|
|
+ m_mySqlSchemaModel.clearAll();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::onMySqlServerEvent(const GFA_MYSQL_SERVER &svr)
|
|
|
+{
|
|
|
+ setSvrRunning(svr.bRunning);
|
|
|
+ setSvrInnoDbFilePerTableSpace(svr.bInnoDbFilePerTable);
|
|
|
+ setSvrPid(svr.pid);
|
|
|
+ setSvrUpTime(svr.nUptimeSec);
|
|
|
+ setSvrDiscUsage(svr.nDiscUsageTotal);
|
|
|
+ setSvrVersion(svr.szVersion);
|
|
|
+ setSvrDataDir(svr.szDataDir);
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::onMySqlResourceEvent(const GFA_MYSQL_RESOURCE &res)
|
|
|
+{
|
|
|
+ setCpuTime(res.at.fCpuTime);
|
|
|
+ setCpuCur(res.at.fCpuCur);
|
|
|
+ setCpuAvg(res.at.fCpuAvg);
|
|
|
+
|
|
|
+ setVmPeak(res.am.vmPeak);
|
|
|
+ setVmSize(res.am.vmSize);
|
|
|
+ setVmHWM(res.am.vmHWM);
|
|
|
+ setVmRSS(res.am.vmRSS);
|
|
|
+}
|
|
|
+
|
|
|
+void QGfaMySqlInfo::onMySqlDatabaseEvent(unsigned int nNumDatabases, LPCGFA_MYSQL_SCHEMA pdbs)
|
|
|
+{
|
|
|
+ setSvrNumDataBases(nNumDatabases);
|
|
|
+ m_mySqlSchemaModel.setModelData(nNumDatabases, pdbs);
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|