Автор работы: Пользователь скрыл имя, 04 Мая 2014 в 11:08, курсовая работа
СУБД SQLite является легковеснойвстраиваемой, это значит, что все операции с данными выполняются внутри приложения без использования сервера базы данных. Исходный код данной СУБД находится в свободном доступе. Доступ к данным в базе происходит через подключения к базе данных, которые мы открываем через вызов соответственной функции DLL.
Для взаимодействия приложения с СУБД SQLite в настоящий момент используются различные интерфейсы, такие как встроенный интерфейс SQLite,JDBC, ODBC и т.п. Однако, нет реализации интерфейса, поддерживающего взаимодействие клиента с сервером СУБД при помощи Pipeпод Windows.
1. Исследование предметной области…….…………………….…………….…5
1.1. Постановка задачи…....…………………….…………….………………..5
1.2. Описание SQLite……….…………...…….…………….………………….7
1.2.1. Устройство и характеристики СУБД SQLite……………...….........7
1.2.2. Методы работы с базой данных……………………….…………....8
1.3. ОписаниеPIPE под Windows…………...…...…………...………………10
1.3.1. Общие понятия ………………………..…………...……………….10
1.3.2. Именованные каналы………………..……………...……………....10
1.3.3. Методы WinAPI для передачи данных…………......……………...12
2. Замысел технического решения….…………………….…………………….15
2.1. Реализация взаимодействия через PIPE…......…………………………..15
2.2. Исполнение запросов кSQLite…………......………………....………….16
3. Описание программы……………….………..…...………………...………...17
3.1. Сервер………………………………...…...……………………………….17
3.2. Клиент…………………………...…………...…………………………….21
3.3. API……………………….....…………………….………………………...22
4. Заключение……….…………………………………….…………………...…24
5. Список используемой литературы…….…………….……………………….
СОДЕРЖАНИЕ
Приложение 1. CppNamedPipeServer.cpp….……..……
Приложение 2 . CppNamedPipeClient.cpp …………..…………………………...34
Приложение 3. SQLite_API.h………..…………………………………
1.1 Постановка задачи
СУБД SQLite является легковесной встраиваемой, это значит, что все операции с данными выполняются внутри приложения без использования сервера базы данных. Исходный код данной СУБД находится в свободном доступе. Доступ к данным в базе происходит через подключения к базе данных, которые мы открываем через вызов соответственной функции DLL.
Для взаимодействия приложения с СУБД SQLite в настоящий момент используются различные интерфейсы, такие как встроенный интерфейс SQLite, JDBC, ODBC и т.п. Однако, нет реализации интерфейса, поддерживающего взаимодействие клиента с сервером СУБД при помощи Pipe под Windows.
Таким образом, целью курсового проекта является разработка API взаимодействия клиентских приложений с сервером СУБД через Pipe под Windows.
Учитывая специфику выбранной СУБД и требование к реализации поддержки Pipe, приходится использовать трехзвенную модель взаимодействия клиентского приложения с СУБД. В выбранной модели запрос от клиентского приложения поступает в сервис среднего звена, который, обработав запрос, передает его на выполнение в СУБД SQLite. Результат также обрабатывается сервисом среднего звена, после чего передается клиенту.
В рамках курсового проекта требуется разработать набор методов, который покрыл бы большинство задач работы с базой данных. То есть задачи авторизации, подключения к базе данных, отправки запроса, обработки результата и ошибок, закрытии соединения. Также разрабатывается клиентское приложения, которое при помощи Pipes соединяется с интерфейсом и может отправлять запросы и получать результаты.
Разрабатываемое приложение должно служить связующим звеном между базой данных и клиентским приложение за счет использования PIPE. Данное приложение всегда запущено и ждет получения запроса от клиента через PIPE.
В качестве преимущества выбранной модели можно отметить возможность контроля доступа и модификации данных. Также есть возможность ввести шифрование передающихся данных. Еще одним преимуществом трехзвенной архитектуры является возможность увеличить производительность БД за счет введения собственных методов кэширования.
СУБД SQLite является встраиваемой реляционной базой данных. SQLite не использует парадигму клиент-сервер, то есть SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу.
SQlite очень тщательно тестируется перед каждым выпуском новой версии. Данная СУБД устойчива к «утечкам памяти» и ошибкам дискового ввода/вывода.
SQLite доступна в исходных кодах (на языке C), использовать готовую DLL или в виде утилиты для командной строки.
Доступ к БД происходит через «подключения» к БД, который открывается через вызов соответствующей функции DLL. При открытии указывается имя файла БД. Если такого нету — он автоматически создается.
Допустимо открывать множество подключений к одной и тоже БД (через имя файла) в одном или разных приложениях. Система использует механизмы блокировки доступа к файлу на уровне ОС.
SQLite может быть собрана в однопоточном варианте (параметр компиляции SQLITE_THREADSAFE = 0). В этом случае нельзя одновременно использовать несколько потоков, поскольку полностью отсутствует код синхронизации. Однако, в таком случае повышается производительность за счет экономии на алгоритмах синхронизации.
Проверить, есть ли многопоточность можно через вызов sqlite3_threadsafe(): если вернула 0, то это однопоточный SQLite.
По умолчанию, SQLite собран с поддержкой потоков (sqlite3.dll).
Есть два способа использования многопоточного SQLite: serialized и multi-thread.
Serialized (надо указать флаг
SQLITE_OPEN_FULLMUTEX при открытии соединения).
В этом режиме потоки могут
как угодно дергать вызовы SQLite,
никаких ограничений. Но все вызовы
блокируют друг друга и
Multi-thread (SQLITE_OPEN_NOMUTEX). В этом
режиме нельзя использовать
Важной особенностью транзакционных баз данных, таких как SQLite является "атомарная транзакция". Это означает, что либо все изменения в базе данных в рамках одной транзакции вступают в силу, либо ни один из них не происходит. Так как, из-за физических ограничений, нельзя одновременно проводить запись в разные участки файла, механизм транзакций создает иллюзияю, что все операции, относящиеся в разные участки файла базы данных происходят мгновенно и одновременно.
В случае возникновения сбоя, вызванного отключением питания или сбоем системы, СУБД SQLite способна вернуть прежнее состояние базы данных до начала совершения транзакции.
1.2.2 Методы работы с базой данных
Для взаимодействия с базой данных SQLite используются стандартный набор функций, описанных в Windows DLL файле, поставляемом с БД. Также можно использовать отдельные модули, в которых реализованы функции под конкретный framework и язык программирования.
Основной задачей СУБД SQLite является оценка и выполнение полученного SQL запроса. Для подключения к СУБД в программе требуется иметь 2 объекта:
Объект подключения и оператора обрабатываются небольшим набором функций из C/C++ интерфейса:
Для исполнения SQL выражения приложение должно выполнить следующие шаги:
Функция sqlite3_exec() является традиционным обработчиком, которым может заменить изложенные ранее 4 шага путем вызова одной функции. После выполнение вызывается callback функция, которая обрабатывает результат запроса.
Также в библиотеку SQLite входит утилита командной строки, которая позволяет пользователю вручную вводить и выполнять SQL запросы.
В операционных системах Microsoft Windows для передачи данных между процессами используются каналы PIPE. Это средство позволяет организовать передачу данных между локальными процессами, а также между процессами, запущенными на различных рабочих станциях в сети. Существуют две разновидности каналов Pipe - именованные (Named Pipes) и анонимные (Anonymous Pipes). Именованным каналам при создании присваивается имя, которое доступно для других процессов. Зная имя какой-либо рабочей станции в сети, процесс может получить доступ к каналу, созданному на этой рабочей станции. Анонимные каналы обычно используются для организации передачи данных между родительскими и дочерними процессами, запущенными на одной рабочей станции или на “отдельно стоящем” компьютере.
Через канал можно передавать данные только между двумя процессами. Один из процессов создает канал, другой открывает его. После этого оба процесса могут передавать данные через канал в одну или обе стороны. Приложения могут выполнять над каналами Pipe синхронные или асинхронные операции, аналогично тому, как это можно делать с файлами. В случае использования асинхронных операций необходимо отдельно организовать синхронизацию доступа.
Named Pipe представляет собой канал для взаимодействия одного сервера и нескольких клиентов, подключаемых к нему по имени канала. Все клиенты подключаются по одному и тому же имени, на для каждого клиента создаются свои буферы и маркеры, и предоставляет отдельный канал для связи клиент - сервер. Такой подход позволяет использовать одновременно нескольким клиентам один и тот же канал. Если один серверный процесс использует несколько реализаций канала для связи с несколькими клиенсткими, то общее количество реализаций может быть меньше, чем потенциальное максимальное количество клиентов. Это связано с тем, что клиенты могут использовать реализации по очереди, если только они не пожелают связаться с серверным процессом все одновременно.
Самым просты для реализации является многопоточный сервер потому что в нем в каждом процессе идет работа с один клиентом, соответственно, достаточно одного представления на один клиент. На каждый процесс системы выделяет процессорное время когда это требуется. Однако каждый поток требует больше системных ресурсов, что может привести к проблемам при большом числе клиентов.
Именованные каналы не существуют постоянно, то есть не могут, в отличии от реализации pipe в Unix, быть созданы как специальные файлы. В ОС Windows имеют временные имена, которые автоматически могут быть уничтожены самой операционной системой после закрытия последней ссылки на канал.
Имена каналов в общем случае имеют следующий вид:
\\ИмяСервера\pipe\ИмяКанала
Именованные каналы могут быть использованы для организации взаимодействия приложений, работающих на одном устройстве, или между приложениями на разных компьютерах одной сети.
Для обеспечения контроля доступа клиентов при создании канала можно определить дескриптор безопасности. С помощью данного дескриптора можно ограничить доступ приложения запущенных от недоверенной группы пользователей. При определении дескриптора как NULL используется политика безопасности, заданная в системе по умолчанию.
Передача данных в именованный канал идет как при работе с файлом.
Канал Pipe может быть ориентирован либо на передачу потока байт, либо на передачу сообщений. В первом случае данные через канал передаются по байтам, во втором - отдельными блоками заданной длины. При создании канала можно определить, будет канал использоваться для чтения, записи или для чтения и записи.
Сервер не должен вызывать блокировку канала, пока клиент не закончит чтение / запись. В противном случае может возникнуть состояние гонки, что приведет к непредсказуемым результатам.