fox.orient-time.ru

Новая жизнь Старого Лиса + MySQL

(связываем FPD и MySQL)

 

Несмотря на преклонный возраст FoxPro 2.6 для DOS он все еще остается популярным среди разработчиков СУБД.  Созданным еще  в  те времена, когда процессор i486 был самым новым, а решать задачи приходилось на больших объемах, FoxPro остается одним из самых оптимальных и быстрых. Конечно, быстрота достигнута в ущерб надежности хранения данных. По этому хотелось бы получить средства быстрой разработки для работы с базами данных и,  при этом, получить все преимущества клиент серверных СУБД.

Среди популярных сегодня клиент серверных СУБД можно выделить MySQL. По этому была поставлена задача: соединить FoxPro 2.6 для DOS и MySQL.

Какие же преимущества можно получить при использовании тандема FoxPro для DOS и MySQL? Во-первых, остается возможность, не изменяя интерфейса старых программ (которые могут работать годами, устраивая и операторов и самих разработчиков), получить новый продукт, который будет работать, используя, клиент серверные технологии. Во-вторых, используя собственные реляционные возможности самого FoxPro для DOS, можно построить работу так, что трафик для передачи данных будет меньше. Можно сказать, что тандем FoxPro для DOS и MySQL имеет все преимущества, которыми обладает каждый из них.

 

Почему FoxPro для DOS

Автора часто спрашивают, почему, несмотря на бурное развитие новых СУБД, он все еще отдает предпочтение FoxPro для DOS. Вот какие преимущества видит автор:

1.      Работа под операционными системами DOS и Windows.

2.      Работа на машинах, начиная с процессора i386 и 2 Мегабайт памяти.

3.      Текстовый режим монитора, а, значит, работа на любых мониторах и видеоадаптерах. Кроме того, не используются дополнительные затраты процессора, для рисования графических  структур. Хотя многие и относят текстовый режим к недостаткам, автор является большим сторонником указанного режима работы интерфейса.

4.      Простая структура файлов для хранения данных.

5.      Неплохое быстродействие и отличное использование индексов.

6.      Поддержка многопользовательского режима и сети.

7.      Занимает мало места на диске.

8.      Удобная работа с интерфейсом.

9.      Поддержка диалогового и программного режимов.

10.   Самообновление данных  при работе в сети.

11.   Фактическая бесплатность продукта (хотя вопрос бесплатности четко не понятен автору).

 

Но, чтобы не создалось впечатления, что FoxPro для DOS «идеальная» СУБД автор укажет и недостатки, какие он видит.

1.      Низкая защита от сбоев  файлов, в которых хранятся данные. Хотя наиболее частые сбои, когда в шапке таблицы хранится неверная информация о количестве записей. Корректируется простой подстановкой верного числа.

2.      Возможно большой трафик при работе в сети.

3.      Некоторые другие, на которые автор не обращает внимание.

 

Почему MySQL

СУБД MySQL одна из немногих, с которыми пришлось сталкиваться. Кроме того, это единственная СУБД с алгоритмом передачи по сети которой, знаком автор. При этом очень понравилась оптимальность использования трафика. Поскольку значительных преимуществ и недостатков по сравнению с иными СУБД  указать трудно, выбор MySQL можно считать простой симпатией.

 

Некоторые замечания при построении алгоритмов работы

 с базами данных для тандема FoxPro для DOS и MySQL

Как было указано ранее, кроме преимуществ, которыми обладает каждая и указанных СУБД, появилось еще одно преимущество, которое хотелось бы особо отметить.

Рассмотрим следующий пример: на сервере есть 2 таблицы. Первая называется Таблица1, в которой 200 000 строк, каждая из которых имеет размер 1 000 байт, вторая – Таблица2, в которой 100 строк, каждая из которых имеет размер 100 байт. Обе таблицы связаны по некоторому полю соотношением много к одному (Таблица1 –> Таблица2). Клиенту нужно получить таблицу, в которую входят все столбцы из двух таблиц. При этом, по условию, в новую таблицу Таблица3 входит 100 000 строк с Таблицы1.

Случай 1. Обработка ведется средствами FoxPro для DOS.  По сети будет передаваться полностью Таблица1 и Таблица2. Суммарно трафик  будет таким: 200 000 строк * 1 000 байт + 100 строк * 100 байт = 200 010 000 байт. Сама Таблица3 будет занимать (1 000 + 100) байт * 100 000 строк = 110 000 000 байт. (Нужно отметить, что расчеты приблизительны, так как по сети передается еще и служебная информация. Кроме того, используя индексы FoxPro для DOS не обязательно будет «тянуть» все строки с Таблицы1 ).

Случай 2. Обработка ведется средствами MySQL.  По сети будет передаваться полностью Таблица3 как результат выполнения запроса на сервере. Суммарно трафик  будет таким:  (1 000 + 100) байт * 100 000 строк = 110 000 000 байт. (Опять отметим, что расчеты приблизительны, так как по сети передается еще и служебная информация. Кроме того MySQL не передает пустые пробелы).

Случай 3. Обработка ведется средствами тандема FoxPro для DOS и MySQL.  Построим алгоритм следующим образом: по сети будет передаваться 100 000 строк из Таблицы1, которые удовлетворяют условию и вся Таблица2 как результаты выполнения запросов на сервере. На клиентской стороне Таблица3 будет создана, как результат связи средствами FoxPro для DOS двух полученных таблиц. Суммарно трафик  будет таким:  100 000 строк * 1000 байт + 100 строк * 100 байт = 100 010 000 байт. (Расчеты приблизительные).

Итак: 200 010 000 байт (FoxPro), 110 000 000 байт (MySQL),

100 010 000 (FoxPro для DOS и MySQL).

Если же убрать условие фильтрации, то получим такие результаты:

200 010 000 байт (FoxPro),  220 000 000 байт (MySQL),

200 010 000 (FoxPro для DOS и MySQL). Видно, что трафик в обоих случаях при использовании FoxPro для DOS и MySQL будет меньше.

Укажем еще один пример экономии трафика. Многие операторы часто просматривают одни и те же данные в разных режимах сортировки. При классической работе клиент серверных  приложений каждый раз должен отправляться запрос на сервер с указанием новой сортировки, и возвращаться будут те же данные, но в ином порядке сортировки. В случае же работы FoxPro для DOS и MySQL можно получить таблицу в одном из видов сортировки, а саму сортировку производить уже на клиентской части. Время, потраченное на локальную сортировку  средствами FoxPro, будет меньше, чем на получение нового запроса. Кроме того, таким способом можно сэкономить, не используя некоторые индексы на сервере. Описанный алгоритм годится также для работы, когда клиент часто фильтрует одни и те же данные. То есть, клиенту отправляется большая выборка, а локально она уже фильтруется.

Также хотелось бы отметить работу с каталогами и справочниками. Практически в каждой БД есть таблицы-каталоги или таблицы-справочники. Особенностью таких таблиц есть то, что они очень редко модифицируются. Таким образом, все справочники можно хранить локально, на клиентской части, и время от времени проводить синхронизацию с сервером. Реляции со справочниками тогда нужно производить на клиентской части средствами FoxPro.

Еще одно преимущество перед другими СУБД, которое дает использование указанного тандема. Это возможность реляционной связи таблиц, которые находятся не только в разных базах данных, но и на разных серверах которые доступны под разными правами и паролями. Отдельно пересылается каждая из таблиц на локальную станцию, где они связываются средствами FoxPro.

 

Автор также будет рад, если ему укажут еще способы оптимальной работы FoxPro для DOS и MySQL.

 

Библиотека FoxMySQL

Для связи FoxPro для DOS и MySQL была написана библиотека FoxMySQL. Библиотека foxmysql использует разработанную Кузнецовым Валерой библиотеку FsOX, поддержки TCP/IP протокола на базе Sockets API в окружении FoxPro 2.5 for DOS (для Windows 95/98). Получить FsOX  и подробно ознакомиться с указанной библиотекой можно на http://natalie-tours.ru/my/fsox/.  Библиотека FoxMySQL находится на http://mirko.narod.ru/foxmysql/

        В библиотеке foxmysql реализовано:
1) подключение к MySQL-серверу;
2) выбор базы данных;
3) вставка, модификация и удаление записей;
4) получение выборок в текстовый файл с разделителями между полями.
5) получение выборок в dbf-файл.

При экспериментах было замечено, что тандем FoxPro для DOS и MySQL работает быстрее, чем тестовые программы под Windows.

 

Пример, с помощью которого автор тестировал библиотеку:

 

set cons on

set talk off

set echo off

set stat off

set conf on

set safe off

 

set CLEAR    OFF

set ESCAP    OFF

set BLINK    OFF

set BORD     to

set DATE     to GERMAN

set CENTURY  ON

set COLOR of NORM   to W+/B

set COLOR of FIELDS to N/W*

 

clear all

close all

 

CrLf=chr(13)+chr(10)

 

 

#DEFINE mysql_port  3306

 

SET LIBR to FsOX_x.PLB, pass.plb addi

SET PROCEDURE TO FoxMySQL

 

Public IP,url,ErrMsg,MErrCod,AffRows

IP=chr(192)+chr(168)+chr(1)+chr(1)

=x_Show('[]')

tt = MySQLCon(IP,mysql_port,'gamer','gamer','MySQL.log','MySQL.buf')

=MySQLUseDB(tt,'test','MySQL.log','MySQL.buf')

*? MySQLChange(tt,'create table proba (fir int unsigned auto_increment not null primary key, text char(5), ;

* decc decimal (6,3), data date)','MySQL.log','MySQL.buf')

*? MySQLIns(tt,"insert into tovtmp (nazva) values ('䪥i ¯')",'MySQL.log','MySQL.buf')

*? MySQLChange(tt,'update tovtmp set un=18 where 1=1','MySQL.log','MySQL.buf')

*=MySQLChange(tt,'drop table proba','MySQL.log','MySQL.buf')

*=MySQLChange(tt,'delete from proba where text=18','MySQL.log','MySQL.buf')

*=MySQLUseDB(tt,'mysql','MySQL.log','MySQL.buf')

t0=time()

? 'Begin: '+t0

*? MySQL2File(tt,'','select * from tovar where 1=0',.t.,'|','MySQL.log','MySQL.buf')

*? MySQL2File(tt,'','explain tovar',.t.,'|','MySQL.log','MySQL.buf')

*? MySQL2File(tt,' ','select * from prih',.t.,'|','MySQL.log','MySQL.buf')

*? MySQL2dbf(tt,'proba.dbf','explain tovar','MySQL.log','')

? MySQL2dbf(tt,'proba.dbf','select * from ttr','MySQL.log','')

? 'Error: '+ErrMsg+' '

?? MErrCod

*use proba

*brow

*=MySQL2File(tt,'proba.txt','select * from tovtmp',.t.,'|','MySQL.log')

*=MySQL2File(tt,'proba.txt','select * from prih',.t.,'|','MySQL.log','MySQL.buf')

*=MySQL2File(tt,'proba.txt','select * from bigtable',.t.,'|','MySQL.log','MySQL.buf')

*=MySQL2File(tt,'proba.txt','show columns from prih',.t.,'MySQL.log','MySQL.buf')

*=MySQL2File(tt,'proba.txt','select a.unpost, b.nazva from postach b, prih a',.t.,'|','MySQL.log','MySQL.buf')

*=MySQLQuery(tt,'select * from prih limit 1,5')

*=MySQLQuery(tt,'explain prih','MySQL.log')

? 'End: '+time()

? closesock(tt)

*set procedure to

*SET LIBR to

Return

 

GAMER (gamer[]ukr.net)


fox.orient-time.ru



Хостинг от uCoz