Uploaded by Sergei Stankevich

Информационная система для отображения статистики телефонных соединений

advertisement
Министерство образования Республики Беларусь
Учреждение образования «Витебский государственный университет имени П. М. Машерова»
Институт повышения квалификации и переподготовки кадров
Факультет переподготовки кадров
КУРСОВАЯ РАБОТА
по дисциплине «Средства визуального программирования приложений»
ИНФОРМАЦИОННАЯ СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ
ТЕЛЕФОННЫХ СОЕДИНЕНИЙ
Выполнил:
Станкевич Сергей Михайлович,
специальность 1-40 01 73 «Программное
обеспечение информационных систем»,
группа Пм-21
Руководитель:
Сергеенко Сергей Владимирович,
старший преподаватель
Витебск, 2016
Содержание
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
База данных телефонных соединений . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.1
Описание предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2
Схема данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3
Краткая характеристика используемой СУБД . . . . . . . . . . . . . . . . . . .
8
Клиентская часть информационной системы . . . . . . . . . . . . . . . . . . . . .
10
2.1
Проектирование клиентской части информационной системы . . . . . . . . . .
10
2.2
Краткая характеристика используемых инструментов разработки . . . . . . . .
12
2.3
Программирование клиентской части информационной системы . . . . . . . .
14
Работа с информационной системой . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.1
Установка и настройка серверной части . . . . . . . . . . . . . . . . . . . . . .
25
3.2
Установка и настройка клиентской части . . . . . . . . . . . . . . . . . . . . . .
26
3.3
Использование информационной системы . . . . . . . . . . . . . . . . . . . . .
27
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
Список использованных источников . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
Приложение А Код SQL для создания базы данных smdr . . . . . . . . . . . . . . . .
33
Приложение Б Исходные коды приложения SMDR Viewer . . . . . . . . . . . . . . .
35
Б.1 Файл wx_testApp.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
Б.2 Файл wx_testApp.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
Б.3 Файл wx_testMain.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Б.4 Файл wx_testMain.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
Б.5 Файл dbDriver.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
Б.6 Файл dbDriver.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
Б.7 Файл dlgConnect.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
Б.8 Файл dlgConnect.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
Б.9 Файл dlgTables.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
Б.10 Файл dlgTables.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
Б.11 Файл dlgFilter.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
Б.12 Файл dlgFilter.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
Б.13 Файл version.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
1
2
3
Реферат
Курсовая работа: 64 с., 12 рис., 20 источников, 2 приложения.
ИНФОРМАЦИОННАЯ СИСТЕМА, ТЕЛЕФОННОЕ СОЕДИНЕНИЕ, АТС, СТАТИСТИКА
ТЕЛЕФОННЫХ СОЕДИНЕНИЙ, ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ, БАЗА ДАННЫХ,
Объект исследования –– автоматическая телефонная станция офисного типа LG LDK–300.
Предмет исследования –– детальное протоколирование телефонных соединений.
Цель работы –– систематизация знаний и получение первоначального опыта проектирования
баз данных и приложений для обработки данных.
Методы исследования: информационно-аналитический.
Теоретическая и практическая значимость: результаты работы будут применяться в разработке
новой версии автоматизированной информационно-аналитической системы «Электронный университет» учреждения образования «Витебский государственный университет имени П. М. Машерова».
Введение
Целью данной работы является систематизация знаний и получение первоначального опыта
проектирования баз данных и приложений для обработки данных.
Актуальность работы вытекает из ее целей. Выполнение данной работы позволит всесторонне
изучить процесс организации баз данных, разобраться в принципах работы современных СУБД,
освоить основы проектирования программных средств для взаимодействия с СУБД.
Для достижения поставленной цели необходимо решить следующие задачи:
– изучить и проанализировать с точки зрения эффективности автоматизации предметную область;
– выбрать систему управления для реализации базы данных;
– спроектировать структуру базы данных в рамках выбранной СУБД;
– выбрать средства разработки для реализации информационной системы;
– спроектировать клиентскую часть информационной системы (приложение для работы с базой данных);
– заполнить базу корректными данными;
– описать и выполнить контрольные примеры, демонстрирующие работоспособность информационной базы и приложения;
– описать процесс установки, настойки и использования разработанного приложения.
3
1
1.1
База данных телефонных соединений
Описание предметной области
В процессе работы телекоммуникационного оборудования часто возникает задача расчета стоимости телефонных разговоров, отображения суммарного времени телефонных соединений, выбор
статистики по конкретному абоненту и т. д. Для решения такого класса задач автоматические телефонные станции (АТС) офисного типа используют детальное протоколирование телефонных соединений (англ. Station Messaging Detail Record, SMDR).
Практически любая современная офисная АТС в том или ином виде предлагает SMDR-сервис
для получения информации о каждом соединении. Вид этой информации и степень её детализации
зависят от типа телекоммуникационного оборудования (модели изделия, его прошивки) и конкретных настроек. Как правило, для каждого состоявшегося звонка SMDR-информация содержит номера
вызывающего и вызываемого абонентов, длительность соединения, время его окончания (по часам
АТС) и другую сопроводительную информацию.
Далее программа тарификации на основе полученных SMDR-данных формирует счета на оплату телефонных переговоров, рассчитывает степень загруженности линий и операторов, активности
абонентов и т. д.
Для выполнения данной работы в процессе изучения курса «Организация и проектирование
баз данных» авторами была проанализирована предметная область с условным названием «Автоматическая телефонная станция организации (учреждения)».
В организации (учреждении) существуют определенные подразделения. Каждое подразделение имеет внутренний трехзначный телефонный номер. Посредством этого номера совершаются телефонные вызовы внутри организации.
Каждый внутренний номер присоединен к определенной телефонной линии, что позволяет совершать вызовы за пределы организации. Один номер может быть присоединен к нескольким линиям. В этом случае для совершения исходящего вызова автоматическая телефонная станция (АТС)
выбирает первую свободную линию.
Входящие и исходящие вызовы регистрируются на АТС и для каждого из них записывается
определённая информация: порядковый номер вызова, номер принимающего абонента, номер линии,
по которой был совершен вызов, время окончания вызова, длительность вызова, дату совершения
вызова, тип вызова, исходящий номер.
4
1.2
Схема данных
Для удобства дальнейшего изложения введем некоторые определения согласно ГОСТ 34.321–
96. «Информационные технологии. Система стандартов по базам данных. Эталонная модель управления данными» [1].
Информационная система –– это система, которая организует процессы сбора, хранения и обработки информации о проблемной области. Она может быть размещена на одной или нескольких
компьютерных системах (в этом случае она называется распределенной).
Данные поступают в информационную систему и исключаются из нее, и эти взаимодействия
могут осуществляться или людьми, или процессами.
Постоянные данные –– это данные, которые хранятся в информационной системе в течение
определенного периода времени. Система, которая выполняет функцию организации и управления
постоянными данными, называется системой управления данными.
Постоянные данные в среде базы данных заключают в себе схему и базу данных. Схема ––
это описания содержания, структуры и ограничения целостности, используемые для создания базы
данных. База данных –– это набор постоянных данных, определенных с помощью схемы.
Система управления данными использует определения данных в схеме, чтобы предоставлять
возможность доступа и управлять доступом к данным в базе данных.
Независимость данных –– это независимость процессов от объектов данных, которая состоит в
том, что объекты данных могут быть изменены без нарушения процессов.
Процесс управления данными может быть вызван пользователем, процессами управления данными или другими процессами. Процессы выполняются процессорами, каждый из которых имеет
интерфейс. Интерфейс процессора должен быть точно определен. Такие интерфейсы могут быть
независимыми от стандартного языка программирования, используемого для определения процесса с использованием интерфейса.
В данной работе в процессе проектирования базы данных решались следующие задачи:
1. Выделение основных абстракций (сущность, атрибут, связь) в предметной области и определение их параметров.
2. Проработка списка возможных запросов к базе данных на основе анализа предметной области.
3. Построение концептуальной модели в виде ER-диаграммы.
4. Представление концептуальной модели в терминах реляционной.
5. Описание допустимых множеств значений, которые могут принимать атрибуты (доменов),
определение типов соответствующих данных и их характеристик.
6. Определение первичных и внешних ключей.
7. Определение функциональных зависимостей (исходя из возможных значения полей каждой
таблицы) и приведение полученной концептуальной модели к третьей нормальной форме.
В результате решения вышеуказанных задач была разработана схема (рисунок 1.1) и создана
база данных, хранящая данные о совершенных телефонных звонках. Она включает следующие таблицы.
5
Рисунок 1.1 –– Схема данных
1. Таблица depts. В таблице хранятся данные о подразделениях организации: номер, название
подразделения, закрепленный номер телефона, номер помещения.
MariaDB [smdr]> desc depts;
+-------------+--------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id
| int(11)
| NO
| PRI | 0
|
|
| sta
| int(11)
| NO
|
| 0
|
|
| caption
| varchar(128) | YES
|
| NULL
|
|
| room
| varchar(5)
| YES
|
| NULL
|
|
| NO
| MUL | 0
|
|
| building_id | int(11)
+-------------+--------------+------+-----+---------+-------+
Поле building_id является внешним ключом, связывается с полем id таблицы buildings.
2. Таблица buildings. В таблице хранятся данные об адресах подразделений организации:
номер корпуса, название корпуса, почтовый адрес.
MariaDB [smdr]> desc buildings;
+---------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id
| int(11)
| NO
| PRI | 0
|
|
| caption | varchar(50) | YES
|
| NULL
|
|
| address | varchar(50) | YES
|
| NULL
|
|
+---------+-------------+------+-----+---------+-------+
6
3. Таблица calltype. В таблице хранятся данные о возможных типах совершаемых телефонных звонков: аббревиатура, описание.
MariaDB [smdr]> desc calltype;
+---------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| letter
| char(1)
| NO
| PRI | I
|
|
|
|
|
| caption | varchar(18) | YES
| NULL
+---------+-------------+------+-----+---------+-------+
4. Таблица calls. В таблице хранятся данные о совершенных звонках: номер телефона и номер линии вызывающего абонента, дата, время окончания и длительность вызова, исходящий номер
абонента.
MariaDB [smdr]> desc calls;
+-----------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id
| int(11)
| NO
| PRI | 0
|
|
| sta
| int(11)
| YES
|
| NULL
|
|
| co
| int(11)
| YES
|
| NULL
|
|
| clong
| time
| YES
|
| NULL
|
|
| ctime
| time
| YES
|
| NULL
|
|
| cdate
| date
| YES
|
| NULL
|
|
| NO
| MUL | I
|
|
| letter_id | char(1)
| onum
| varchar(25) | NO
|
| NULL
|
|
| dept_id
| int(11)
| MUL | NULL
|
|
| YES
+-----------+-------------+------+-----+---------+-------+
Поле letter_id является внешним ключом, связывается с полем letter таблицы calltype. Поле
dept_id является внешним ключом, связывается с полем id таблицы depts.
Полный код операторов SQL, необходимых для создания базы данных, приведен в приложении А.
7
1.3
Краткая характеристика используемой СУБД
СУБД MariaDB. MariaDB –– ответвление от системы управления базами данных MySQL,
разрабатываемое сообществом под лицензией GNU GPL. Разработку и поддержку MariaDB осуществляет компания MariaDB Corporation Ab и фонд MariaDB Foundation [10].
В дополнении к стандартным механизмам хранения данных, –– MyISAM, Blackhole, CSV,
Memory, и Archive, РСУБД MariaDB содержит следующие способы хранения данных [11]:
– Aria.
– XtraDB (прозрачная замена InnoDB).
– PBXT (Доступно в MariaDB 5.1, 5.2 и 5.3. Не поддерживается с версии 5.5).
– FederatedX (прозрачная замена Federated).
– OQGRAPH — с версии 5.2.
– SphinxSE — с версии 5.2.
– IBMDB2I. Компания Oracle убрала поддержку этого механизма хранения данных, начиная с
версии MySQL 5.1.55, но исходный код сохранен в MariaDB до версии 5.5.
– TokuDB.
– Cassandra (MariaDB 10.0).
– CONNECT (MariaDB 10.0).
– SEQUENCE (MariaDB 10.0).
– Spider (MariaDB 10.0).
Улучшена безопасная и быстрая репликация: групповое завершение(commit) записи для лога
транзакций (binary log). Данное новшество позволяет получить двухкратный прирост производительности для инсталляций, использующих репликацию.
Улучшена подсистема асинхронного ввода/вывода для механизма хранения данных InnoDB в
операционных системах семейства Windows.
Индексы для механизма хранения данных MEMORY (HEAP) теперь еще быстрее. Тесты производительности подтверждают 24% рост производительности на операциях вставки (INSERT) данных
для целочисленных (integer) индексов, а так же 60% рост производительности для индексов с использованием символьных (CHAR) типов данных.
Улучшения в работе CHECKSUM TABLE. Улучшена производительность перекодировки символов (и удалили перекодировку в случаях, когда она на самом деле не нужна). Общий выигрыш
производительности достигает 1–5% (по данным mysqlbench), однако, на больших объемах данных
выигрыш может быть более существенным для символов, находящихся в промежутке 0x00–0x7f.
Пул потоков в MariaDB 5.1 и еще более оптимизированный вариант в MariaDB 5.5. Пул потоков позволяет эффективно использовать MariaDB в задачах с большим числом активных соединений
(более 200000) без снижения производительности.
Оптимизация отладочного кода MariaDB. Собранная с поддержкой отладочной информации
версия может работать быстро, даже если этот функционал не используется.
Использование механизма хранения данных Aria (ранее Maria) позволяет выполнять комплексные запросы без использования временных таблиц, создаваемых на устройствах хранения
8
(HDD/SSD/SAS/FC) за счет агрессивных методов кеширования в оперативной памяти. По умолчанию этот механизм хранения включен в состав MariaDB начиная с версии 5.1 и является производительным аналогом MyISAM.
Улучшено тестирование. Набор тестов значительно переработан и расширен, а время выполнения уменьшено.
Больше тестов в тестовых сериях. Ошибки в исходном коде устраняются при тестировании.
Убраны некоторые серии тестов (например, нет необходимости тестировать некий функционал, если
этот функционал нигде не используется в тестируемой версии).
Весь исходный код MariaDB распространяется под лицензиями GPL, LPGL или BSD. MariaDB
не содержит закрытых модулей или компонентов, на подобие тех, что содержатся в Mysql Enterprise
Edition. Однако, это не влияет на доступный функционал MariaDB. Все технологии, существующие
в закрытой версии MySQL 5.5 Enterprise Edition, в полном объеме представлены и в MariaDB.
MariaDB включает тестовые пакеты для всех исправленных ошибок в исходном коде. Компания
Oracle в свою очередь не представляет подобных тестовых пакетов для для своих версий продуктов,
например, MySQL 5.5. Все планы развития доступны всем желающим.
MariaDB разрабатывается open source сообществом.
MySQL Workbench. Приложение MySQL Workbench –– это унифицированный инструмент визуального моделирования для разработчиков и администраторов баз данных. Оно обеспечивает полный набор средств для моделирование данных, написания запросов на языке SQL, конфигурирования баз данных, администрирования серверов баз данных и пользователей, резервного
копирования и многого другого. Версии приложения MySQL Workbench доступны для операционных систем Microsoft Windows, Linux и MacOS X [20].
С помощью приложения MySQL Workbench разработчик баз данных может визуально разрабатывать сложных ER-модели, создавать базы данных и управлять ими. Приложение MySQL
Workbench предоставляет ключевые возможности для выполнения сложных задач управления изменениями и документирования, которые обычно требуют значительного времени и усилий.
В состав приложения MySQL Workbench включены инструменты для визуального создания,
выполнения и оптимизации запросов SQL. Редактор SQL обеспечивает цветовую подсветку синтаксиса, автоматическое заполнение, повторное использование фрагментов и историю выполнения
SQL-запросов. Обозреватель объектов обеспечивает быстрый доступ к схемам баз данных и объектов.
Визуальные средства для управления средой MySQL, включенные в приложение MySQL
Workbench, могут использоваться разработчиками и администраторами баз данных для настройки
сервера баз данных, администрирования пользователей, выполнения операций резервного копирования и восстановления, проверки данных аудита и просмотра журнала производительности.
Приложение MySQL Workbench имеет набор средств для повышения производительности
приложений на основе MySQL. Администратор может быстро просмотреть ключевые показатели
эффективности с помощью специальной панели индикаторов. Отчеты о производительности обеспечивают простую идентификацию и доступ к входным и выходным хотспотам.
9
2
Клиентская часть информационной системы
2.1
Проектирование клиентской части информационной системы
Приложение для просмотра статистики телефонных вызовов SMDR Viewer (клиентская часть
информационной системы) разрабатывалось с учетом следующих основных требований:
– установка и развертывание приложения должны быть максимально просты;
– графический интерфейс должен быть интуитивно понятен даже для пользователя, владеющего только первоначальными навыками работы в среде ОС Microsoft Windows.
Концептуально в составе приложения SMDR Viewer можно выделить следующие модули.
1. Главная форма (рисунок 2.1). Служит для отображения информации в процессе работы приложения. Содержит инструменты (меню и панель инструментов) для управления приложением.
Рисунок 2.1 –– Главная форма
2. Модуль подключения к базе данных (рисунок 2.2). Здесь определяются параметры соединения (хост, порт) и проводится аутентификация пользователя (запрашиваются имя пользователя
и пароль).
Рисунок 2.2 –– Форма модуля подключения к базе данных
10
3. Модуль отображения таблиц базы данных (рисунок 2.3). Здесь происходит обращение к базе
данных посредством специально сформированного запроса SQL. Пользователь может выбрать нужную таблицу в сформированном списке для последующего отображения ее содержимого на главной
форме.
Рисунок 2.3 –– Форма модуля выбора таблицы для отображения
4. Модуль фильтрации данных (рисунок 2.4). Этот модуль позволяет задать критерии отбора
показываемых на главной форме данных.
Рисунок 2.4 –– Форма модуля задания критериев отбора данных
Все модули связываются между собой посредством драйвера СУБД, написанного с использованием инструмента MariaDB Connector/C, который посредством специальных функций предоставляет
доступ к серверу баз данных.
11
2.2
Краткая характеристика используемых инструментов разработки
В процессе создания приложения SMDR Viewer были использованы следующие инструменты.
IDE Code::Blocks 16.01.
Интегрированная среда разработки Code::Blocks –– свободная
кроссплатформенная среда разработки. Code::Blocks написана на С++ и использует библиотеку
wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей.
Поддерживает языки программирования С, С++, D (с ограничениями), Fortran [12].
Среда разрабатывается для Windows, Linux и Mac OS X. Ее можно собрать из исходников практически под любую Unix-подобную систему, например FreeBSD.
Среда Code::Blocks поддерживает многие компиляторы (MinGW/GCC, Intel C++ compiler,
Clang и другие), многопрофильные проекты, рабочие пространста, импорт проектов Dev-C++, импорт проектов и рабочих пространств Microsoft Visual Studio.
Интерфейс среды поддерживает подсветку синтаксиса, сворачивание блоков кода, автодополнение кода, браузер классов, скриптовый движок Squirrel, планировщик для нескольких пользователей, плагины Devpack (установочные пакеты для Dev-C++), плагин wxSmith (инструмент быстрой
разработки приложений (RAD) для wxWidgets), систему проверки правописания (только для комментариев), автоформатирование кода AStyle, настраиваемый Code Style, утилиту для разработки
регулярных выражений (использует wxWidgets regexp parser, синтаксис pcre), переименования в файлах проекта (базовая поддержка Refactor->Rename для произвольного идентификатора), DoxyBlocks
(плагин для извлечения документации в формате DoxyGen, синтаксис комментариев поддерживается), поиск по проекту с подсветкой найденных совпадений. Также имеются возможности по работе с
регулярными выраженими, поиск места декларации или реализации идентификатора (функции, макроса, класса и т. д.) включая подключенные заголовки из внешних библиотек, запуск полученной
программы с аргументами (включая аргументы для терминала).
wxWidgets 3.0.2.
Библиотека инструментов wxWidgets 3.0.2 –– библиотека открытым ис-
ходным кодом для разработки кроссплатформенных приложений на уровне исходного кода. Основным применением wxWidgets является построение графического интерфейса пользователя (GUI), однако библиотека включает большое количество других функций и используется для создания весьма
разнообразного ПО. wxWidgets выпущена под лицензией, базирующейся на LGPL [13].
Важной особенностью wxWidgets в отличие от некоторых других библиотек (Swing, Qt и др.)
является то, что она максимально использует «родные» графические элементы интерфейса операционной системы всюду, где это возможно. Это существенное преимущество для многих пользователей, поскольку они привыкают работать в конкретной среде, и изменения интерфейса программ
часто вызывают затруднения в их работе.
Также wxWidgets обладает всеми преимуществами, присущими бесплатной свободной платформе:
– нулевая стоимость позволяет легко использовать её небогатым малым фирмам и индивидуальным разработчикам и экономить бюджет крупным организациям;
12
– открытый исходный код обеспечивает чрезвычайно долгий срок жизни проекта даже при
отходе от него первоначальных создателей, что позволяет гарантировать долгосрочное развитие и всех производных проектов;
– открытый код позволяет свободно производить его аудит (что важно для приложений, использующихся в критических сферах) и при необходимости самостоятельно модифицировать с добавлением нужных функций, не полагаясь на добрую волю исходного разработчика.
Этот момент особенно важен для внутрикорпоративного применения.
Лицензия wxWidgets допускает линковку с несвободными фрагментами кода, что позволяет
использовать её и в закрытых коммерческих проектах.
MariaDB Connector/C. Данный API поддерживает большой набор функций, которые обеспечивают доступ к СУБД MariaDB из приложений пользователя, независимо от того, запущена ли
она в локальной или на удаленной системе.
13
2.3
Программирование клиентской части информационной системы
На рисунке 2.5 показаны дерево проекта приложения SMDR Viewer и дерево виджетов.
Рисунок 2.5 –– Структура файлов и виджетов проекта SMDR Viewer
Большой объем кода приложения не позволяет привести его целиком в рамках данной работы.
Поэтому для примера программирования с использованием библиотеки wxWidgets рассмотрим код
запуска главной формы приложения SMDR Viewer.
Каждое приложение, использующее библиотеку wxWidgets, определяет свой собственный
класс-приложение –– разновидность класса wxApp, представляющего собой некоторое обобщенное
приложение. В нашем случае класс-приложение называется wx_testApp. Его код представлен в листинге 2.1.
14
Листинг 2.1 –– Файл wx_testApp.h
1
#ifndef WX_TESTAPP_H
2
#define WX_TESTAPP_H
3
4
#include <wx/app.h>
5
6
class wx_testApp : public wxApp
7
{
public:
8
virtual bool OnInit();
9
10
};
11
12
#endif // WX_TESTAPP_H
В программе существует единственный экземпляр этого нового класса –– само запущенное
приложение. Класс-приложение объявляет, по крайней мере, одну функцию –– OnInit(), которая
вызывается, когда библиотека wxWidgets готова запустить код. Функция OnInit() создает экземпляр формы и отображает форму на экране. Реализация данной функции представлена в в листинге 2.2.
Листинг 2.2 –– Файл wx_testApp.cpp
1
#include ”wx_testApp.h”
2
3
//(*AppHeaders
4
#include ”wx_testMain.h”
5
#include <wx/xrc/xmlres.h>
6
#include <wx/image.h>
7
//*)
8
9
IMPLEMENT_APP(wx_testApp)
10
11
bool wx_testApp::OnInit()
12
{
13
//(*AppInitialize
14
bool wxsOK = true;
15
wxInitAllImageHandlers();
16
wxXmlResource::Get()−>InitAllHandlers();
17
wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgTables.xrc”));
18
wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgFilter.xrc”));
19
if ( wxsOK )
20
{
21
wx_testFrame* Frame = new wx_testFrame(0);
22
Frame−>Show();
15
SetTopWindow(Frame);
23
24
}
25
//*)
26
return wxsOK;
27
28
}
В файле wx_testApp.cpp производится подключение заголовка wx_testMain.h (см. листинг 2.2). Заголовок содержит объявления класса главной формы приложения, идентификаторов
элементов интерфейса и callback-функций для обработки событий главной формы (листинг 2.3).
Листинг 2.3 –– Файл wx_testMain.h
1
#ifndef WX_TESTMAIN_H
2
#define WX_TESTMAIN_H
3
4
5
6
//(*Headers(wx_testFrame)
7
#include <wx/menu.h>
8
#include <wx/toolbar.h>
9
#include <wx/frame.h>
10
#include <wx/statusbr.h>
11
//*)
12
13
class wx_testFrame: public wxFrame
14
{
15
public:
16
17
wx_testFrame(wxWindow* parent,wxWindowID id = −1);
18
virtual ~wx_testFrame();
19
20
// private:
21
22
23
//(*Handlers(wx_testFrame)
24
void OnQuit(wxCommandEvent& event);
25
void OnAbout(wxCommandEvent& event);
26
void OnbtnInfoClick(wxCommandEvent& event);
27
void OnMenuConnectSelected(wxCommandEvent& event);
28
void OnToolBarConnectClicked(wxCommandEvent& event);
29
void OnShowTextOnToolBarButtonsSelected(wxCommandEvent& event);
30
void OnClose(wxCloseEvent& event);
31
void OnToolBarViewTableClicked(wxCommandEvent& event);
32
void OnMenuTableFilterSelected(wxCommandEvent& event);
16
33
void OnToolBarTableFilterClicked(wxCommandEvent& event);
34
void OnMenuViewTableSelected(wxCommandEvent& event);
35
void OnMenuStatisticsSelected(wxCommandEvent& event);
36
//*)
37
38
//(*Identifiers(wx_testFrame)
39
static const long idMenuConnect;
40
static const long idMenuQuit;
41
static const long idViewTable;
42
static const long idMenuTableFilter;
43
static const long idMenuStatistics;
44
static const long idMenuHelpOn;
45
static const long idMenuAbout;
46
static const long ID_STATUSBAR1;
47
static const long ID_TOOLBAR_CONNECT;
48
static const long idToolBarViewTable;
49
static const long idToolBarTableFilter;
50
static const long idToolBarStat;
51
static const long ID_TOOLBAR1;
52
//*)
53
54
//(*Declarations(wx_testFrame)
55
wxMenuItem* MenuConnect;
56
wxMenuItem* MenuTableFilter;
57
wxToolBarToolBase* ToolBarTableFilter;
58
wxMenuItem* MenuStatistics;
59
wxToolBar* ToolBar1;
60
wxMenu* Menu3;
61
wxMenuItem* MenuViewTable;
62
wxToolBarToolBase* ToolBarStat;
63
wxMenuItem* MenuItem3;
64
wxToolBarToolBase* ToolBarViewTable;
65
wxStatusBar* StatusBar1;
66
wxToolBarToolBase* ToolBarConnect;
67
wxMenu* Menu4;
68
//*)
69
DECLARE_EVENT_TABLE()
70
71
};
72
73
#endif // WX_TESTMAIN_H
Реализация этих функций находится в файле wx_testMain.cpp (листинг 2.4).
17
Листинг 2.4 –– Файл wx_testMain.cpp
1
#include ”wx_testMain.h”
2
#include <wx/msgdlg.h>
3
#include <wx/aboutdlg.h>
4
5
6
7
#include ”version.h”
8
#include ”dlgConnect.h”
9
#include ”dlgTables.h”
10
#include ”dlgFilter.h”
11
#include ”dlgStat.h”
12
13
//(*InternalHeaders(wx_testFrame)
14
#include <wx/artprov.h>
15
#include <wx/bitmap.h>
16
#include <wx/icon.h>
17
#include <wx/intl.h>
18
#include <wx/image.h>
19
#include <wx/string.h>
20
//*)
21
22
23
24
25
//const wxString MY_APP_VERSION_STRING = wxT(”0.1 Alpha”);
26
27
//helper functions
28
enum wxbuildinfoformat {
short_f , long_f };
29
30
31
wxString wxbuildinfo(wxbuildinfoformat format)
32
{
33
wxString wxbuild(wxVERSION_STRING);
34
35
if (format == long_f )
36
{
37
#if defined(__WXMSW__)
wxbuild << _T(”−Windows”);
38
39
#elif defined(__UNIX__)
wxbuild << _T(”−Linux”);
40
41
#endif
18
42
43
#if wxUSE_UNICODE
wxbuild << _T(”−Unicode build”);
44
45
#else
wxbuild << _T(”−ANSI build”);
46
47
#endif // wxUSE_UNICODE
}
48
49
return wxbuild;
50
51
}
52
53
//(*IdInit(wx_testFrame)
54
const long wx_testFrame::idMenuConnect = wxNewId();
55
const long wx_testFrame::idMenuQuit = wxNewId();
56
const long wx_testFrame::idViewTable = wxNewId();
57
const long wx_testFrame::idMenuTableFilter = wxNewId();
58
const long wx_testFrame::idMenuStatistics = wxNewId();
59
const long wx_testFrame::idMenuHelpOn = wxNewId();
60
const long wx_testFrame::idMenuAbout = wxNewId();
61
const long wx_testFrame::ID_STATUSBAR1 = wxNewId();
62
const long wx_testFrame::ID_TOOLBAR_CONNECT = wxNewId();
63
const long wx_testFrame::idToolBarViewTable = wxNewId();
64
const long wx_testFrame::idToolBarTableFilter = wxNewId();
65
const long wx_testFrame::idToolBarStat = wxNewId();
66
const long wx_testFrame::ID_TOOLBAR1 = wxNewId();
67
//*)
68
69
BEGIN_EVENT_TABLE(wx_testFrame ,wxFrame)
70
//(*EventTable(wx_testFrame)
71
//*)
72
END_EVENT_TABLE()
73
74
wx_testFrame::wx_testFrame(wxWindow* parent ,wxWindowID id)
75
{
76
//(*Initialize(wx_testFrame)
77
wxMenuItem* MenuItem2;
78
wxMenu* Menu1;
79
wxMenuBar* MenuBar1;
80
wxMenu* Menu2;
81
wxMenuItem* MenuQuit;
82
83
Create(parent , id, _(”SMDR Viewer”), wxDefaultPosition , wxDefaultSize ,
wxDEFAULT_FRAME_STYLE , _T(”id”));
19
84
SetClientSize(wxSize(800,600));
85
SetMinSize(wxSize(320,240));
86
{
87
wxIcon FrameIcon;
88
FrameIcon.CopyFromBitmap(wxArtProvider::GetBitmap(
wxART_MAKE_ART_ID_FROM_STR(_T(”wxART_EXECUTABLE_FILE”)),wxART_FRAME_ICON)
);
SetIcon(FrameIcon);
89
90
}
91
MenuBar1 = new wxMenuBar();
92
Menu1 = new wxMenu();
93
MenuConnect = new wxMenuItem(Menu1, idMenuConnect , _(”Connect...\tCtrl−N
”), _(”New connection to database”), wxITEM_NORMAL);
94
MenuConnect−>SetBitmap(wxBitmap(wxImage(_T(”rc\\connect.png”))));
95
Menu1−>Append(MenuConnect);
96
Menu1−>AppendSeparator();
97
MenuQuit = new wxMenuItem(Menu1, idMenuQuit , _(”Quit\tAlt−F4”), _(”Quit
the application”), wxITEM_NORMAL);
98
MenuQuit−>SetBitmap(wxBitmap(wxImage(_T(”rc\\quit.png”))));
99
Menu1−>Append(MenuQuit);
100
MenuBar1−>Append(Menu1, _(”&File”));
101
Menu3 = new wxMenu();
102
MenuViewTable = new wxMenuItem(Menu3, idViewTable , _(”View Table\tCtrl+Q
”), _(”View data on selected table”), wxITEM_NORMAL);
103
MenuViewTable−>SetBitmap(wxBitmap(wxImage(_T(”rc\\tables.png”))));
104
Menu3−>Append(MenuViewTable);
105
MenuViewTable−>Enable(false);
106
MenuTableFilter = new wxMenuItem(Menu3, idMenuTableFilter , _(”Table
Filter...\tCtrl+F”), _(”Find data in the selected table”), wxITEM_NORMAL)
;
107
MenuTableFilter−>SetBitmap(wxBitmap(wxImage(_T(”rc\\filter.png”))));
108
Menu3−>Append(MenuTableFilter);
109
MenuTableFilter−>Enable(false);
110
MenuStatistics = new wxMenuItem(Menu3, idMenuStatistics , _(”Statistics
...\tCtrl+T”), wxEmptyString , wxITEM_NORMAL);
111
MenuStatistics−>SetBitmap(wxBitmap(wxImage(_T(”rc\\stat.png”))));
112
Menu3−>Append(MenuStatistics);
113
MenuBar1−>Append(Menu3, _(”&Tables”));
114
Menu4 = new wxMenu();
115
MenuBar1−>Append(Menu4, _(”&Settings”));
116
Menu2 = new wxMenu();
117
MenuItem3 = new wxMenuItem(Menu2, idMenuHelpOn , _(”Help on SMDR Viewer\
tF1”), _(”Show help for this application”), wxITEM_NORMAL);
20
118
Menu2−>Append(MenuItem3);
119
Menu2−>AppendSeparator();
120
MenuItem2 = new wxMenuItem(Menu2, idMenuAbout , _(”About...”), _(”Show
info about this application”), wxITEM_NORMAL);
121
MenuItem2−>SetBitmap(wxBitmap(wxImage(_T(”rc\\about.png”))));
122
Menu2−>Append(MenuItem2);
123
MenuBar1−>Append(Menu2, _(”&Help”));
124
SetMenuBar(MenuBar1);
125
StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1 , 0, _T(”ID_STATUSBAR1”)
);
126
int __wxStatusBarWidths_1[1] = { −1 };
127
int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
128
StatusBar1−>SetFieldsCount(1,__wxStatusBarWidths_1);
129
StatusBar1−>SetStatusStyles(1,__wxStatusBarStyles_1);
130
SetStatusBar(StatusBar1);
131
ToolBar1 = new wxToolBar(this, ID_TOOLBAR1 , wxDefaultPosition ,
wxDefaultSize , wxTB_HORIZONTAL|wxTB_3DBUTTONS|wxTB_TEXT|wxSIMPLE_BORDER ,
_T(”ID_TOOLBAR1”));
132
ToolBar1−>SetToolBitmapSize(wxSize(22,22));
133
ToolBarConnect = ToolBar1−>AddTool(ID_TOOLBAR_CONNECT , _(”Connect”),
wxBitmap(wxImage(_T(”rc\\connect.png”))), wxNullBitmap , wxITEM_NORMAL , _(
”Connect to database”), _(”Connect to database”));
134
ToolBar1−>AddSeparator();
135
ToolBarViewTable = ToolBar1−>AddTool(idToolBarViewTable , _(”View Table”)
, wxBitmap(wxImage(_T(”rc\\tables.png”))), wxNullBitmap , wxITEM_NORMAL , _
(”View List of Tables”), _(”View Table”));
136
ToolBarTableFilter = ToolBar1−>AddTool(idToolBarTableFilter , _(”Table
Filter”), wxBitmap(wxImage(_T(”rc\\filter.png”))), wxNullBitmap ,
wxITEM_NORMAL , _(”Table Filter”), _(”Table Filter”));
137
ToolBarStat = ToolBar1−>AddTool(idToolBarStat , _(”Statistics”), wxBitmap
(wxImage(_T(”rc\\stat.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Show Stat
Data”), _(”Show Stat Data”));
138
ToolBar1−>Realize();
139
SetToolBar(ToolBar1);
140
Center();
141
142
Connect(idMenuConnect ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction
)&wx_testFrame::OnMenuConnectSelected);
143
Connect(idMenuQuit ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
wx_testFrame::OnQuit);
144
Connect(idViewTable ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
wx_testFrame::OnMenuViewTableSelected);
21
Connect(idMenuTableFilter ,wxEVT_COMMAND_MENU_SELECTED ,(
145
wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected);
Connect(idMenuStatistics ,wxEVT_COMMAND_MENU_SELECTED ,(
146
wxObjectEventFunction)&wx_testFrame::OnMenuStatisticsSelected);
Connect(idMenuAbout ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
147
wx_testFrame::OnAbout);
Connect(ID_TOOLBAR_CONNECT ,wxEVT_COMMAND_TOOL_CLICKED ,(
148
wxObjectEventFunction)&wx_testFrame::OnMenuConnectSelected);
Connect(idToolBarViewTable ,wxEVT_COMMAND_TOOL_CLICKED ,(
149
wxObjectEventFunction)&wx_testFrame::OnMenuViewTableSelected);
Connect(idToolBarTableFilter ,wxEVT_COMMAND_TOOL_CLICKED ,(
150
wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected);
Connect(idToolBarStat ,wxEVT_COMMAND_TOOL_CLICKED ,(wxObjectEventFunction)
151
&wx_testFrame::OnMenuStatisticsSelected);
Connect(wxID_ANY ,wxEVT_CLOSE_WINDOW ,(wxObjectEventFunction)&wx_testFrame
152
::OnClose);
153
//*)
154
MariaDBDriver::Get_inst()−>m_pGrid = new wxGrid(this, wxID_ANY);
155
ToolBarViewTable−>Enable(false);
156
ToolBarTableFilter−>Enable(false);
157
ToolBarStat−>Enable(false);
158
ToolBar1−>Realize();
159
MariaDBDriver::Get_inst()−>_frame = this;
160
}
161
162
wx_testFrame::~wx_testFrame()
163
{
164
//(*Destroy(wx_testFrame)
165
//*)
166
}
167
168
void wx_testFrame::OnAbout(wxCommandEvent& event)
169
{
170
wxAboutDialogInfo info;
171
wxString desc, version;
172
173
info.SetName(wxT(”Station Messaging Detail Report Viewer (SMDR Viewer)”)
);
174
175
version << AutoVersion::AV_MAJOR << ”.”
176
<< AutoVersion::AV_MINOR << ”−”
177
<< AutoVersion::AV_STATUS
178
<< ”, build ” << AutoVersion::AV_BUILD << ”\n”
22
<< wxbuildinfo(long_f);
179
180
info.SetVersion(version);
181
182
info.SetCopyright(wxT(”(C) 2016 С. М. Станкевич <okioup@vsu.by>”));
183
184
desc << L”\Программаn создана в рамках курсовой работы\n”
185
<< L”ИНФОРМАЦИОННАЯ\” СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ ТЕЛЕФОННЫХ
186
СОЕДИНЕНИЙ\”\n”
<< L”по дисциплине Средства\” визуального программирования
187
приложений\”\n\n”
188
<< L”Выполнил: Станкевич Сергей Михайлович,\n”
189
<< L”пециальностьc 1−40 01 73 Программное« обеспечение
информационных систем», ”
190
<< L”группа Пм−21\n\n”
191
<< L”Руководитель: ст. преп. кафедры прикладного и системного
программирования С. В. Сергеенко”;
info.SetDescription(desc);
192
193
wxAboutBox(info);
194
195
}
196
197
void wx_testFrame::OnQuit(wxCommandEvent& event) {
this−>Close();
198
199
}
200
201
void wx_testFrame::OnClose(wxCloseEvent& event) {
202
event.Skip(wxID_YES == wxMessageDialog(NULL,
203
wxT(”Quit? Really?”),
204
wxT(”SMDR Viewer”),
205
wxCENTER | wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT).
ShowModal());
206
}
207
208
void wx_testFrame::OnMenuConnectSelected(wxCommandEvent& event) {
209
dlgConnect dlgConn1(nullptr);
210
dlgConn1.ShowModal();
211
}
212
213
void wx_testFrame::OnMenuTableFilterSelected(wxCommandEvent& event){
214
dlgFilter dlgFilter1(nullptr);
215
dlgFilter1.ShowModal();
216
}
23
217
218
void wx_testFrame::OnMenuViewTableSelected(wxCommandEvent& event) {
219
dlgTables dlgTabs1(nullptr);
220
dlgTabs1.ShowModal();
221
}
222
223
void wx_testFrame::OnMenuStatisticsSelected(wxCommandEvent& event) {
224
dlgStat dlgStat1(nullptr);
225
dlgStat1.ShowModal();
226
}
24
3
3.1
Работа с информационной системой
Установка и настройка серверной части
Установка сервера MariaDB и настройка его начальной конфигурации в среде операционной системы Microsoft Windows описана во многих источниках, например здесь:
https://mariadb.com/kb/en/mariadb/installing-mariadb-msi-packages-on-windows/.
25
3.2
Установка и настройка клиентской части
Установка клиентской части информационной системы заключается в копировании в один каталог исполняемого файла приложения SMDR Viewer и необходимых для его работы библиотек (рисунок 3.1). Набор библиотек зависит от используемых в приложении инструментов, средств и компонентов библиотеки wxWidgets.
Рисунок 3.1 –– Каталог с готовым к запуску приложением
В частности, в нашем случае, для работы приложения потребовались следующие файлы:
– wx_test.exe –– исполняемый файл;
– dlgTables.xrc и dlgFilter.xrc –– файлы описания ресурсов, основанные на XML (располагаются в каталоге проекта);
– wxmsw30u_gcc_custom.dll –– динамически подключаемая библиотека wxWidgets (располагается в каталоге .\gcc_dll\ каталога установки wxWidgets);
– libmysql.dll –– динамически подключаемая библиотека (располагается в каталоге .\lib\
каталога установки СУБД MariaDB);
– в каталоге .\rc\ находятся пиктограммы, отображаемые в меню и на кнопках панели инструментов приложения.
26
3.3
Использование информационной системы
Соединение с сервером баз данных.
При запуске приложения SMDR Viewer открывается
пустое окно с элементами управления. На рисунке 3.2 показан вид окна с информацией о приложении
(вызывается через меню Help⇒About…).
Рисунок 3.2 –– Окно приложения с информацией о программе
После нажатия кнопки Connect или выбора соответствующего пункта меню появляется диалог настройки соединения с сервером баз данных (рисунок 3.3). В нем нужно указать параметры
соединения и нажать кнопку Connect!:
Рисунок 3.3 –– Настройка соединения с сервером баз данных
27
Рисунок 3.4 –– Информация о результатах соединения с сервером баз данных
Об успехе или неудаче соединения подскажет соответствующее информационное окно (рисунок 3.4). Если соединени с сервером успешно, выпадающий список Database заполнится списком баз
данных, у которых для пользователя имеются соответствущие привилегии. После выбора требуемой
базы данных с помощю кнопки Close диалог закрывается.
Отображение таблиц базы данных.
Для отображения таблиц на панели инструментов
нужно нажать кнопку View Table. В открывшемся окне (рисунок 3.5) выбрать нужную таблицу и нажать кнопку OK. Результат отобразится в главном окне приложения.
Рисунок 3.5 –– Окно выбора таблицы базы данных
28
Рисунок 3.6 –– Окно задания условия фильтрации данных
Использование фильтра.
Для фильтрации таблиц на панели инструментов нужно нажать
кнопку Filter. В открывшемся окне (рисунок 3.6) указать требуемое условие и нажать кнопку OK.
Результат фильтрации отобразится в главном окне приложения.
На приведенном выше рисунке 3.6 показан результат фильтрации по условию –– отображаются
только те записи, длительность разговора которых превышает три минуты.
29
Заключение
Основные результаты работы заключаются в следующем.
1. Спроектирована база данных, содержащая информацию о телефонных соединениях.
2. Спроектирована клиентская часть информационной системы (приложение для работы с базой данных).
3. Выбраны средства разработки и сторонние компоненты (среды разработки, библиотеки, сервера баз данных) для реализации информационной системы.
4. Дано описание процесса установки, настойки и использования разработанной информационной системы.
Правильность и корректность работы созданной информационной системы подтверждается результатами проведённых тестовых прогонов.
Результаты данной работы помогут в разработке новой версии автоматизированной
информационно-аналитической системы «Электронный университет» учреждения образования
«Витебский государственный университет имени П. М. Машерова».
30
Список использованных источников
1. Информационные технологии. Система стандартов по базам данных. Эталонная модель управления данными: ГОСТ 34.321–96. –– Введ. 01.04.2002. –– Минск: Госстандарт, 2001. – 28 с.
2. Липпман, С. Язык программирования С++. Базовый курс : Пер. с англ. / С. Липпман, Ж. Лажойе,
Б. Му. –– 5-е изд. –– М.: ООО «И. Д. Вильямс», 2014. –– 1120 с.
3. Прата, С. Язык программирования С++: лекции и упражнения: учебник: Пер. с англ. / С. Прата. ––
Москва [и др.]: ДиаСофт, 2005. –– 1104 с.
4. Дейт, К. Дж. Введение в системы баз данных. Восьмое издание : Пер. с англ. / К. Дж. Дейт. –– М.:
ООО «И. Д. Вильямс», 2008. –– 1328 с.
5. Коннолли, Т. Базы данных. Проектирование, реализация и сопровождение. Теория и практика /
Т. Коннолли, К. Бегг. –– 3-е изд. –– ООО «И. Д. Вильямс», 2003. –– 1436 с.
6. Джексон, Г. Проектирование реляционных баз данных для использования с микроЭВМ / Г. Джексон. –– М.: Мир, 1991. –– 252 с.
7. Швецов, В. И. Базы данных : Учебное пособие / В. И. Швецов, А. Н. Визгунов, И. Б. Мееров. ––
Нижний Новгород: Изд-во ННГУ, 2004. –– 217 с.
8. Вайнберг, П. SQL. Полное руководство : Пер. с. англ. / П. Вайнберг, Дж. Грофф. –– ООО «И. Д.
Вильямс», 2003. –– 960 с.
9. Нормальная форма [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/Нормальная_форма. –– Дата доступа:
12.11.2016.
10. MariaDB [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим
доступа: https://ru.wikipedia.org/wiki/MariaDB –– Дата доступа: 12.11.2016.
11. MariaDB
в
сравнении
с
MySQL
[Электронный
ресурс]. –– Режим
доступа:
https://mariadb.com/kb/ru/mariadb-vs-mysql-features/ –– Дата доступа: 12.11.2016.
12. Сode::Blocks [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/Code::Blocks. –– Дата доступа: 12.11.2016.
13. WxWidgets [Электронный ресурс] / Материал из Википедии –– свободной энциклопедии. –– Режим доступа: https://ru.wikipedia.org/wiki/WxWidgets. –– Дата доступа: 12.11.2016.
14. Руководство
по
wxWidgets
[Электронный
ресурс]
/
Режим
доступа:
http://www.sl-
alex.com.ua/ru/page/wxwidgets_tutorial_00_introduction. –– Дата доступа: 12.11.2016.
15. Мир лицензий: разбираемся с GNU GPL [Электронный ресурс] –– Режим доступа:
https://habrahabr.ru/post/284390/. –– Дата доступа: 12.11.2016.
16. MySQL «на стероидах» [Электронный ресурс] –– Режим доступа: http://blogerator.ru/page/mysqlna-steroidah. –– Дата доступа: 12.11.2016.
17. Smart, J. Cross-Platform GUI Programming with wxWidgets / J. Smart, K. Hock, S. Csomor. — Prentice Hall Ptr, 2005. — 744 p.
18. wxWidgets tutorial [Electronic resource] — Mode of access: http://zetcode.com/gui/wxwidgets/. —
Date of access: 11.11.2016.
31
19. MariaDB
Knowledgebase
[Electronic
resource]
—
Mode
of
access:
http://kb.askmonty.org/v/mariadb. — Date of access: 14.11.2016.
20. MySQL
Workbench
[Electronic
resource]
—
Mode
https://www.mysql.com/products/workbench/. — Date of access: 09.11.2016.
32
of
access:
Приложение А
Код SQL для создания базы данных smdr
1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
2
/*!40101 SET NAMES utf8 */;
3
/*!50503 SET NAMES utf8mb4 */;
4
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS ,
FOREIGN_KEY_CHECKS=0 */;
5
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE , SQL_MODE=’NO_AUTO_VALUE_ON_ZERO ’ */
;
6
7
−− Дамп структуры базы данных smdr
8
DROP DATABASE IF EXISTS ‘smdr‘;
9
CREATE DATABASE IF NOT EXISTS ‘smdr‘ /*!40100 DEFAULT CHARACTER SET utf8
*/;
10
USE ‘smdr ‘;
11
12
−− Дамп структуры для таблица smdr.buildings
13
DROP TABLE IF EXISTS ‘buildings ‘;
14
CREATE TABLE IF NOT EXISTS ‘buildings ‘ (
15
‘id‘ int(11) NOT NULL DEFAULT ’0’,
16
‘caption ‘ varchar(50) DEFAULT NULL,
17
‘address ‘ varchar(50) DEFAULT NULL,
18
PRIMARY KEY (‘id‘)
19
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Адреса корпусов’;
20
21
−− Дамп структуры для таблица smdr.calls
22
DROP TABLE IF EXISTS ‘calls ‘;
23
CREATE TABLE IF NOT EXISTS ‘calls‘ (
24
‘id‘ int(11) NOT NULL DEFAULT ’0’,
25
‘sta‘ int(11) DEFAULT NULL,
26
‘co‘ int(11) DEFAULT NULL,
27
‘clong‘ time DEFAULT NULL,
28
‘ctime‘ time DEFAULT NULL,
29
‘cdate‘ date DEFAULT NULL,
30
‘letter_id ‘ char(1) NOT NULL DEFAULT ’I’,
31
‘onum‘ varchar(25) NOT NULL,
32
‘dept_id ‘ int(11) DEFAULT NULL,
33
PRIMARY KEY (‘id‘),
34
KEY ‘FK_calls_calltype ‘ (‘letter_id ‘),
33
35
KEY ‘FK_calls_depts ‘ (‘dept_id ‘),
36
CONSTRAINT ‘FK_calls_calltype ‘ FOREIGN KEY (‘letter_id ‘) REFERENCES ‘
calltype ‘ (‘LETTER ‘),
37
CONSTRAINT ‘FK_calls_depts ‘ FOREIGN KEY (‘dept_id ‘) REFERENCES ‘depts‘
(‘id‘) ON DELETE SET NULL ON UPDATE CASCADE
38
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Лог SMDR’;
39
40
−− Дамп структуры для таблица smdr.calltype
41
DROP TABLE IF EXISTS ‘calltype ‘;
42
CREATE TABLE IF NOT EXISTS ‘calltype ‘ (
43
‘letter‘ char(1) NOT NULL DEFAULT ’I’,
44
‘caption ‘ varchar(18) DEFAULT NULL,
45
PRIMARY KEY (‘letter ‘)
46
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Типы вызовов’;
47
48
−− Дамп структуры для таблица smdr.depts
49
DROP TABLE IF EXISTS ‘depts ‘;
50
CREATE TABLE IF NOT EXISTS ‘depts‘ (
51
‘id‘ int(11) NOT NULL DEFAULT ’0’,
52
‘sta‘ int(11) NOT NULL DEFAULT ’0’,
53
‘caption ‘ varchar(128) DEFAULT NULL,
54
‘room‘ varchar(5) DEFAULT NULL,
55
‘building_id ‘ int(11) NOT NULL DEFAULT ’0’,
56
PRIMARY KEY (‘id‘),
57
KEY ‘FK_depts_buildings ‘ (‘building_id ‘),
58
CONSTRAINT ‘FK_depts_buildings ‘ FOREIGN KEY (‘building_id ‘) REFERENCES ‘
buildings ‘ (‘id‘) ON UPDATE CASCADE
59
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’Кафедры’;
60
61
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE , ’’) */;
62
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1,
@OLD_FOREIGN_KEY_CHECKS) */;
63
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
34
Приложение Б
Исходные коды приложения SMDR Viewer
Б.1 Файл wx_testApp.h
1
#ifndef WX_TESTAPP_H
2
#define WX_TESTAPP_H
3
4
#include <wx/app.h>
5
6
class wx_testApp : public wxApp
7
{
public:
8
virtual bool OnInit();
9
10
};
11
12
#endif // WX_TESTAPP_H
Б.2 Файл wx_testApp.cpp
1
#include ”wx_testApp.h”
2
3
//(*AppHeaders
4
#include ”wx_testMain.h”
5
#include <wx/xrc/xmlres.h>
6
#include <wx/image.h>
7
//*)
8
9
IMPLEMENT_APP(wx_testApp)
10
11
bool wx_testApp::OnInit()
12
{
13
//(*AppInitialize
14
bool wxsOK = true;
15
wxInitAllImageHandlers();
16
wxXmlResource::Get()−>InitAllHandlers();
17
wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgTables.xrc”));
18
wxsOK = wxsOK && wxXmlResource::Get()−>Load(_T(”dlgFilter.xrc”));
35
19
if ( wxsOK )
20
{
21
wx_testFrame* Frame = new wx_testFrame(0);
22
Frame−>Show();
23
SetTopWindow(Frame);
24
}
25
//*)
26
return wxsOK;
27
28
}
Б.3 Файл wx_testMain.h
1
#ifndef WX_TESTMAIN_H
2
#define WX_TESTMAIN_H
3
4
5
6
//(*Headers(wx_testFrame)
7
#include <wx/menu.h>
8
#include <wx/toolbar.h>
9
#include <wx/frame.h>
10
#include <wx/statusbr.h>
11
//*)
12
13
class wx_testFrame: public wxFrame
14
{
15
public:
16
17
wx_testFrame(wxWindow* parent,wxWindowID id = −1);
18
virtual ~wx_testFrame();
19
20
// private:
21
22
23
//(*Handlers(wx_testFrame)
24
void OnQuit(wxCommandEvent& event);
25
void OnAbout(wxCommandEvent& event);
26
void OnbtnInfoClick(wxCommandEvent& event);
27
void OnMenuConnectSelected(wxCommandEvent& event);
28
void OnToolBarConnectClicked(wxCommandEvent& event);
29
void OnShowTextOnToolBarButtonsSelected(wxCommandEvent& event);
30
void OnClose(wxCloseEvent& event);
36
31
void OnToolBarViewTableClicked(wxCommandEvent& event);
32
void OnMenuTableFilterSelected(wxCommandEvent& event);
33
void OnToolBarTableFilterClicked(wxCommandEvent& event);
34
void OnMenuViewTableSelected(wxCommandEvent& event);
35
void OnMenuStatisticsSelected(wxCommandEvent& event);
36
//*)
37
38
//(*Identifiers(wx_testFrame)
39
static const long idMenuConnect;
40
static const long idMenuQuit;
41
static const long idViewTable;
42
static const long idMenuTableFilter;
43
static const long idMenuStatistics;
44
static const long idMenuHelpOn;
45
static const long idMenuAbout;
46
static const long ID_STATUSBAR1;
47
static const long ID_TOOLBAR_CONNECT;
48
static const long idToolBarViewTable;
49
static const long idToolBarTableFilter;
50
static const long idToolBarStat;
51
static const long ID_TOOLBAR1;
52
//*)
53
54
//(*Declarations(wx_testFrame)
55
wxMenuItem* MenuConnect;
56
wxMenuItem* MenuTableFilter;
57
wxToolBarToolBase* ToolBarTableFilter;
58
wxMenuItem* MenuStatistics;
59
wxToolBar* ToolBar1;
60
wxMenu* Menu3;
61
wxMenuItem* MenuViewTable;
62
wxToolBarToolBase* ToolBarStat;
63
wxMenuItem* MenuItem3;
64
wxToolBarToolBase* ToolBarViewTable;
65
wxStatusBar* StatusBar1;
66
wxToolBarToolBase* ToolBarConnect;
67
wxMenu* Menu4;
68
//*)
69
DECLARE_EVENT_TABLE()
70
71
};
72
73
#endif // WX_TESTMAIN_H
37
Б.4 Файл wx_testMain.cpp
1
#include ”wx_testMain.h”
2
#include <wx/msgdlg.h>
3
#include <wx/aboutdlg.h>
4
5
6
7
#include ”version.h”
8
#include ”dlgConnect.h”
9
#include ”dlgTables.h”
10
#include ”dlgFilter.h”
11
#include ”dlgStat.h”
12
13
//(*InternalHeaders(wx_testFrame)
14
#include <wx/artprov.h>
15
#include <wx/bitmap.h>
16
#include <wx/icon.h>
17
#include <wx/intl.h>
18
#include <wx/image.h>
19
#include <wx/string.h>
20
//*)
21
22
23
24
25
//const wxString MY_APP_VERSION_STRING = wxT(”0.1 Alpha”);
26
27
//helper functions
28
enum wxbuildinfoformat {
short_f , long_f };
29
30
31
wxString wxbuildinfo(wxbuildinfoformat format)
32
{
33
wxString wxbuild(wxVERSION_STRING);
34
35
if (format == long_f )
36
{
37
38
39
40
#if defined(__WXMSW__)
wxbuild << _T(”−Windows”);
#elif defined(__UNIX__)
wxbuild << _T(”−Linux”);
38
41
#endif
42
43
#if wxUSE_UNICODE
wxbuild << _T(”−Unicode build”);
44
45
#else
wxbuild << _T(”−ANSI build”);
46
47
#endif // wxUSE_UNICODE
}
48
49
return wxbuild;
50
51
}
52
53
//(*IdInit(wx_testFrame)
54
const long wx_testFrame::idMenuConnect = wxNewId();
55
const long wx_testFrame::idMenuQuit = wxNewId();
56
const long wx_testFrame::idViewTable = wxNewId();
57
const long wx_testFrame::idMenuTableFilter = wxNewId();
58
const long wx_testFrame::idMenuStatistics = wxNewId();
59
const long wx_testFrame::idMenuHelpOn = wxNewId();
60
const long wx_testFrame::idMenuAbout = wxNewId();
61
const long wx_testFrame::ID_STATUSBAR1 = wxNewId();
62
const long wx_testFrame::ID_TOOLBAR_CONNECT = wxNewId();
63
const long wx_testFrame::idToolBarViewTable = wxNewId();
64
const long wx_testFrame::idToolBarTableFilter = wxNewId();
65
const long wx_testFrame::idToolBarStat = wxNewId();
66
const long wx_testFrame::ID_TOOLBAR1 = wxNewId();
67
//*)
68
69
BEGIN_EVENT_TABLE(wx_testFrame ,wxFrame)
70
//(*EventTable(wx_testFrame)
71
//*)
72
END_EVENT_TABLE()
73
74
wx_testFrame::wx_testFrame(wxWindow* parent ,wxWindowID id)
75
{
76
//(*Initialize(wx_testFrame)
77
wxMenuItem* MenuItem2;
78
wxMenu* Menu1;
79
wxMenuBar* MenuBar1;
80
wxMenu* Menu2;
81
wxMenuItem* MenuQuit;
82
39
Create(parent , id, _(”SMDR Viewer”), wxDefaultPosition , wxDefaultSize ,
83
wxDEFAULT_FRAME_STYLE , _T(”id”));
84
SetClientSize(wxSize(800,600));
85
SetMinSize(wxSize(320,240));
86
{
87
wxIcon FrameIcon;
88
FrameIcon.CopyFromBitmap(wxArtProvider::GetBitmap(
wxART_MAKE_ART_ID_FROM_STR(_T(”wxART_EXECUTABLE_FILE”)),wxART_FRAME_ICON)
);
SetIcon(FrameIcon);
89
90
}
91
MenuBar1 = new wxMenuBar();
92
Menu1 = new wxMenu();
93
MenuConnect = new wxMenuItem(Menu1, idMenuConnect , _(”Connect...\tCtrl−N
”), _(”New connection to database”), wxITEM_NORMAL);
94
MenuConnect−>SetBitmap(wxBitmap(wxImage(_T(”rc\\connect.png”))));
95
Menu1−>Append(MenuConnect);
96
Menu1−>AppendSeparator();
97
MenuQuit = new wxMenuItem(Menu1, idMenuQuit , _(”Quit\tAlt−F4”), _(”Quit
the application”), wxITEM_NORMAL);
98
MenuQuit−>SetBitmap(wxBitmap(wxImage(_T(”rc\\quit.png”))));
99
Menu1−>Append(MenuQuit);
100
MenuBar1−>Append(Menu1, _(”&File”));
101
Menu3 = new wxMenu();
102
MenuViewTable = new wxMenuItem(Menu3, idViewTable , _(”View Table\tCtrl+Q
”), _(”View data on selected table”), wxITEM_NORMAL);
103
MenuViewTable−>SetBitmap(wxBitmap(wxImage(_T(”rc\\tables.png”))));
104
Menu3−>Append(MenuViewTable);
105
MenuViewTable−>Enable(false);
106
MenuTableFilter = new wxMenuItem(Menu3, idMenuTableFilter , _(”Table
Filter...\tCtrl+F”), _(”Find data in the selected table”), wxITEM_NORMAL)
;
107
MenuTableFilter−>SetBitmap(wxBitmap(wxImage(_T(”rc\\filter.png”))));
108
Menu3−>Append(MenuTableFilter);
109
MenuTableFilter−>Enable(false);
110
MenuStatistics = new wxMenuItem(Menu3, idMenuStatistics , _(”Statistics
...\tCtrl+T”), wxEmptyString , wxITEM_NORMAL);
111
MenuStatistics−>SetBitmap(wxBitmap(wxImage(_T(”rc\\stat.png”))));
112
Menu3−>Append(MenuStatistics);
113
MenuBar1−>Append(Menu3, _(”&Tables”));
114
Menu4 = new wxMenu();
115
MenuBar1−>Append(Menu4, _(”&Settings”));
116
Menu2 = new wxMenu();
40
117
MenuItem3 = new wxMenuItem(Menu2, idMenuHelpOn , _(”Help on SMDR Viewer\
tF1”), _(”Show help for this application”), wxITEM_NORMAL);
118
Menu2−>Append(MenuItem3);
119
Menu2−>AppendSeparator();
120
MenuItem2 = new wxMenuItem(Menu2, idMenuAbout , _(”About...”), _(”Show
info about this application”), wxITEM_NORMAL);
121
MenuItem2−>SetBitmap(wxBitmap(wxImage(_T(”rc\\about.png”))));
122
Menu2−>Append(MenuItem2);
123
MenuBar1−>Append(Menu2, _(”&Help”));
124
SetMenuBar(MenuBar1);
125
StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1 , 0, _T(”ID_STATUSBAR1”)
);
126
int __wxStatusBarWidths_1[1] = { −1 };
127
int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
128
StatusBar1−>SetFieldsCount(1,__wxStatusBarWidths_1);
129
StatusBar1−>SetStatusStyles(1,__wxStatusBarStyles_1);
130
SetStatusBar(StatusBar1);
131
ToolBar1 = new wxToolBar(this, ID_TOOLBAR1 , wxDefaultPosition ,
wxDefaultSize , wxTB_HORIZONTAL|wxTB_3DBUTTONS|wxTB_TEXT|wxSIMPLE_BORDER ,
_T(”ID_TOOLBAR1”));
132
ToolBar1−>SetToolBitmapSize(wxSize(22,22));
133
ToolBarConnect = ToolBar1−>AddTool(ID_TOOLBAR_CONNECT , _(”Connect”),
wxBitmap(wxImage(_T(”rc\\connect.png”))), wxNullBitmap , wxITEM_NORMAL , _(
”Connect to database”), _(”Connect to database”));
134
ToolBar1−>AddSeparator();
135
ToolBarViewTable = ToolBar1−>AddTool(idToolBarViewTable , _(”View Table”)
, wxBitmap(wxImage(_T(”rc\\tables.png”))), wxNullBitmap , wxITEM_NORMAL , _
(”View List of Tables”), _(”View Table”));
136
ToolBarTableFilter = ToolBar1−>AddTool(idToolBarTableFilter , _(”Table
Filter”), wxBitmap(wxImage(_T(”rc\\filter.png”))), wxNullBitmap ,
wxITEM_NORMAL , _(”Table Filter”), _(”Table Filter”));
137
ToolBarStat = ToolBar1−>AddTool(idToolBarStat , _(”Statistics”), wxBitmap
(wxImage(_T(”rc\\stat.png”))), wxNullBitmap , wxITEM_NORMAL , _(”Show Stat
Data”), _(”Show Stat Data”));
138
ToolBar1−>Realize();
139
SetToolBar(ToolBar1);
140
Center();
141
142
Connect(idMenuConnect ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction
)&wx_testFrame::OnMenuConnectSelected);
143
Connect(idMenuQuit ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
wx_testFrame::OnQuit);
41
Connect(idViewTable ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
144
wx_testFrame::OnMenuViewTableSelected);
Connect(idMenuTableFilter ,wxEVT_COMMAND_MENU_SELECTED ,(
145
wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected);
Connect(idMenuStatistics ,wxEVT_COMMAND_MENU_SELECTED ,(
146
wxObjectEventFunction)&wx_testFrame::OnMenuStatisticsSelected);
Connect(idMenuAbout ,wxEVT_COMMAND_MENU_SELECTED ,(wxObjectEventFunction)&
147
wx_testFrame::OnAbout);
Connect(ID_TOOLBAR_CONNECT ,wxEVT_COMMAND_TOOL_CLICKED ,(
148
wxObjectEventFunction)&wx_testFrame::OnMenuConnectSelected);
Connect(idToolBarViewTable ,wxEVT_COMMAND_TOOL_CLICKED ,(
149
wxObjectEventFunction)&wx_testFrame::OnMenuViewTableSelected);
Connect(idToolBarTableFilter ,wxEVT_COMMAND_TOOL_CLICKED ,(
150
wxObjectEventFunction)&wx_testFrame::OnMenuTableFilterSelected);
Connect(idToolBarStat ,wxEVT_COMMAND_TOOL_CLICKED ,(wxObjectEventFunction)
151
&wx_testFrame::OnMenuStatisticsSelected);
Connect(wxID_ANY ,wxEVT_CLOSE_WINDOW ,(wxObjectEventFunction)&wx_testFrame
152
::OnClose);
153
//*)
154
MariaDBDriver::Get_inst()−>m_pGrid = new wxGrid(this, wxID_ANY);
155
ToolBarViewTable−>Enable(false);
156
ToolBarTableFilter−>Enable(false);
157
ToolBarStat−>Enable(false);
158
ToolBar1−>Realize();
159
MariaDBDriver::Get_inst()−>_frame = this;
160
}
161
162
wx_testFrame::~wx_testFrame()
163
{
164
//(*Destroy(wx_testFrame)
165
//*)
166
}
167
168
void wx_testFrame::OnAbout(wxCommandEvent& event)
169
{
170
wxAboutDialogInfo info;
171
wxString desc, version;
172
173
info.SetName(wxT(”Station Messaging Detail Report Viewer (SMDR Viewer)”)
);
174
175
version << AutoVersion::AV_MAJOR << ”.”
176
<< AutoVersion::AV_MINOR << ”−”
42
177
<< AutoVersion::AV_STATUS
178
<< ”, build ” << AutoVersion::AV_BUILD << ”\n”
179
<< wxbuildinfo(long_f);
180
info.SetVersion(version);
181
182
info.SetCopyright(wxT(”(C) 2016 С. М. Станкевич <okioup@vsu.by>”));
183
184
desc << L”\Программаn создана в рамках курсовой работы\n”
185
<< L”ИНФОРМАЦИОННАЯ\” СИСТЕМА ДЛЯ ОТОБРАЖЕНИЯ СТАТИСТИКИ ТЕЛЕФОННЫХ
186
СОЕДИНЕНИЙ\”\n”
<< L”по дисциплине Средства\” визуального программирования
187
приложений\”\n\n”
188
<< L”Выполнил: Станкевич Сергей Михайлович,\n”
189
<< L”пециальностьc 1−40 01 73 Программное« обеспечение
информационных систем», ”
190
<< L”группа Пм−21\n\n”
191
<< L”Руководитель: ст. преп. кафедры прикладного и системного
программирования С. В. Сергеенко”;
info.SetDescription(desc);
192
193
wxAboutBox(info);
194
195
}
196
197
void wx_testFrame::OnQuit(wxCommandEvent& event) {
this−>Close();
198
199
}
200
201
void wx_testFrame::OnClose(wxCloseEvent& event) {
202
event.Skip(wxID_YES == wxMessageDialog(NULL,
203
wxT(”Quit? Really?”),
204
wxT(”SMDR Viewer”),
205
wxCENTER | wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT).
ShowModal());
206
}
207
208
void wx_testFrame::OnMenuConnectSelected(wxCommandEvent& event) {
209
dlgConnect dlgConn1(nullptr);
210
dlgConn1.ShowModal();
211
}
212
213
214
void wx_testFrame::OnMenuTableFilterSelected(wxCommandEvent& event){
dlgFilter dlgFilter1(nullptr);
43
dlgFilter1.ShowModal();
215
216
}
217
218
void wx_testFrame::OnMenuViewTableSelected(wxCommandEvent& event) {
219
dlgTables dlgTabs1(nullptr);
220
dlgTabs1.ShowModal();
221
}
222
223
void wx_testFrame::OnMenuStatisticsSelected(wxCommandEvent& event) {
224
dlgStat dlgStat1(nullptr);
225
dlgStat1.ShowModal();
226
}
Б.5 Файл dbDriver.h
1
#ifndef DBDRIVER_H_INCLUDED
2
#define DBDRIVER_H_INCLUDED
3
4
#include <wx/grid.h>
5
#include <wx/string.h>
6
#include <wx/arrstr.h>
7
#include <wx/fontmap.h>
8
#include <wx/toolbar.h>
9
#include ”wx_testMain.h”
10
#include <wx/msgdlg.h>
11
#include <mysql/mysql.h>
12
#include ”wx_testMain.h”
13
14
class MariaDBDriver {
15
16
MYSQL* _instance;
17
MYSQL* _conn;
18
MYSQL_RES *_res;
19
MYSQL_ROW *_row;
20
bool table_first;
21
22
wxString _host;
23
long
24
wxString _user;
25
wxString _password;
26
bool _is_connected;
_port;
44
27
28
MYSQL_RES *execute_query(const wxString&);
29
void update_all_databases();
30
void update_all_tables();
31
void show_calltype();
32
33
MariaDBDriver();
34
wxString _curr_table;
35
36
public:
37
wx_testFrame *_frame;
38
wxGrid *m_pGrid;
39
wxString _db;
40
wxArrayString _all_db;
41
wxArrayString _all_tables;
42
43
void _set_curr_table(const wxString &);
44
wxString _get_curr_table();
45
wxArrayString _get_curr_field();
46
wxArrayString _get_curr_field_type();
47
48
static MariaDBDriver * msMariaDBDriver;
49
static MariaDBDriver *Get_inst();
50
~MariaDBDriver();
51
52
bool open_conn(const wxString&, const long&, const wxString&, const
53
wxString&);
void set_curr_db(const wxString &);
54
55
56
bool verify_db(const wxString&);
57
bool is_connected();
58
//
void update_show_tables(const wxString &table_name = ””, const
wxString &cond = ””);
59
void update_show_tables2(const wxString &in_query = ”show tables”);
60
void create_infotable(MYSQL_RES *);
61
62
inline void error_message_box(MYSQL *e) {
63
wxString err;
64
wxMessageBox((err << mysql_error(e)), wxT(”Error!”), wxCENTER |
wxICON_ERROR | wxOK_DEFAULT);
65
}
66
45
template <typename T> inline void info_message_box(const T &val) {
67
68
wxString msg;
69
wxMessageBox((msg << val), wxT(”Information”), wxCENTER |
wxICON_INFORMATION | wxOK_DEFAULT);
}
70
71
};
72
73
#endif // DBDRIVER_H_INCLUDED
Б.6 Файл dbDriver.cpp
1
#include ”dbDriver.h”
2
3
MariaDBDriver * MariaDBDriver::msMariaDBDriver = nullptr;
4
5
MariaDBDriver::MariaDBDriver() {
if(!msMariaDBDriver){
6
7
table_first = true;
8
_is_connected = false;
9
_instance = mysql_init(NULL);
if (!_instance) error_message_box(_instance);
10
}
11
12
}
13
14
MariaDBDriver *MariaDBDriver::Get_inst() {
if(!msMariaDBDriver) {
15
msMariaDBDriver=new MariaDBDriver();
16
17
}
18
return msMariaDBDriver;
19
}
20
21
MariaDBDriver::~MariaDBDriver() {
if(_is_connected) mysql_close(_conn);
22
23
}
24
25
bool MariaDBDriver::open_conn(const wxString& host, const long& port, const
wxString& user, const wxString& password) {
26
if (_is_connected) mysql_close(_conn);
27
_all_db.Clear();
28
_is_connected=false;
29
_host = host;
46
30
_port = port;
31
_user = user;
32
_password = password;
33
_conn = mysql_real_connect(_instance , _host, _user, _password , ””, _port
, nullptr , 0);
if (_conn) {
34
35
info_message_box(”Connection success”);
36
mysql_set_character_set(_instance ,”cp1251”);
37
update_all_databases();
38
_is_connected=true;
39
return true;
40
}
41
error_message_box(_instance);
42
return false;
43
}
44
45
MYSQL_RES * MariaDBDriver::execute_query(const wxString& q) {
if(!mysql_query(_conn, q.c_str())) {
46
return mysql_store_result(_conn);
47
} else {
48
return nullptr;
49
}
50
51
}
52
53
void MariaDBDriver::update_all_databases() {
54
_all_db.Clear();
55
MYSQL_RES *res = execute_query(”SHOW DATABASES”);
56
if (res) {
57
MYSQL_ROW row;
58
while ((row = mysql_fetch_row(res))) _all_db.Add(row[0]);
59
mysql_free_result(res);
60
delete res;
}
61
62
}
63
64
void MariaDBDriver::update_all_tables() {
65
_all_tables.Clear();
66
MYSQL_RES *res = execute_query(”SHOW TABLES”);
67
if (res) {
68
MYSQL_ROW row;
69
while ((row = mysql_fetch_row(res))) _all_tables.Add(row[0]);
70
mysql_free_result(res);
71
delete res;
47
}
72
73
}
74
75
bool MariaDBDriver::verify_db(const wxString& q) {
return (_db == q) ? true : false;
76
77
}
78
79
bool MariaDBDriver::is_connected() {
return _is_connected;
80
81
}
82
83
void MariaDBDriver::set_curr_db(const wxString &s) {
84
_db = s;
85
if (mysql_select_db(_instance , _db.c_str())) {
86
error_message_box(_instance);
} else {
87
update_all_tables();
88
89
info_message_box(”Database ’” + _db + ”’ is selected”);
90
_frame−>ToolBarViewTable−>Enable(true);
91
_frame−>ToolBarStat−>Enable(true);
92
_frame−>ToolBar1−>Realize();
93
_frame−>MenuViewTable−>Enable(true);
}
94
95
}
96
97
98
99
void MariaDBDriver::create_infotable(MYSQL_RES *res) {
MYSQL_FIELD *fields = mysql_fetch_fields(res);
if (table_first) {
100
m_pGrid−>CreateGrid(0,0);
101
m_pGrid−>AutoSize();
102
m_pGrid−>EnableScrolling(1,1);
103
m_pGrid−>AppendCols(mysql_num_fields(res));
104
table_first = false;
105
} else {
106
m_pGrid−>DeleteCols(0,m_pGrid−>GetNumberCols());
107
m_pGrid−>DeleteRows(0,m_pGrid−>GetNumberRows());
108
m_pGrid−>AppendCols(mysql_num_fields(res));
109
}
110
for(size_t i = 0; i < mysql_num_fields(res); i++)
111
m_pGrid−>SetColLabelValue(i,fields[i].name);
112
size_t i = 0;
113
MYSQL_ROW row;
114
while ((row = mysql_fetch_row(res))) {
48
115
bool bIns = m_pGrid−>AppendRows();
116
if (bIns) {
for(size_t j = 0; j < mysql_num_fields(res); j++) {
117
118
wxString r(row[j]);
119
m_pGrid−>SetCellValue(i, j, r);
120
}
121
i++;
}
122
123
}
124
m_pGrid−>Fit();
125
mysql_free_result(res);
126
delete res;
127
}
128
129
//void MariaDBDriver::update_show_tables(const wxString &table_name , const
wxString &cond) {
130
//
if (table_name != ””) _curr_table = table_name;
131
//
MYSQL_RES *res = execute_query(”SELECT * FROM ” + _curr_table + cond);
132
//
if (res) {
133
//
create_infotable(res);
134
//
_frame−>ToolBarTableFilter−>Enable(true);
135
//
_frame−>ToolBar1−>Realize();
136
//
_frame−>MenuTableFilter−>Enable(true);
137
//
138
//
139
//
140
//}
} else {
error_message_box(_instance);
}
141
142
void MariaDBDriver::update_show_tables2(const wxString &in_query) {
143
144
MYSQL_RES *res = execute_query(in_query);
145
if (res) {
146
create_infotable(res);
147
_frame−>ToolBarTableFilter−>Enable(true);
148
_frame−>ToolBar1−>Realize();
149
_frame−>MenuTableFilter−>Enable(true);
} else {
150
error_message_box(_instance);
151
}
152
153
}
154
155
156
void MariaDBDriver::_set_curr_table(const wxString &t) {
_curr_table = t;
49
157
}
158
159
wxString MariaDBDriver::_get_curr_table() {
return _curr_table;
160
161
}
162
163
wxArrayString MariaDBDriver::_get_curr_field() {
164
info_message_box(”DESC ” + _curr_table);
165
wxArrayString tmp;
166
MYSQL_RES * res = execute_query(”DESC ” + _curr_table);
167
if (res) {
168
MYSQL_ROW row;
169
while ((row = mysql_fetch_row(res))) {
tmp.Add(row[0]);
170
171
}
172
mysql_free_result(res);
173
delete res;
} else {
174
error_message_box(_instance);
175
176
}
177
return tmp;
178
}
179
180
wxArrayString MariaDBDriver::_get_curr_field_type() {
181
wxArrayString tmp;
182
MYSQL_RES * res = execute_query(”DESC ” + _curr_table);
183
if (res) {
184
MYSQL_ROW row;
185
while ((row = mysql_fetch_row(res))) {
tmp.Add(row[1]);
186
187
}
188
mysql_free_result(res);
189
delete res;
190
}
191
return tmp;
192
}
Б.7 Файл dlgConnect.h
1
#ifndef DLGCONNECT_H
2
#define DLGCONNECT_H
50
3
4
#include ”dbDriver.h”
5
6
//(*Headers(dlgConnect)
7
#include <wx/sizer.h>
8
#include <wx/stattext.h>
9
#include <wx/textctrl.h>
10
#include <wx/choice.h>
11
#include <wx/button.h>
12
#include <wx/dialog.h>
13
//*)
14
15
16
17
class dlgConnect: public wxDialog
18
{
19
20
MariaDBDriver *drv;
public:
21
22
dlgConnect(wxWindow* parent ,wxWindowID id=wxID_ANY);
23
virtual ~dlgConnect();
24
25
//(*Declarations(dlgConnect)
26
wxStaticText* StaticText2;
27
wxTextCtrl* txtUser;
28
wxStaticText* StaticText1;
29
wxStaticText* StaticText3;
30
wxTextCtrl* txtHost;
31
wxButton* btnCloseDialog;
32
wxStaticText* StaticText5;
33
wxTextCtrl* txtPassword;
34
wxStaticText* StaticText4;
35
wxChoice* chDatabases;
36
wxButton* btnDoConnect;
37
wxTextCtrl* txtPort;
38
//*)
39
40
protected:
41
42
//(*Identifiers(dlgConnect)
43
static const long ID_STATICTEXT1;
44
static const long ID_TXT_HOST;
45
static const long ID_STATICTEXT2;
51
46
static const long ID_TXT_PORT;
47
static const long ID_STATICTEXT3;
48
static const long ID_TXT_USER;
49
static const long ID_STATICTEXT4;
50
static const long ID_TXT_PASSWORD;
51
static const long ID_BUTTON1;
52
static const long ID_STATICTEXT5;
53
static const long ID_CH_DATABASE;
54
static const long ID_OK;
55
//*)
56
private:
57
58
59
//(*Handlers(dlgConnect)
60
void OnbtnDoConnectClick(wxCommandEvent& event);
61
void OnchDatabasesSelect(wxCommandEvent& event);
62
void OnbtnCloseDialogClick(wxCommandEvent& event);
63
//*)
64
DECLARE_EVENT_TABLE()
65
66
};
67
68
#endif
Б.8 Файл dlgConnect.cpp
1
#include ”dlgConnect.h”
2
3
//(*InternalHeaders(dlgConnect)
4
#include <wx/intl.h>
5
#include <wx/string.h>
6
//*)
7
8
//(*IdInit(dlgConnect)
9
const long dlgConnect::ID_STATICTEXT1 = wxNewId();
10
const long dlgConnect::ID_TXT_HOST = wxNewId();
11
const long dlgConnect::ID_STATICTEXT2 = wxNewId();
12
const long dlgConnect::ID_TXT_PORT = wxNewId();
13
const long dlgConnect::ID_STATICTEXT3 = wxNewId();
14
const long dlgConnect::ID_TXT_USER = wxNewId();
15
const long dlgConnect::ID_STATICTEXT4 = wxNewId();
52
16
const long dlgConnect::ID_TXT_PASSWORD = wxNewId();
17
const long dlgConnect::ID_BUTTON1 = wxNewId();
18
const long dlgConnect::ID_STATICTEXT5 = wxNewId();
19
const long dlgConnect::ID_CH_DATABASE = wxNewId();
20
const long dlgConnect::ID_OK = wxNewId();
21
//*)
22
23
BEGIN_EVENT_TABLE(dlgConnect ,wxDialog)
24
//(*EventTable(dlgConnect)
25
//*)
26
END_EVENT_TABLE()
27
28
dlgConnect::dlgConnect(wxWindow* parent,wxWindowID id)
29
{
30
//(*Initialize(dlgConnect)
31
wxBoxSizer* BoxSizer4;
32
wxBoxSizer* BoxSizer6;
33
wxBoxSizer* BoxSizer5;
34
wxBoxSizer* BoxSizer2;
35
wxGridSizer* GridSizer1;
36
wxBoxSizer* BoxSizer1;
37
wxBoxSizer* BoxSizer3;
38
39
Create(parent , wxID_ANY , _(”Connect to database”), wxDefaultPosition ,
wxDefaultSize , wxDEFAULT_DIALOG_STYLE , _T(”wxID_ANY”));
40
SetClientSize(wxSize(300,400));
41
SetMinSize(wxSize(−1,−1));
42
SetFocus();
43
GridSizer1 = new wxGridSizer(7, 1, 5, 0);
44
BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
45
StaticText1 = new wxStaticText(this, ID_STATICTEXT1 , _(”Host”),
wxDefaultPosition , wxSize(50,12), wxALIGN_LEFT , _T(”ID_STATICTEXT1”));
46
StaticText1−>SetMinSize(wxSize(−1,−1));
47
StaticText1−>SetMaxSize(wxSize(−1,−1));
48
BoxSizer1−>Add(StaticText1 , 1, wxALL|wxALIGN_CENTER_VERTICAL , 5);
49
txtHost = new wxTextCtrl(this, ID_TXT_HOST , _(”localhost”),
wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_HOST”
));
50
BoxSizer1−>Add(txtHost , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
51
GridSizer1−>Add(BoxSizer1 , 1, wxALL|wxEXPAND , 5);
52
BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
53
53
StaticText2 = new wxStaticText(this, ID_STATICTEXT2 , _(”Port”),
wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT2”));
54
BoxSizer2−>Add(StaticText2 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
55
txtPort = new wxTextCtrl(this, ID_TXT_PORT , _(”3306”), wxDefaultPosition ,
wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_PORT”));
56
BoxSizer2−>Add(txtPort , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
57
GridSizer1−>Add(BoxSizer2 , 1, wxALL|wxEXPAND , 5);
58
BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
59
StaticText3 = new wxStaticText(this, ID_STATICTEXT3 , _(”User”),
wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT3”));
60
BoxSizer3−>Add(StaticText3 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
61
txtUser = new wxTextCtrl(this, ID_TXT_USER , _(”sts”), wxDefaultPosition ,
wxDefaultSize , 0, wxDefaultValidator , _T(”ID_TXT_USER”));
62
BoxSizer3−>Add(txtUser , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
63
GridSizer1−>Add(BoxSizer3 , 1, wxALL|wxEXPAND , 5);
64
BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
65
StaticText4 = new wxStaticText(this, ID_STATICTEXT4 , _(”Password”),
wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT , _T(”ID_STATICTEXT4”));
66
BoxSizer4−>Add(StaticText4 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
67
txtPassword = new wxTextCtrl(this, ID_TXT_PASSWORD , _(”123”),
wxDefaultPosition , wxDefaultSize , wxTE_PASSWORD , wxDefaultValidator , _T(”
ID_TXT_PASSWORD”));
68
BoxSizer4−>Add(txtPassword , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
69
GridSizer1−>Add(BoxSizer4 , 1, wxALL|wxEXPAND , 5);
70
btnDoConnect = new wxButton(this, ID_BUTTON1 , _(”Connect!”),
wxDefaultPosition , wxDefaultSize , 0, wxDefaultValidator , _T(”ID_BUTTON1”)
);
71
GridSizer1−>Add(btnDoConnect , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
72
BoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
73
StaticText5 = new wxStaticText(this, ID_STATICTEXT5 , _(”Database”),
wxDefaultPosition , wxSize(69,13), wxALIGN_LEFT , _T(”ID_STATICTEXT5”));
74
StaticText5−>SetMinSize(wxSize(−1,−1));
75
StaticText5−>SetMaxSize(wxSize(−1,−1));
76
BoxSizer5−>Add(StaticText5 , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
54
chDatabases = new wxChoice(this, ID_CH_DATABASE , wxDefaultPosition , wxSize
77
(125,21), 0, 0, 0, wxDefaultValidator , _T(”ID_CH_DATABASE”));
78
chDatabases−>SetMinSize(wxSize(−1,−1));
79
chDatabases−>SetMaxSize(wxSize(−1,−1));
80
BoxSizer5−>Add(chDatabases , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
wxALIGN_CENTER_VERTICAL , 5);
81
GridSizer1−>Add(BoxSizer5 , 1, wxALL|wxEXPAND , 5);
82
BoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
83
btnCloseDialog = new wxButton(this, ID_OK, _(”Close”), wxDefaultPosition ,
wxDefaultSize , 0, wxDefaultValidator , _T(”ID_OK”));
BoxSizer6−>Add(btnCloseDialog , 1, wxALL|wxALIGN_CENTER_HORIZONTAL|
84
wxALIGN_CENTER_VERTICAL , 5);
85
GridSizer1−>Add(BoxSizer6 , 1, wxALL|wxALIGN_RIGHT , 5);
86
SetSizer(GridSizer1);
87
SetSizer(GridSizer1);
88
Layout();
89
Center();
90
Connect(ID_BUTTON1 ,wxEVT_COMMAND_BUTTON_CLICKED ,(wxObjectEventFunction)&
91
dlgConnect::OnbtnDoConnectClick);
Connect(ID_CH_DATABASE ,wxEVT_COMMAND_CHOICE_SELECTED ,(
92
wxObjectEventFunction)&dlgConnect::OnchDatabasesSelect);
Connect(ID_OK,wxEVT_COMMAND_BUTTON_CLICKED ,(wxObjectEventFunction)&
93
dlgConnect::OnbtnCloseDialogClick);
//*)
94
95
drv = MariaDBDriver::Get_inst();
96
if (drv−>is_connected()) {
97
wxArrayString * all_db = &drv−>_all_db;
98
if (all_db−>size()) {
99
chDatabases−>Clear();
100
for(size_t i = 0; i < all_db−>size(); i++){
101
102
chDatabases−>Append(all_db−>Item(i));
103
if (drv−>verify_db(all_db−>Item(i)))
chDatabases−>SetSelection(i);
104
}
105
106
}
107
}
108
}
109
110
dlgConnect::~dlgConnect()
111
{
112
//(*Destroy(dlgConnect)
55
//*)
113
114
}
115
116
void dlgConnect::OnbtnDoConnectClick(wxCommandEvent& event) {
117
wxString h, u, ps;
118
h = txtHost−>GetValue();
119
u = txtUser−>GetValue();
120
ps = txtPassword−>GetValue();
121
long p;
122
(txtPort−>GetValue()).ToLong(&p);
123
if (drv−>open_conn(h, p, u, ps)) {
124
wxArrayString * all_db = &drv−>_all_db;
125
if(all_db−>size()){
126
chDatabases−>Clear();
127
for(size_t i = 0; i < all_db−>size(); i++){
128
129
chDatabases−>Append(all_db−>Item(i));
130
if (drv−>verify_db(all_db−>Item(i)))
chDatabases−>SetSelection(i);
131
}
132
}
133
} else {
134
this−>Close();
135
}
136
137
}
138
139
void dlgConnect::OnchDatabasesSelect(wxCommandEvent& event) {
drv−>set_curr_db(chDatabases−>GetString(chDatabases−>GetSelection()));
140
141
}
142
143
144
void dlgConnect::OnbtnCloseDialogClick(wxCommandEvent& event) {
this−>Close();
145
146
}
Б.9 Файл dlgTables.h
1
#ifndef DLGTABLES_H
2
#define DLGTABLES_H
3
4
#include ”dbDriver.h”
56
5
6
//(*Headers(dlgTables)
7
#include <wx/listbox.h>
8
#include <wx/button.h>
9
#include <wx/dialog.h>
10
//*)
11
12
13
class dlgTables: public wxDialog
14
{
MariaDBDriver *drv;
15
public:
16
17
18
dlgTables(wxWindow* parent);
19
virtual ~dlgTables();
20
21
//(*Declarations(dlgTables)
22
wxListBox* lstTables;
23
wxButton* dtnOK;
24
//*)
25
protected:
26
27
28
//(*Identifiers(dlgTables)
29
//*)
30
private:
31
32
33
//(*Handlers(dlgTables)
34
void OndtnOKClick(wxCommandEvent& event);
35
//*)
36
DECLARE_EVENT_TABLE()
37
38
};
39
40
#endif
Б.10 Файл dlgTables.cpp
1
#include ”dlgTables.h”
2
57
3
4
5
//(*InternalHeaders(dlgTables)
6
#include <wx/xrc/xmlres.h>
7
//*)
8
9
10
//(*IdInit(dlgTables)
//*)
11
12
BEGIN_EVENT_TABLE(dlgTables ,wxDialog)
13
//(*EventTable(dlgTables)
14
//*)
15
END_EVENT_TABLE()
16
17
18
dlgTables::dlgTables(wxWindow* parent) {
19
//(*Initialize(dlgTables)
20
wxXmlResource::Get()−>LoadObject(this,parent,_T(”dlgTables”),_T(”wxDialog”
));
21
lstTables = (wxListBox*)FindWindow(XRCID(”ID_LISTBOX1”));
22
dtnOK = (wxButton*)FindWindow(XRCID(”ID_BUTTON1”));
23
24
Connect(XRCID(”ID_BUTTON1”),wxEVT_COMMAND_BUTTON_CLICKED ,(
wxObjectEventFunction)&dlgTables::OndtnOKClick);
25
//*)
26
27
SetTitle(wxT(”Список таблиц”));
28
29
drv = MariaDBDriver::Get_inst();
30
if(drv−>is_connected()){
wxArrayString * tmp = &drv−>_all_tables;
31
if(tmp−>size()){
32
lstTables−>Clear();
33
34
for(size_t i = 0; i < tmp−>size(); i++){
35
lstTables−>Append(tmp−>Item(i));
36
if (drv−>verify_db(tmp−>Item(i)))
lstTables−>SetSelection(i);
37
}
38
}
39
40
} else {
41
drv−>info_message_box(”Connection failed!”);
42
this−>Close();
43
}
58
44
}
45
46
47
dlgTables::~dlgTables() {
48
49
50
//(*Destroy(dlgTables)
51
//*)
52
}
53
54
void dlgTables::OndtnOKClick(wxCommandEvent& event) {
if (lstTables−>GetSelection() != −1) {
55
drv−>_set_curr_table(lstTables−>GetString(lstTables−>GetSelection())
56
);
drv−>update_show_tables2(”SELECT * FROM ” + lstTables−>GetString(
57
lstTables−>GetSelection()));
this−>Close();
58
} else {
59
drv−>info_message_box(wxT(”Укажите желаемую таблицу!”));
60
}
61
62
}
Б.11 Файл dlgFilter.h
1
#ifndef DLGFILTER_H
2
#define DLGFILTER_H
3
4
#include ”dbDriver.h”
5
6
//(*Headers(dlgFilter)
7
#include <wx/textctrl.h>
8
#include <wx/button.h>
9
#include <wx/dialog.h>
10
#include <wx/combobox.h>
11
//*)
12
13
class dlgFilter: public wxDialog
14
{
15
16
MariaDBDriver *drv;
public:
17
59
18
dlgFilter(wxWindow* parent);
19
virtual ~dlgFilter();
20
21
//(*Declarations(dlgFilter)
22
wxComboBox* cmbOp;
23
wxButton* btnOK;
24
wxComboBox* cmbField;
25
wxTextCtrl* TextCtrl1;
26
//*)
27
protected:
28
29
30
//(*Identifiers(dlgFilter)
31
//*)
32
private:
33
34
35
//(*Handlers(dlgFilter)
36
void OnComboBox2Selected(wxCommandEvent& event);
37
void OnbtnOKClick(wxCommandEvent& event);
38
//*)
39
DECLARE_EVENT_TABLE()
40
41
};
42
43
#endif
Б.12 Файл dlgFilter.cpp
1
#include ”dlgFilter.h”
2
3
//(*InternalHeaders(dlgFilter)
4
#include <wx/xrc/xmlres.h>
5
//*)
6
7
//(*IdInit(dlgFilter)
8
//*)
9
10
BEGIN_EVENT_TABLE(dlgFilter ,wxDialog)
11
//(*EventTable(dlgFilter)
12
//*)
60
13
END_EVENT_TABLE()
14
15
dlgFilter::dlgFilter(wxWindow* parent)
16
{
17
//(*Initialize(dlgFilter)
18
wxXmlResource::Get()−>LoadObject(this,parent,_T(”dlgFilter”),_T(”wxDialog”
));
19
cmbField = (wxComboBox*)FindWindow(XRCID(”ID_COMBOBOX1”));
20
cmbOp = (wxComboBox*)FindWindow(XRCID(”ID_COMBOBOX2”));
21
TextCtrl1 = (wxTextCtrl*)FindWindow(XRCID(”ID_TEXTCTRL1”));
22
btnOK = (wxButton*)FindWindow(XRCID(”ID_BUTTON1”));
23
Connect(XRCID(”ID_BUTTON1”),wxEVT_COMMAND_BUTTON_CLICKED ,(
24
wxObjectEventFunction)&dlgFilter::OnbtnOKClick);
25
//*)
26
drv = MariaDBDriver::Get_inst();
27
wxArrayString tmp = drv−>_get_curr_field();
28
for(size_t i = 0; i < tmp.size(); i++){
cmbField−>Append(tmp.Item(i));
29
}
30
31
}
32
33
dlgFilter::~dlgFilter()
34
{
35
//(*Destroy(dlgFilter)
36
//*)
37
}
38
39
40
void dlgFilter::OnbtnOKClick(wxCommandEvent& event) {
41
wxString tmp = TextCtrl1−>GetValue();
42
wxArrayString tmp2 = drv−>_get_curr_field_type();
43
if (tmp2.Item(cmbField−>GetSelection()) == ”time” ||
tmp2.Item(cmbField−>GetSelection()) == ”date”) {
44
45
tmp = ”\”” + tmp + ”\””;
46
47
}
48
49
switch(cmbOp−>GetSelection()){
50
case 1:
51
case 2:
52
case 3:
53
case 4:
61
case 5:
54
55
TextCtrl1−>Enable(true);
56
TextCtrl1−>Refresh();
57
break;
58
case 6:
59
case 7:
60
TextCtrl1−>Enable(true);
61
tmp = ”\”%” + tmp + ”%\””;
62
break;
63
case 8:
64
case 9:
65
TextCtrl1−>Enable(false);
66
TextCtrl1−>Refresh();
67
tmp = ””;
68
break;
}
69
70
71
wxString q;
72
q << (”SELECT * FROM ” + drv−>_get_curr_table() + ” WHERE ” +
73
cmbField−>GetString(cmbField−>GetSelection()) +
74
” ” +
75
cmbOp−>GetString(cmbOp−>GetSelection()) +
76
” ” +
77
tmp);
78
drv−>info_message_box(q);
79
drv−>update_show_tables2(q);
80
this−>Close();
81
}
Б.13 Файл version.h
1
#ifndef VERSION_H
2
#define VERSION_H
3
4
namespace AutoVersion{
5
6
//Date Version Types
7
static const char AV_DATE[] = ”26”;
8
static const char AV_MONTH[] = ”11”;
9
static const char AV_YEAR[] = ”2016”;
10
static const char AV_UBUNTU_VERSION_STYLE[] =
62
”16.11”;
11
12
//Software Status
13
static const char AV_STATUS[] =
14
static const char AV_STATUS_SHORT[] =
”Release Candidate”;
”rc”;
15
16
//Standard Version Type
17
static const long AV_MAJOR
= 1;
18
static const long AV_MINOR
= 6;
19
static const long AV_BUILD
= 16;
20
static const long AV_REVISION
= 0;
21
22
//Miscellaneous Version Types
23
static const long AV_BUILDS_COUNT
24
#define AV_RC_FILEVERSION 1,6,16,0
25
#define AV_RC_FILEVERSION_STRING ”1, 6, 16, 0\0”
26
static const char AV_FULLVERSION_STRING [] = ”1.6.16.0”;
= 876;
27
//These values are to keep track of your versioning state, don’t modify
28
them.
static const long AV_BUILD_HISTORY
29
= 4;
30
31
32
}
33
#endif //VERSION_H
63
Download