База данных
Движки будут плагинами к приложению.
Начнем с того что намечается поддержка сразу 3х движков БД. Это:
- PostgreSql - Документация, ru.wikipedia, Неплохое описание
- Firebird - Документация, ru.wikipedia
- SqLite - Документация, ru.wikipedia
Для начала имхо нужно сделать один движек (думаю в сторону PostgreSql), а потом уже можно будет и прикручивать остальное.
Далее, примем за аксиому, что у клиента БД должно быть описание своих таблиц, и клиент должен сам следить за их состоянием. Отсюда вытекает, что клиент должен уметь создавать, удалять, изменять свои таблицы, ключи, триггеры и прочее. Для обеспечения безопасности остальных данных думаю ввести понятие "префикс клиента в БД". Собственно ничего сложного тут нет. Просто таблицы, ключи, триггеры, функции итд будут автоматом получать некий префикс, созданый клиентом. На примере rsdn это будет скажем rsdn_messages, rsdn_PK_forums, итд.
Решил все это дело основать на объектной модели БД. Клиенты БД не будут иметь дело непосредственно с sql, sql будет создаваться из модели БД. Данный подход позволит отслеживать также и структуру БД клиента. Сама-же объектная модель делится на объетную модель БД и модель запросов. Модель БД описывает структуру БД клиента (таблицы, их поля, индексы...), Модель запросов, отталкиваясь от модели БД описывает запросы к БД. Подразумевается, что запросы не будут динамическими, а будут меняться лишь их параметры (условия отбора). Это позволит создавать текст требуемых запросов при старте программы и в дальнейшем уже просто подставлять требуемые данные в условия отбора.
Данная методика позволит абстрагироваться от используемого движка БД.
Итак. Есть абстрактный клиент, есть абстрактный движок, есть общий класс БД (окбд). Действия по порядку.
- Создаем экземпляр окбд
- Смотрим в настройки, выбираем движок. БД должна уже существовать
- Коннектимся к БД
- Создаем экземпляр клиента
- Вызываем метод дефайна БД клиента, передавая в него экземпляр движка
- В этом методе создаем список таблиц, и вызываем методы движка для проверки/создания таблиц
- Тутже для каждой таблицы создаем движком (исходя из таблиц) скрипты выборки/вставки/обновления, опираясь на примари кей таблицы
- Создаем специфические запросы базе данных
- Все запросы сохраняем поименно в клиенте в мапе запросов
- Убиваем созданные классы