Модельный SQL-интерпретатор (1115016), страница 4
Текст из файла (страница 4)
*/send (s, “client”, 7, 0);/* ................................ */close (s);exit (0);}3.4. Пример-оболочка программы «Сервер» длясети ЭВМ#include#include#include#include#include#include<sys/types.h><sys/socket.h><netinet/in.h><netdb.h><stdio.h><string.h>extern int errno;void main (){char c;intd, d1, fromlen;FILE * fp;char hostname[64];struct hostent *hp;struct sockaddr_in sin, fromsin;14Модельный SQL-интерпретатор. Методическое пособие.// получаем хост-имя собственной ЭВМ:gethostname (hostname, sizeof (hostname));// определяем сетевой номер своей машины:if ((hp = gethostbyname (hostname)) == NULL) {fprintf (stderr, “%s: unknown host.\n”, hostname);exit (1);}// получаем свой сокет-дескриптор:if ((d = socket (AF_INET, SOCK_STREAM, 0)) < 0) {perror (“client: socket”);exit (1);}// создаем адрес, который свяжется с сокетом:sin.sin_family = AF_INET;sin.sin_port = htons (1234);// копируем сетевой номер:memcpy ( &sin.sin_addr, hp->h_addr, hp->h_length);// связываем адрес с сокетомif ( bind ( d, (struct sockaddr *)&sin, sizeof (sin)) < 0 ){perror (“server: bind”);exit (1);}// слушаем запросы на сокетif ( listen ( d, 5) < 0 ) {perror (“server: listen”);exit (1);}// связываемся с клиентом через неименованный сокет с дескриптором d1;// после установления связи адрес клиента содержится в структуре fromsinfromlen = sizeof fromsin;if((d1 = accept ( d, (struct sockaddr *)&fromsin, &fromlen)) < 0){perror (“server: accept”);exit (1);}/* ----------------------------------------- */// читаем сообщения клиента, пишем клиенту:fp = fdopen (d1, “r”);c = fgetc (fp);/* ...................................
*/send (d1, “server”, 7, 0);/* ................................... */putchar (c);/* ................................... */close (d);exit (0);}15Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.Ниже приводятся примеры оболочек программ для «Клиента» и «Сервера» для сетиЭВМ, основанных на объектно-ориентированном интерфейсе для работы с сокетами(одна из возможных реализаций интерфейса приводится в приложении).3.5. Пример-оболочка программы «Клиент» длясети ЭВМ в объектно-ориентированномстиле#include <iostream>#include "sock_wrap.h"//см. приложениеusing namespace std;using namespace ModelSQL;#define PORT_NUM 1234//////////// номер порта процесса-сервераВ этом примере клиент и сервер выполняются на одном компьютере,но программа легко обобщается на случай разных компьютеров.
Дляэтого можно, например, использовать сетевое имя не собственногокомпьютера, как ниже, а имя компьютера, на котором выполняетсяпроцесс-серверint main(int argc, char* argv[]){try {char host[64];// запрос сетевого имени собственной ЭВМif (gethostname(host, sizeof host) < 0) {// ошибка --- досрочно завершаем выполнениеcerr << GetLastError();perror("Host name");exit (−1);}// создаём сокетInClientSocket sock(host, PORT_NUM);// устанавливаем соединениеsock.Connect();// отправляем серверу строкуsock.PutString("Hello from client!");// печатаем на экран ответ от сервераcout << "Read from server: " << sock.GetString() << endl;// продолжаем диалог с сервером, пока в этом есть необходимость// ...} catch (Exception & e) {// ошибка --- выводим текст сообщения на экранe.Report();}return 0;}16Модельный SQL-интерпретатор.
Методическое пособие.3.6. Пример-оболочка программы «Сервер» длясети ЭВМ в объектно-ориентированномстиле#include <iostream>#include "sock_wrap.h" //см. приложениеusing namespace std;using namespace ModelSQL;#define PORT_NUM 1234 // номер порта процесса-сервераclass MyServerSocket : public InServerSocket {public:MyServerSocket () : InServerSocket (PORT_NUM) {}protected:void OnAccept (BaseSocket * pConn){// установлено соединение с клиентом, читаем сообщениеcout << "Read from client: " << pConn->GetString() << endl;// отправляем ответpConn->PutString("Hello from server.");// продолжаем диалог с клиентом, пока в этом есть необходимость// ...delete pConn;}};int main(int argc, char* argv[]){try {// создаём серверный сокетMyServerSocket sock;for (;;)// слушаем запросы на соединениеsock.Accept();} catch (Exception& e) {// ошибка --- выводим текст сообщения на экранe.Report();}return 0;}4.
БД и СУБДОбычно, говоря о базе данных, подразумевают некоторый программный комплекс,имеющий в своем составе следующие основные компоненты: непосредственно базуданных (БД), систему управления базой данных (СУБД) и язык данных (язык общенияпользователя с БД, в нашем случае это модельный язык SQL).17Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.Собственно БД — совокупность данных, хранящихся во внешней памяти. Всоответствии с [4] обычно в БД выделяют три основных уровня хранения информации:внутренний, внешний и концептуальный.
«Внутренний уровень (также называемыйфизическим) наиболее близок к физическому хранилищу информации, т.е. связан соспособами сохранения информации на физических устройствах. Внешний уровень(также называемый пользовательским логическим) наиболее близок к пользователям,т.е. связан со способами представления данных для отдельных пользователей.Концептуальный уровень (также называемый общим логическим или простологическим) является «промежуточным» уровнем между двумя первыми ...
и связан собобщенным представлением пользователей о БД»[4].СУБД — программа, которая управляет всем доступом к базе данных. В общих чертахэто происходит следующим образом:— пользователь выдает запрос на доступ к БД, используя конкретный языкданных;— СУБД принимает запрос, анализирует и интерпретирует его, обследуя поочередивнешнеепредставление,отображение«внешний —концептуальный»,концептуальноепредставление,отображение«концептуальный — внутренний» и структуру хранения;— СУБД выполняет необходимые операции над хранимой БД;— СУБД выдает ответ пользователю, сначала выбирая все требуемыеэкземпляры хранимых записей, затем получая экземпляры концептуальныхзаписей и уже потом формируя требуемый экземпляр внешней записи.Ядром любой системы данных является модель данных, которая в частностиопределяет выбор языка данных.
Имеются три широко известные модели данных:реляционная, иерархическая и сетевая [4].В данной разработке для хранения информации предлагается создать реляционную БД,состоящую из нескольких (2-5) таблиц.На логическом (концептуальном) и внешнем уровнях каждая таблица представляетсобой совокупность записей. Все записи одной таблицы имеют одинаковую структуру.Каждая запись состоит из нескольких полей.С каждым полем связываются следующие характеристики: имя поля, тип поля (домен),длина поля и значение поля.Имена, типы, и длины полей задаются при определении структуры таблицы.На физическом (внутреннем) уровне таблицы предлагается реализовать с помощьюготовой библиотеки функций для работы с файлами данных.
Файл с таблицей помимоданных (записей) содержит описание структуры таблицы, определяющей поля даннойтаблицы. Эта структура загружается в оперативную память при открытиисоответствующей таблицы и используется при всех операциях, производимых надтаблицами.Для работы с таблицами реализована следующая функциональность (соответствующуюбиблиотеку классов можно найти на сайте кафедры алгоритмических языковhttp://www.al.cs.msu.ru):— создание новой таблицы,— удаление существующей таблицы,— открытие существующей таблицы,— перемещение по записям таблицы,— редактирование отдельных записей таблицы,— добавление новых записей в таблицу,18Модельный SQL-интерпретатор.
Методическое пособие.— удаление существующих записей из таблицы.Операции работы с таблицами реализованы через операции базового (<io.h>) вводавывода:— создание или открытие файла (open),— закрытие файла (close),— удаление файла (unlink),— чтение из файла (read),— запись в файл (write),— установка на определенную позицию в файле (lseek).Каждая таблица описывается одним файлом данных. Этот файл состоит из двух частей:заголовка, в котором описывается структура таблицы, и собственно записей.
Заголовоксодержит информацию о числе полей и для каждого поля — его тип (строковый илидлинный целый). Для строковых полей, кроме того, хранится их длина.Ниже приводится объектно-ориентированный интерфейс управления таблицами (файлdbms.h), который необходимо использовать для выполнения задания.#if !defined _DBMS_H_#define _DBMS_H_#include <vector>#include <string>using namespace std;class Xception {public:stringvirtual voidvirtual};Message;PrintMessage ();Xception () {}Xception ( const string& aMessage ){ Message = aMessage; }Xception ( const Xception& xception ){ Message = xception.Message; }~ Xception () {}class IField {public:enumTypevirtual TypeOfTypevirtual string & Textvirtual long & Long};{ TEXT, LONG };() = 0;() = 0;() = 0;class ITextField: public IField {public:virtual long & Long() { throw Xception (); }};class ILongField: public IField {public:virtual string & Text() { throw Xception (); }};19Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.class ITableStruct {public:virtual ITableStruct * AddTextvirtual ITableStruct * AddLongvirtual ITableStruct * SetName};( const string& Name, int Length ) = 0;( const string& Name ) = 0;( const string& Name ) = 0;class ITable {public:static ITable* Create( ITableStruct * TableStruct );static ITableStruct * CreateTableStruct ();static voidDrop( const string & Name );static ITable* Open( const string & Name );virtualvirtualvirtualvirtualvirtualvirtualvirtualvirtualvoidvoidvoidIFieldboolboolvoidAddDeleteDrop* GetFieldReadFirstReadNextUpdate~ ITable() = 0;() = 0;() = 0;( const string& Name ) = 0;() = 0;() = 0;() = 0;() {};};#endifСоздание или открытие существующей таблицы происходит через статическиефункции Create и Open интерфейсного класса ITable, которые в случае успехавозвращают указатель на экземпляр, реализующий интерфейс ITable.
Такие функцииназываются производящими. Данный интерфейс позволяет осуществлять чтение,модификацию, добавление и удаление записей таблицы. Для формирования новойтаблицы необходимо задать структуру будущей таблицы, используя интерфейсITableStruct.ITableStruct * Struct = ITable::CreateTableStruct ();Struct->SetName ( "mytable" );Struct->AddText ( "Name", 10 );Struct->AddLong ( "Age" );// или короче:// Struct->SetName("mytable")->AddText("Name",10)->AddLong("Age");ITable * Table = ITable::Create ( Struct );После формирования новой таблицы описание её структуры Struct агрегируется внутриэкземпляра Table, поэтому вручную уничтожать Struct не нужно.