blackfire531
3/17/2020 - 8:38 AM

读写数据库

基于Sqlite数据库的读写

#include "databaserw.h"

#define USERDATABASE      0
#define LOGDATABASE       1
#define DATASAVEDATABASE  2

dataBaseRW::dataBaseRW(QObject *parent) : QObject(parent)
{
  qDebug()<<"------------------------------------------------------------";
  qDebug()<<"Database thread start! ThreadID:"<<QThread::currentThreadId();
  qDebug() << QSqlDatabase::drivers();
  open_database();
}

dataBaseRW::~dataBaseRW()
{

}

void dataBaseRW::open_database(void)
{
  //  isDBOpen_user = open_database_user();
  //  isDBOpen_dataSave = open_database_dataSave();
  isDBOpen_log = open_database_log();
  qDebug()<<"All database has been opend!";
}

void dataBaseRW::close_database(void)
{
  //  close_database_user();
  //  close_database_dataSave();
  close_database_log();
  qDebug()<<"All database has been closed!";
}

//获取数据库查询指针
QSqlQuery* dataBaseRW::get_database_query(int type)
{
  QSqlQuery *val;
  switch (type)
  {
  case USERDATABASE://用户
    val = user_query;
    break;

  case LOGDATABASE://日志
    val = log_query;
    break;

  case DATASAVEDATABASE://落盘
    val = datasave_query;
    break;

  default:
    val = NULL;
    break;
  }
  return val;
}

//查询用户数据库条目数
int dataBaseRW::get_database_count(int type)
{
  int count = 0;
  QString select_sql;
  QSqlQuery *sql;
  switch (type)
  {
  case USERDATABASE://用户
    select_sql = "SELECT * FROM UserInfo";
    sql = get_database_query(USERDATABASE);
    qDebug() << "正在查询用户数据库条目数...";
    break;

  case LOGDATABASE://日志
    select_sql = "SELECT * FROM SystemLog";
    sql = get_database_query(LOGDATABASE);
    qDebug() << "正在查询日志数据库条目数...";
    break;

  case DATASAVEDATABASE://落盘
    select_sql = "SELECT * FROM DataSave";
    sql = get_database_query(DATASAVEDATABASE);
    qDebug() << "正在查询落盘数据库条目数...";
    break;

  default:
    sql = get_database_query(LOGDATABASE);
    select_sql.clear();
    count = 0;
    break;
  }
  if(!select_sql.isEmpty())//不为空则进行查询
  {
    sql->exec(select_sql);
    sql->last();
    count = sql->at()+1;
    qDebug() << "查询到数据库条目数:"<<count;
  }
  return count;
}

/******************************************************************************/
/*                                日志数据库                                   */
/******************************************************************************/
//打开日志数据库
bool dataBaseRW::open_database_log(void)
{
  if (QSqlDatabase::contains("log_database"))
  {
    database_log = QSqlDatabase::database("log_database");
  }
  else
  {
    database_log = QSqlDatabase::addDatabase("QSQLITE","log_database");
    database_log.setDatabaseName("./database/LogDB.db3");
  }
  if( !database_log.open())
  {
    qDebug()<<"无法打开用户数据库连接";
    return false;
  }
  else
  {
    log_query = new QSqlQuery(database_log);
    //判断数据库是否存在
    bool isTableExist = log_query->exec("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='SystemLog'");
    if(!isTableExist)
    {
      qDebug() << "数据库不存在!!";
      //用户数据库不存在
      //添加表和项目
      QString sql = "CREATE TABLE SystemLog("
                    "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                    "event TEXT,"
                    "user TEXT,"
                    "data TEXT,"
                    "time TEXT"
                    ")";
      log_query->exec(sql);
      QString currentTime,currentDate;
      currentTime = QTime::currentTime().toString("hh:mm:ss.zzz");
      currentDate = QDate::currentDate().toString("yyyy/MM/dd");
      log_query->prepare("INSERT INTO SystemLog (event,user,date,time) VALUES (:event, :user, :date, :time)");
      log_query->bindValue(":event", "数据库未找到或已损坏,重建数据库");
      log_query->bindValue(":user", "站控系统");
      log_query->bindValue(":date", currentDate);
      log_query->bindValue(":time", currentTime);
      log_query->exec();
    }
    else
    {
      qDebug() << "日志数据库已存在";
      get_database_count(LOGDATABASE);
    }
#if (PRINT_ALL_LOG == 1)
    //启动时罗列全部
    QString select_sql = "SELECT * FROM SystemLog";
    if(!log_query->exec(select_sql))
    {
      qDebug()<<log_query->lastError();
    }
    else
    {
      while(log_query->next())
      {
        int id = log_query->value(0).toInt();
        QString event = log_query->value(1).toString();
        QString user = log_query->value(2).toString();
        QString data = log_query->value(3).toString();
        QString time = log_query->value(4).toString();
        qDebug()<<id<<event<<user<<data<<time;
      }
    }
#endif
  }
  return true;
}

//关闭日志数据库
void dataBaseRW::close_database_log(void)
{
  if(database_log.isOpen())
  {
    database_log.close();
  }
  qDebug()<<"日志数据库已关闭";
}

//记录日志
void dataBaseRW::record_log(QString event, QString user)
{
  QString currentTime,currentDate;
  currentTime = QTime::currentTime().toString("hh:mm:ss.zzz");
  currentDate = QDate::currentDate().toString("yyyy/MM/dd");
  if(isDBOpen_log)
  {
    log_query->prepare("INSERT INTO SystemLog (event,user,date,time) VALUES (:event, :user, :date, :time)");
    log_query->bindValue(":event", event);
    log_query->bindValue(":user", user);
    log_query->bindValue(":date", currentDate);
    log_query->bindValue(":time", currentTime);
    log_query->exec();
    //qDebug()<<"Thread ID:"<<QThread::currentThreadId()<<"log saved";//输出测试
  }
}
#ifndef DATABASERW_H
#define DATABASERW_H

#include <QObject>
#include <QThread>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QTime>

class dataBaseRW : public QObject
{
    Q_OBJECT
  public:
    explicit dataBaseRW(QObject *parent = nullptr);
    ~dataBaseRW();

    QSqlDatabase database_user,database_log,database_datasave;
    QSqlQuery *log_query,*user_query,*datasave_query;
    bool isDBOpen_user,isDBOpen_log,isDBOpen_dataSave;

    void open_database(void);
    void close_database(void);
    QSqlQuery* get_database_query(int type);
    int get_database_count(int type);
    bool open_database_log(void);
    void close_database_log(void);
    void record_log(QString event, QString user);

  signals:

  public slots:
    void test_slot_for_database();
    void record_log(QString event, QString user);
    void record_dataSave(QByteArray data);
    void insert_user(int userid,QString username,QString password);
    void delete_user(QString username);
};

#endif // DATABASERW_H