Ada_Ru форум

Обсуждение языка Ада

Ada и базы данных

Оставить новое сообщение

Сообщения

Vadim Godunko
Ada и базы данных
2004-02-12 08:03:20

Добрый день!

 

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

 

Общая идея заключается в создании абстрактного типа для "драйвера" сервера базы данных. Естествонно, результат выполнения запроса также является абстрактным типом.

 

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

 

Если конкретная реализация сервера имеет свои собственные типы данных то возможно расширение используемого набора типов. При этом нет необходимости изменять модули базовой функциональности.

 

Остально - в скудных комментариях.

 

Буду очень признателен за любую критику и предложения.

 

 

-- Vadim Godunko

Maxim Reznik wrote:

 

Ну дело еще не кончилось. Текущую версию я прицепил, если интересно.

Спасибо, посмотрю.

 

По сравнению с тем, что обсуждалось, были сделаны следующие изменения:

1) Типы Session и Statement перестали быть class_wide.

2) Добавлена возможность работы в различных кодировках.

Вот это интересно. А какая кодировка используется внутри приложения?

 

 

Настораживает прямой доступ к строкам таблици по индексу.

Как это реализовать практически, для таблицы в 10_000_000 строк?

Естественно такой фокус не выйдет. Но как сделать правильно, я просто не знаю.

 

Разве есть БД поддерживающие такой доступ на уровне API?

 

Есть. :(

 

Абстрагирование типов параметров запросов и результатов хорошо

для реализации интерфейса, но как писать приложения для

работы с любой базой данных, если каждая БД будет оперировать

своим набором типов? Или такая задача не ставится?

 

Драйвер БД отвечает за преобразование типов базы в адские типы. И обратно.

 

 

-- Vadim Godunko

On Fri, Feb 13, 2004 at 12:55:18PM +0300, Vadim Godunko wrote:

Maxim Reznik wrote:

По сравнению с тем, что обсуждалось, были сделаны следующие изменения: 1) Типы Session и Statement перестали быть class_wide.

2) Добавлена возможность работы в различных кодировках.

Вот это интересно. А какая кодировка используется внутри приложения?

С кодировками такая петрушка:

1) Для некоторых БД можно/нужно указывать в какой кодировке

идет обмен между БД и приложением. Если это правильно указать,

драйвер будет правильно интерпретировать символы и

можно работать с Wide_String не зависимо от конкретной кодировки.

2) Часто приложения хранят в типе String не Latin_1, как по стандарту, а другие 8-битные кодировки. Так вот, я добавил процедуру

Set_Client_Encoding, которая заставляет драйвер переводить

символы в нужную клиенту кодировку.

Так, например, можно подсоединится к Intervase-у в кодировке

Win_1251 и правильно получать руссике буквы, а поставив

Client_Encoding в UTF-8, сразу отдавать значения в GtkAda,

без ручной перекодировки.

Этот же механизм позволяет избежать двойного перекодирования

db-charset -> Wide_String -> String, если кодировки БД

и клиентского приложения совпадают.

 

Кривь?

 

 

Настораживает прямой доступ к строкам таблици по индексу.

Как это реализовать практически, для таблицы в 10_000_000 строк?

Естественно такой фокус не выйдет. Но как сделать правильно, я просто не знаю.

Меня в БД обычно устраивает последовательный доступ к строкам.

Но при реализации GtkAda Tree_View_Model понадобился произвольный доступ, я сделал кеш поверх моего API и получил произвольный

доступ к любым БД, даже к тем, которые не поддерживают

прямого доступа к строкам.

 

 

Разве есть БД поддерживающие такой доступ на уровне API?

 

Есть. :(

 

Postgress? Вот Interbase и Oracle такого не дают.

Там даже фетчить назад нельзя.

 

--

Vadim Godunko

Максим

Maxim Reznik wrote:

 

С кодировками такая петрушка:

1) Для некоторых БД можно/нужно указывать в какой кодировке

идет обмен между БД и приложением. Если это правильно указать,

драйвер будет правильно интерпретировать символы и

можно работать с Wide_String не зависимо от конкретной кодировки.

2) Часто приложения хранят в типе String не Latin_1, как по стандарту,

а другие 8-битные кодировки. Так вот, я добавил процедуру

Set_Client_Encoding, которая заставляет драйвер переводить

символы в нужную клиенту кодировку.

Так, например, можно подсоединится к Intervase-у в кодировке

Win_1251 и правильно получать руссике буквы, а поставив

Client_Encoding в UTF-8, сразу отдавать значения в GtkAda,

без ручной перекодировки.

Этот же механизм позволяет избежать двойного перекодирования

db-charset -> Wide_String -> String, если кодировки БД

и клиентского приложения совпадают.

 

Кривь?

 

Кривь, не кривь, а по другому не выйдет. В своей версии я принял решение обработку данных внутри приложения проводить в Unicode. А в зависимости от поставщика и потребителя данных (а это получается целый зоопарк: Windows, Linux, FreeBSD, ...) производить перекодировку на входе/выходе.

 

 

Postgress? Вот Interbase и Oracle такого не дают.

Там даже фетчить назад нельзя.

 

Postgres, MySQL. Немного подумав, я тоже убрал возможность произвольного доступа. Так будет значительно лучше.

 

Ещё попробовал написать драйвер для MySQL. Пока заткнулся на его своеобразной совместимости со стандартом SQL...

 

PS. А Interbase можно где-то скачать?

 

-- Vadim Godunko

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти