Тестирование программного модуля



Тестирование программы с использованием входных данных из базы данных (Рис.2.4.1) и текстового документа (Рис.2.4.2).

Рис. 2.4.1. Входные данные из базы данных

Рис. 2.4.2. Входные данные из текстового файла

Выходные данные программы является журнал работы программы в текстовом файле (Рис. 2.4.3.) и минимальное время приёма сообщения. (Рис. 2.4.4)

Рис. 2.4.3. Выходной журнал работы программы

Рис. 2.4.4. Файл минимального времени приёма

2.5. Оптимизация программного кода модуля

Была оптимизирована функция определения текущего условия передачи в зависимости от времени в Листинге 2.5.1. Для оптимизации была удалена лишняя переменная и добавлен return в тело конструкции if. Этим было ускорено быстродействие программы, а также уменьшено использование памяти.

Листинг 2.5.1. Функция определения цвета шкалы до оптимизации.

ECondition cond = conditions->last()->condition;for (int i = 0; i < conditions->length(); i++) { // Если мы дошли до нужного интервала if (conditions->at(i)->time > World::getModelTime()) {   cond = conditions->at(i)->condition;   break; }}return cond;

Листинг 2.5.2. Функция определения цвета шкалы после оптимизации.

for (int i = 0; i < conditions->length(); i++) { // Если мы дошли до нужного интервала if (conditions->at(i)->time > World::getModelTime()) {   return conditions->at(i)->condition; }}return conditions->last()->condition;

2.6.  Разработка компонентов проектной и технической документации с использованием графических языков спецификаций


Рис. 2.6.1 Общая блок-схема модуля


3. Выводы

Полученные навыки:

· Работа со структурами в Qt Creator

· Работа с базами данных в Qt Creator

· Компиляция программы в Qt Creator

· Создание баз данных в SQLite Studio

Полученные умения:

· Разработка программ в Qt Creator

· Работа с файловой системой в Qt Creator

· Работа с файлами qml

· Разработка программ на qml

4. Дневник практики

Таблица 1. Дневник практики.

Дата Содержание работ Отметка о выполнении
27.04-07.05 Оптимизация работы с базами данных. Оптимизация алгоритма.  
08.05-13.05 Замена дружественных классов на конструкцию сигналы-слоты.
14.05 Разработка системы логирования событий.
15.05 Изучение C++: тип auto и спецификатор final
16.05-17.05 Работа над взаимодействием класса World и классов устройств.
20.05-21.05 Изучение макросов в C++
27.05 Работа над условиями передачи сообщения от источника к приёмнику.
28.05 Разработка протоколов взаимодействия программных модулей.
29.05 Разработка зависимости условий передачи от временных интервалов.
30.05-31.05 Разработка многоканального приёмника
03.06-04.06 Разработка ретранслятора
05.06-06.06 Работа над взаимодействием с ПМ03
07.06 Тестирование и отладка приёмников и ретрансляторов
11.06 Работа над выводом результатов работы программы для передачи в другие модули
14.06-18.06 Тестирование и отладка программы
20.06-28.06 Составление отчета о производственной практике  

 

5. Список использованной литературы

1. Документация по классу QFile. http://doc.crossplatform.ru/qt/4.7.x/qfile.html

2. Документация по библиотеке QSqlQuery. http://doc.crossplatform.ru/qt/4.7.x/qsqlquery.html

3. Документация по классу QTextStream. http://doc.crossplatform.ru/qt/4.7.x/qtextstream.html

4. Документация по классу QTimer. https://doc.qt.io/QT-5/qtimer.html

5. Работа с конструкцией сигналы/слоты. https://habr.com/ru/post/50812/

6. Работа с SQLite. https://zametkinapolyah.ru/zametki-o-mysql/tema-12-sql-zaprosy-select-v-bazax-dannyx-sqlite.html


 

7. Приложения

Приложение 1

Рис. 6.1. Организационная структура организации.


Приложение 2

Рис.6.2 Информационная структура организации


Приложение 3

Листинг 6.1 файл abstractreceiver.cpp.

#include "abstractreceiver.h"

#include "abstractsource.h"

#include "world.h"

 

AbstractReceiver::AbstractReceiver(QSqlRecord DBRecord, QVector<AbstractSource*> *sources, QObject *parent) : BaseObject (parent)

{

// Считывание переменных из записи БД

ID = DBRecord.value(D_ID).toUInt();

Num = DBRecord.value(NUM).toUInt();

QVector<unsigned int>* seq = new QVector<unsigned int>();

QStringList seqStr = DBRecord.value(SEQUENCE).toString().split("|");

for (int i = 0; i < seqStr.length(); i++) {

   seq->push_back(seqStr.at(i).toUInt());

}

sequence = seq;

channelsNum = DBRecord.value(CHANNELS_COUNT).toInt();

n0 = DBRecord.value(N0).toString().split('|').at(World::getCurChannel()).toInt();

searchInterval = DBRecord.value(SEARCH_INTERVAL).toInt();

 

seqStr.clear();

curRadioNum = n0;

nextIntervalEnd = searchInterval;

 

deviceType = 1;

 

this->sources = sources;

 

World *w = static_cast<World*>(parent);

 

connect(w, SIGNAL(ticked()), this, SLOT(tick()));

 

start();

}

AbstractReceiver::AbstractReceiver(QSqlRecord DBRecord, QVector<AbstractSource *> *sources, int radioNum, QObject *parent) : AbstractReceiver(DBRecord, sources, parent)

{

n0 = radioNum;

curRadioNum = n0;

}

 

void AbstractReceiver::restart() {

curRadioNum = n0;

  syncing = false;

synced = false;

curCoincidenceNum = 0;

curCoincidenceSourceNum = 0;

EstimatedTimeToReceive = 0;

newSyncCicleTime = 0;

nextIntervalEnd = 0;

syncingNum = 0;

}

 

void AbstractReceiver::tick()

{

if (started) {

   if (isSynced()) {

       if (QRandomGenerator::global()->generateDouble() < double(curSrc->getFMessageSent(curSrc->getCurRepeat()))) {

           // Запись типа 4

           Log::printMessage("ПСО " + QString::number(ID) + " " + QString::number(curSrc->getK()) + " " + QString::number(World::getModelTime()));

           World::setMessageReceived(true);

 

           Log::printMessage(QString::number(World::getModelTime()), false, true, "output.txt"); // Фиксируем время получения сообщения

 

           // Завершение работы алгоритма

           started = false;

 

           emit messageReceived(); // Имитация сигнала о принятии // сообщения

 

           return;

       }

   }

 

   // Если всё время закончилось

   if (World::getModelTime() >= World::getLastWorkingInterval()) {

       if (!isSynced() && !isSyncing()) {

           // Запись типа 6

           Log::printMessage("НПС " + QString::number(ID) + " " + QString::number(World::getModelTime()));

 

           //Log::printMessage("НПС", false, true, "output.txt");

 

           // Завершение работы алгоритма

           started = false;

 

           emit messageNotReceived();

           return;

       }

   }

 

   // Если перешли за время старта синхронизации - ищем новое //время синхронизации

   if (curCoincidenceNum < World::getModelTime() && !isSyncing() && newSyncCicleTime < World::getModelTime()) {

       for (curCoincidenceNum; curCoincidenceNum < World::getLastWorkingInterval() && curCoincidenceNum < nextIntervalEnd; curCoincidenceNum++) {

           bool F = false;

           for (int k = 0; k < sources->length(); k++) {

               if (sequence->at(int(curRadioNum)) == sources->at(k)->getK()) {

                   curCoincidenceNum++;

                   curCoincidenceSourceNum = k;

                   // Запись типа 1

                   Log::printMessage("НС " + QString::number(ID) + " " + QString::number(sources->at(k)->getK()) + " " + QString::number(curCoincidenceNum));

                   World::setSyncCancelledTime(curCoincidenceNum + sources->at(k)->getMaxSearchTime());

                   setSyncing(true);

                   F = true;

                   syncingNum = curRadioNum;

                   break;

               }

           }

           if (F) break;

       }

   }

 

   // Если попытка синхронизации началась

   if (isSyncing() && !isSynced() && curCoincidenceNum <= World::getModelTime()) {

       // Разыгрываем вероятность синхронизации

       AbstractSource* curSource = sources->at(getCurCoincidenceSourceNum());

       if (curSource->isStarted()) {

           if (QRandomGenerator::global()->generateDouble() < double(curSource->getMaxSyncProbability())) {

               // Запись типа 2

               Log::printMessage("УС " + QString::number(ID) + " " + QString::number(sequence->at(int(syncingNum))) + " " + QString::number(World::getSyncCancelledTime()));

 

               // Имитация сигнала об успешной синхронизации

               emit syncSuccess();

 

               SyncedCalcs(sources);

 

               setSynced(true);

               World::setSyncedOnce(true);

               World::setModelTime(World::getSyncCancelledTime());

               curCoincidenceNum = World::getModelTime();

           }

           else {

               notSynced();

           }

       }

       else if (World::getModelTime() >= World::getSyncCancelledTime()) {

           notSynced();

       }

   }

 

   // Переход к следующим радиоданным

   if (World::getModelTime() >= nextIntervalEnd) {

       if (!syncing) { // Если идёт синхронизация - не меняем радиоданные

           for (int i = 0; i < channelsNum; i++) {

               if (curRadioNum + 1 >= sequence->length()) {

                   curRadioNum = 0;

               }

               else {

                   curRadioNum++;

               }

           }

       }

       nextIntervalEnd += searchInterval;

   }

}

}

 

void AbstractReceiver::notSynced() {

// Запись типа 3

Log::printMessage("НУС " + QString::number(ID) + " " + QString::number(sequence->at(int(syncingNum))) + " " + QString::number(World::getSyncCancelledTime()));

setSyncing(false);

newSyncCicleTime = World::getSyncCancelledTime() + searchInterval;

curCoincidenceNum = newSyncCicleTime;

 

// имитация сигнала об ошибке синхронизации

emit syncFailed();

}

 

void AbstractReceiver::SyncedCalcs(QVector<AbstractSource*> *sources) {

AbstractSource* src = sources->at(curCoincidenceSourceNum);

curSrc = src;

int time1 = src->getBrokenTime();

int time2 = src->getStartTime() + src->getMaxRepeatCount() * src->getRepeatDuration();

 

if (time1 < time2) {

   EstimatedTimeToReceive = time1 - World::getSyncCancelledTime();

  }

else {

   EstimatedTimeToReceive = time2 - World::getSyncCancelledTime();

}

}


Приложение 4

Листинг 6.2 файл abstractsource.cpp.

#include "abstractsource.h"

#include "econdition.h"

#include "world.h"

#include "retranslator.h"

 

AbstractSource::AbstractSource(QSqlRecord DBRecord, QObject *parent) : BaseObject (parent)

{

// Считывание переменных из записи БД

ID = DBRecord.value(D_ID).toUInt();

k = DBRecord.value(K).toUInt();

// Парсим строку, в которой находится таблица временных интервалов

conditions = new QVector<TimeInterval*>();

QStringList strLst = DBRecord.value(CONDITION).toString().split('|');

for (int i = 0; i < strLst.length(); i++) {

   QStringList recordStrLst = strLst[i].split(';');

   conditions->append(new TimeInterval {recordStrLst[0].toInt(), ECondition(recordStrLst[1].toInt())});

}

Number = DBRecord.value(NUMBER).toUInt();

Ak = DBRecord.value(AK).toFloat();

Bk = DBRecord.value(BK).toFloat();

startTime = DBRecord.value(START_TIME).toInt();

repeatDuration = DBRecord.value(REPEAT_DURATION).toInt();

maxRepeatCount = DBRecord.value(MAX_REPEAT_COUNT).toInt();

// Парсим строку, в которой находится таблица распределения

strLst = DBRecord.value(F_MESSAGE_SENT).toString().split('|');

for (int i = 0; i < 99 && i < strLst.length(); i++) {

   QStringList recordStrLst = strLst[i].split(';');

   for (int j = 0; j < conditionCount; j++) {

       FMessageSent[i][j] = recordStrLst[j].toFloat();

   }

}

brokenTime = DBRecord.value(BROKEN_TIME).toInt();

maxSearchTime = DBRecord.value(MAX_SEARCH_TIME).toInt();

// Парсим строку со значениями вероятности синхронизации с источником

strLst = DBRecord.value(MAX_SYNC_PROBABILITY).toString().split('|');

for (int i = 0; i < conditionCount && i < strLst.length(); i++) {

   maxSyncProbability[i] = strLst[i].toFloat();

}

 

deviceType = 0;

 

syncCancelledTime = startTime + maxSearchTime;

 

World *w = static_cast<World*>(parent);

 

if (w) {

   connect(w, SIGNAL(ticked()), this, SLOT(tick()));

}

else if (Retranslator *r = static_cast<Retranslator*>(parent)) {

   connect(r, SIGNAL(ticked()), this, SLOT(tick()));

}

}

 

void AbstractSource::restart() {

curRepeat = 0;

sending = false;

stop();

}

 

AbstractSource::~AbstractSource() {}

 

ECondition AbstractSource::getCondition(int time)

{

for (int i = 0; i < conditions->length(); i++) {

   if (conditions->at(i)->time > time) { // Если мы дошли до нужного интервала

       return conditions->at(i)->condition;

   }

}

return conditions->last()->condition;

}

 

ECondition AbstractSource::getCondition()

{

for (int i = 0; i < conditions->length(); i++) {

   if (conditions->at(i)->time > World::getModelTime()) { // Если // мы дошли до нужного интервала

       return conditions->at(i)->condition;

   }

}

return conditions->last()->condition;

}

 

void AbstractSource::tick()

{

if (started) {

   // Если время синхронизации вышло - заканчиваем её

   if (syncCancelledTime > World::getModelTime()) {

       sending = false;

       curRepeat = 0;

   }

   // Иначе - инкремент повтора

   else if (startTime <= World::getModelTime()) {

       sending = true;

       curRepeat++;

   }

   if (World::getModelTime() >= brokenTime) {

       stop();

       emit workStopped();

   }

}

else if (startTime != -1 && World::getModelTime() > startTime && World::getModelTime() < brokenTime) {

   start();

}

}


Приложение 5

Листинг 6.3 файл world.cpp.

#include "world.h"

#include "abstractreceiver.h"

#include "abstractsource.h"

#include "retranslator.h"

 

int World::modelTime = 1;

bool World::syncedOnce = false;

bool World::messageReceived = false;

int World::lastWorkingInterval = 0;

int World::syncCancelled = 0;

int World::curChannel = 0;

 

World::World()

{

// Подключение к БД

db = new Database();

 

db->connectToDataBase("Data.db");

 

QSqlQuery *qry = new QSqlQuery();

sources = new QVector<AbstractSource*>();

 

radioNums = new QVector<int>();

 

qry->prepare("SELECT * FROM DEVICES");

qry->exec();

while (qry->next()) {

   if (qry->value(DEVICE_TYPE).toInt() == 1) { // тип устройства // - приёмник

       receiver = new AbstractReceiver(qry->record(), sources, this);

       QStringList lst = qry->value(N0).toString().split("|");

       for (int i = 0; i < lst.length(); i++) {

           radioNums->append(lst.at(i).toInt());

       }

   }

   else if (qry->value(DEVICE_TYPE).toInt() == 0) { // источник

       AbstractSource *newSrc = new AbstractSource(qry->record(), this);

       sources->push_back(newSrc);

 

       if (newSrc->getSyncCancelledTime() > getLastWorkingInterval()) {

           setLastWorkingInterval(int(newSrc->getBrokenTime()));

       }

   }

   else { // ретранслятор

       Retranslator *newSrc = new Retranslator(qry->record(), sources, this);

       sources->push_back(newSrc->getSource());

 

       if (newSrc->getSource()->getSyncCancelledTime() > getLastWorkingInterval()) {

           setLastWorkingInterval(int(newSrc->getSource()->getBrokenTime()));

       }

   }

}

 

// Инициализация тик-таймера

thread = new QThread();

this->moveToThread(thread);

timer = new QTimer();

timer->setInterval(worldDeltaSeconds);

connect(timer, SIGNAL(timeout()), this, SLOT(worldTick()));

timer->moveToThread(thread);

thread->start();

QMetaObject::invokeMethod(this, "startTimer", Qt::QueuedConnection);

//Log::CleanLogFile();

//Log::CleanLogFile("output.txt");

 

// Старт модели

modelStart();

 

connect(receiver, SIGNAL(messageReceived()), this, SLOT(messageReceivedSlot())); // Должен коннектить не только приёмник

connect(receiver, SIGNAL(messageNotReceived()), this, SLOT(messageNotReceivedSlot()));

 

receiveTime = new QVector<int>();

curChannel = 1;

}

 

World::World(QStringList *IDs, QVector<int>* radioNum, int modelTime)

{

// Подключение к БД

db = new Database();

 

db->connectToDataBase("Data.db");

 

QSqlQuery *qry = new QSqlQuery();

sources = new QVector<AbstractSource*>();

 

qry->prepare("SELECT * FROM DEVICES");

qry->exec();

 

QSqlRecord receiverRecord;

 

while (qry->next()) {

   if (IDs->contains(qry->value(D_ID).toString())) {

       if (qry->value(DEVICE_TYPE).toInt() == 1 || qry->value(D_ID) == IDs->last()) {

           receiverRecord = qry->record();

       }

       else if (qry->value(DEVICE_TYPE).toInt() == 0) { // источник

           AbstractSource *newSrc = new AbstractSource(qry->record(), this);

           sources->push_back(newSrc);

 

           if (newSrc->getSyncCancelledTime() > getLastWorkingInterval()) {

               setLastWorkingInterval(int(newSrc->getBrokenTime()));

           }

       }

        else { // ретранслятор

           Retranslator *newSrc = new Retranslator(qry->record(), sources, this);

           sources->push_back(newSrc->getSource());

 

 

           connect(newSrc->getReceiver(), SIGNAL(messageReceived()), this, SLOT(messageReceivedSlot()));

           connect(newSrc->getReceiver(), SIGNAL(messageNotReceived()), this, SLOT(messageNotReceivedSlot()));

 

           if (newSrc->getSource()->getSyncCancelledTime() > getLastWorkingInterval()) {

               setLastWorkingInterval(int(newSrc->getSource()->getBrokenTime()));

           }

       }

   }

}

 

AbstractSource* F = nullptr;

for(int i = 0; i < sources->length(); i++) {

   if (sources->at(i)->getID() == receiverRecord.value(D_ID)) {

       F = sources->at(i);

       break;

   }

}

if (F == nullptr) {

   receiver = new AbstractReceiver(receiverRecord, sources, radioNum->at(0), this);

}

else {

   receiver = static_cast<Retranslator*>(F->parent())->getReceiver();

}

 

// Инициализация тик-таймера

thread = new QThread();

this->moveToThread(thread);

timer = new QTimer();

timer->setInterval(worldDeltaSeconds);

connect(timer, SIGNAL(timeout()), this, SLOT(worldTick()));

timer->moveToThread(thread);

thread->start();

QMetaObject::invokeMethod(this, "startTimer", Qt::QueuedConnection);

//Log::CleanLogFile();

//Log::CleanLogFile("output.txt");

 

this->modelTime = modelTime;

 

  // Старт модели

modelStart();

 

connect(receiver, SIGNAL(messageReceived()), this, SLOT(messageReceivedSlot())); // Должен коннектить не только приёмник

connect(receiver, SIGNAL(messageNotReceived()), this, SLOT(messageNotReceivedSlot()));

 

  receiveTime = new QVector<int>();

curChannel = 1;

radioNums = radioNum;

}

 

void World::messageReceivedSlot() {

receiveTime->append(getModelTime());

if (curChannel < receiver->getChannelsNum()) {

   modelRestart();

   curChannel++;

}

else {

   // calcMinTime();

}

}

 

void World::messageNotReceivedSlot() {

if (curChannel < receiver->getChannelsNum()) {

   modelRestart();

}

else {

   // calcMinTime();

}

}

 

void World::calcMinTime() {

Log::CleanLogFile("output.txt");

if (receiveTime->length() > 0) {

   int n = receiveTime->at(0);

   for (int i = 1; i < receiveTime->length(); i++) {

       if (receiveTime->at(i) < n) {

           n = receiveTime->at(i);

       }

   }

   Log::printMessage(QString::number(n), false, true, "output.txt");

}

QApplication::exit();

}

 

void World::startTimer() {

timer->start();

}

 

World::~World() {

 

}

 

void World::modelStart()

{

started = true;

}

 

void World::modelRestart()

{

started = true;

setModelTime(0);

receiver->setN0(radioNums->at(curChannel));

receiver->restart();

receiver->start();

for (int i = 0; i < sources->length(); i++) {

   sources->at(i)->restart();

}

messageReceived = false;

}

 

void World::worldTick() {

if (started) {

   // Добавление времени модели

   World::modelTime += 1;

   emit ticked();

 

   for (int i = 0; i < sources->length(); i++) {

       if (sources->at(i)->isStarted()) {

           return;

       }

   }

   if (modelTime > lastWorkingInterval) {

       started = false;

   }

}

else {

   calcMinTime();

   QApplication::exit();

}

}

 

int World::getSyncedOnce() { return syncedOnce; }

void World::setSyncedOnce(bool b) { syncedOnce = b; }

 

int World::getMessageReceived() { return messageReceived; }

void World::setMessageReceived(bool b) { messageReceived = b; }

 

int World::getLastWorkingInterval() { return lastWorkingInterval; }

void World::setLastWorkingInterval(int num) { lastWorkingInterval = num; }

 

int World::getSyncCancelledTime() { return syncCancelled; }

void World::setSyncCancelledTime(int time) { syncCancelled = time; }


 

Приложение 6

Листинг 6.4 файл retranslator.cpp.

#include "retranslator.h"

#include "world.h"

 

Retranslator::Retranslator(QSqlRecord DBRecord, QVector<AbstractSource*> *sources, QObject *parent) : BaseObject (parent)

{

// Читаем из базы

ID = DBRecord.value(D_ID).toUInt();

source = new AbstractSource(DBRecord, this);

receiver = new AbstractReceiver(DBRecord, sources, parent);

 

source->setStartTime(-1);

deviceType = 2;

 

// Подключаем к паренту

World *w = static_cast<World*>(parent);

connect(w, SIGNAL(ticked()), this, SLOT(tick()));

 

connect(receiver, SIGNAL(workStopped()), this, SLOT(receiverStopped()));

connect(receiver, SIGNAL(messageReceived()), this, SLOT(received()));

 

start();

}

 

void Retranslator::tick()

{

if (!this->receiver->isStarted()) {

   if (!this->source->isStarted() && mReceived && World::getModelTime() >= repeatTime) {

       this->source->start();

   }

}

emit ticked();

}

 

void Retranslator::receiverStopped()

{

if (mReceived) {

    repeatTime = World::getModelTime() + repeatDelay;

}

else {

   stop();

}

}

 

void Retranslator::received()

{

mReceived = true;

}

 

void Retranslator::restart() {

source->restart();

receiver->restart();

}


 

Приложение 7

Листинг 6.5 файл log.cpp.

#include "log.h"

#include <QDebug>

#include <QTextStream>

 

void Log::CleanLogFile(QString fileName)

{

// Очистка файла

QFile file(fileName);

file.open(QIODevice::WriteOnly | QIODevice::Text);

file.close();

}

 

void Log::printMessage(QString message, bool consolePrint, bool logFilePrint, QString fileName)

{

// Вывод в дебаг консоли

if (consolePrint) {

   qDebug() << message;

}

// Вывод в файл

if (logFilePrint) {

   QFile file(fileName);

  if (!file.open(QIODevice::Append | QIODevice::Text))

       return;

 

   QTextStream out(&file);

   out << message << "\n";

   file.close();

}

}


 

Приложение 8

Листинг 6.6 файл baseobject.cpp.

#include "baseobject.h"

 

BaseObject::BaseObject(QObject *parent) : QObject(parent)

{

 

}

 

void BaseObject::start() {

if (!started) {

   started = true;

         emit workStarted();

}

}

 

void BaseObject::stop() {

if (started) {

   started = false;

         emit workStopped();

}

}

 

void BaseObject::restart() {}


 

Приложение 9

Листинг 6.7 файл database.cpp.

#include "database.h"

 

Database::Database(QObject *parent) : QObject(parent) { }

 

Database::~Database()

{

// при закрытии программы и уничтожении

// этого класса закрываем базу данных

closeDataBase();

}

 

// Подключение к БД

void Database::connectToDataBase(QString dbName)

{

// Сохраняем путь и имя базы

DataBaseName = dbName;

// Проверка на существование базы

if(!QFile(dbName).exists()){ // если база данных не существует - создаём новую

   this->restoreDataBase();

} else { // иначе открываем существующую

   this->openDataBase();

}

}

 

// Функция для восстановления базы

bool Database::restoreDataBase()

{

if(this->openDataBase()){ // Если БД открыта

   if(!this->createDeviceTable()){ // если таблица в базе данных // не была создана после вызова createDeviceTable()

       return false;

   } else {

       return true;

   }

} else { // если бд не была открыта

   return false;

}

return false; // в любом другом случае возвращаем false

}

 

// Функция для открытия БД

bool Database::openDataBase()

{

db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName(DataBaseName);

if(db.open()){ // если таблица успешно открыта - сообщаем об этом

   return true;

} else {

   return false; // иначе сообщаем, что нам не удалось ее открыть

}

}

 

// Функция для закрытия базы

void Database::closeDataBase()

{

db.close();

}

 

// Функция для создания таблиц в базе данных

bool Database::createDeviceTable()

{

// Создание таблиц через SQL запрос

QSqlQuery query;

if(!query.exec( "CREATE TABLE " TABLE_SOURCE " ("

                   K                  " INTEGER  NOT NULL UNIQUE PRIMARY KEY CHECK (N <= 99),"

                   CONDITION          " INTEGER (3) NOT NULL CHECK (Condition <= 3),"

                   NUMBER             " INTEGER  NOT NULL,"

                   AK                 " DOUBLE   NOT NULL,"

                   BK                 " DOUBLE (360) NOT NULL CHECK (Bk <= 360),"

                   START_TIME         " TIME     NOT NULL,"

                   REPEAT_DURATION    " INTEGER  NOT NULL,"

                   MAX_REPEAT_COUNT   " INTEGER (99) NOT NULL CHECK (Maxr <= 99),"

                   F_MESSAGE_SENT     " TEXT     NOT NULL,"

                   BROKEN_TIME        " INTEGER  NOT NULL,"

                   MAX_SEARCH_TIME    " INTEGER  NOT NULL,"

                   MAX_SYNC_PROBABILITY " STRING   NOT NULL,"

                   MAX_WAIT_TIME      " INTEGER  NOT NULL,"

                   F_SYNC_LOST        " TEXT     NOT NULL"

               " );") || !query.exec("CREATE TABLE " TABLE_RECEIVER " ("

                   NUM                " INTEGER     NOT NULL UNIQUE PRIMARY KEY CHECK (N <= 99),"

                   SEQUENCE           " INTEGER  NOT NULL,"

                   N0                 " INTEGER  NOT NULL"

               ");")) {

   return false; // возвращаем false если таблица не создана

} else {

   return true; // если создана возвращаем true

}

return false; // в любом другом случае возвращаем false

}


Дата добавления: 2021-07-19; просмотров: 47; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!