Доброго дня!
Несколько лет я развиваю некий набор инструментов для работы с СУБД из лиспа. Он в настоящее время основан на 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;
")
При этом, можно менять код по одной процедуре (как в лиспе), менять один файл исходника или пересобирать все процедуры серверной части.
Текущие задачи:
- задокументировать
- опубликовать
- написать ТЗ для приведения в божеский вид
- полностью переписать (на питоне?)
Если кому интересно - пишите в этой теме.
Ответ на:
комментарий
от Miguel
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от Uncle_Theodore
Ответ на:
комментарий
от Uncle_Theodore
Ответ на:
комментарий
от den73
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Запрос с использованием массива (2020)
- Форум PostgreSQL scripts examples (2022)
- Форум Получение набора записей по курсору (2019)
- Форум Слоупоки и ленивцы 10 лет рожали торпедного феникса. Родили: Firebird 3.0.0 (2016)
- Форум Виртуальная Машина Определить набор инструментов (2017)
- Форум лисп (2005)
- Форум Лисп (2002)
- Форум Рефакторинг лиспа средствами самого лиспа (2011)
- Форум Закапывателям лиспа (2012)
- Форум лисп биллинг (2009)