LINUX.ORG.RU

[лисп] набор инструментов для работы с СУБД


0

0

Доброго дня!
Несколько лет я развиваю некий набор инструментов для работы с СУБД из лиспа. Он в настоящее время основан на SQL-ODBC нужен для всякого рода мета-работ, нужных при разработке БД.

Набор включает в себя:
- средство генерации сорсов на любом языке на базе квазицитирования. В изначальной форме он просто позволяет коротко записывать способы форматирования списков. Например,

(let ((c 'asdf))
`("," a 'b ,c)) будет напечатано как a,"b",asdf
здесь 'b означает, что b - это строка и должна быть заключена в кавычки согласно правилам синтаксиса целевого языка.

В общем, ничего особенного тут нет, просто ещё один способ форматировать данные. Ну и плюс к тому, можно встраивать в код вызовы функций (тоже возвращающие дерево) и некоторые конструкции, например, конкатенацию строк, if и progn, которые расширяются в соответствующие конструкции целевого языка.

- модель метаданных СУБД. Позволяет задавать определения таблиц БД примерно вот в таком виде:

(deftbl client "клиент"
'((id (int) nil)
(name (varchar 255) "Название")
(type (ref client_type) "Тип" :show-attrs ("Тип" :column-width 12)))
:primary-key '(id)
)

Смысл тут в том, что можно навешивать на таблицу или поле более-менее произвольные дополнительные атрибуты. От CASE-средств данный формат отличается читабельностью представления и возможностью хранить его в системе контроля версий.

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

- поддержка пересборки БД. Я работаю с firebird, где сложно поддерживать базу из-за зависимостей между объектами. Моя среда позволяет держать серверную часть в виде набора файлов с определениями типа:

(alter-procedure 'begin_user_session
:returns '((ref_user_session integer))
:vars '((start_time timestamp))
:doc "Вызывается в начале работы программы для открытия сессии"
:body "
delete from user_open_session where user_open_session.\"CURRENT_CONNECTION\" = current_connection;
ref_user_session=gen_id(g_default,1);
start_time=current_timestamp;
insert into user_session (id,start_time) values (:ref_user_session,:start_time);
insert into user_open_session (ref_user_session,start_time) values (:ref_user_session,:start_time);
suspend;
")

При этом, можно менять код по одной процедуре (как в лиспе), менять один файл исходника или пересобирать все процедуры серверной части.

Текущие задачи:
- задокументировать
- опубликовать
- написать ТЗ для приведения в божеский вид
- полностью переписать (на питоне?)

Если кому интересно - пишите в этой теме.

★★★★★

Ответ на: комментарий от den73

TLDR -- это англоязычный вариант русской фразы "Ниасилил многабукф".
Ну хорошо, молодец, что разрабатываешь. Документируй, публикуй. Полный одобрямс. :)

Uncle_Theodore ★★
()
Ответ на: комментарий от Uncle_Theodore

На самом деле, я набил этот постинг в порыве энтузиазма, когда решил (как мне кажется) проблему зависимостей в firebird. А потом просто стало жалко его стирать, вот он и появился тут на форуме. На самом деле, если пытаться продвинуть эту тулзень, сложно будет подыскать аргументы, зачем она нужна.

den73 ★★★★★
() автор топика
Ответ на: комментарий от Uncle_Theodore

На самом деле, я набил этот постинг в порыве энтузиазма, когда решил (как мне кажется) проблему зависимостей в firebird. А потом просто стало жалко его стирать, вот он и появился тут на форуме. На самом деле, если пытаться продвинуть эту тулзень, сложно будет подыскать аргументы, зачем она нужна.

den73 ★★★★★
() автор топика

Это замена sql и реляционным таблицам?
ээээ... не хватило уровня просветления, вернусь после левелапа за квестом, пойду качаться на чём-нить простом и пушистом, типа "Символическая логика и разумные машины": Эдмунда Беркли ;)

dimon555 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.