Тестирование программного модуля
Тестирование программы с использованием входных данных из базы данных (Рис.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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!