Моя перзистентная система

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Ваше мнение:

Мне как раз такой и не хватало!
2
8%
Полезная вещь.
11
44%
Для меня, увы, неприменима.
10
40%
Бесполезна.
2
8%
 
Всего голосов : 25

Моя перзистентная система

Сообщение Cheb » 20.08.2006 19:25:29

:idea: Теперь и для дельфинов!

Меня всегда страшно доставал тот факт, что при добавлении любой новой структуры данных приходится убивать уйму времени на нудный, совершенно нетворческий процесс создания для этой структуры механизма сохранения/загрузки. А от стандартных published свойств толку - как от козла молока. В основном из-за того, что нет механизма, проверявшего бы не упустил ли ты чего и не перепутал ли - после каждого изменения всё опять приходится тестировать на работоспособность.

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

:( Сразу должен предупредить: штука вряд ли портируемая за пределы intel-32

8) Веб-страница проекта, где лежит архив, включающий все нужные исходники и готовый демо-пример.

8) 20 сентября 2006: портрована на Дельфи.

8) 13 сентября 2006: разрешён конфликт с Лазарусом, блокировавший работу автозавершения кода и навигации по Ctrl-щелчку. Нужен Лазарус не ниже 0.9.16 (более старые давятся calling conventions при процедурных типах).
Последний раз редактировалось Cheb 20.09.2006 21:12:47, всего редактировалось 2 раз(а).
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение zub » 20.08.2006 23:22:06

Полезная штука. спасибо что выложил.
zub
долгожитель
 
Сообщения: 2072
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Cheb » 31.08.2006 19:28:12

Обновление. Исправлены ранее не замеченные баги. :oops: Адрес файла - тот же.

1. Не был зарегистрирован тип boolean.
2. Невозможно было зарегистрировать динамические массивы
3. Невозможно было зарегистрировать поля, имевшие тип класс-но-не-наследник-TTrulyPersistent
4. При регистрации класса временный экземпляр удалялся обычным дестрактором (через Free), что приводило к падению при регистрации классов, что-либо в этом дестракторе освобождавших. Очень мерзкий баг. :x Приделал специальный "пустой" дестрактор.

8) Хочу добавить, что собираюсь эксплуатировать эту перзистентную систему наиактивнейшим образом, строя на ней все свои дальнейшие проекты, поэтому любые баги будут непременно выявлены и зверски удавлены. :evil: Вот. :roll:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 01.09.2006 19:50:41

Обновление №2. Устранено одно неудобное ограничение. :D Адрес файла - тот же.

Теперь возможна "вложенная" регистрация, когда RegClass() вызывается из самого метода RegisterFields(). *Без* этой фичи работать было удобно, как плавать в валенках.

Смешивать вызовы RegClass() и RegField(), всё-таки, нельзя: первые должны идти впереди последних.

Пока не исправлено: (список на будущее)
1. - ругается если класс зарегистрировать дважды. В результате, если класс-предок регистрировал классы в своём методе RegFields(), то одновременно и его и потомка зарегистрировать не удастся: без вызова inherited потомка пошлют "а где начало?", с вызовом inherited - пошлют, потому что это попытка перерегистрировать зарегистрированный предком класс. Пока единственный обход - тупо копировать содержательную часть RegisterFields() предка потомку, и не использовать inherited.

2. - ругается при чтении на неизвестные классы-потомкки TTrulyPersistent. В принципе-то информации чтобы послать их лесом и грузить дальше в cge-файле хранится достаточно, но надо делать специальный алгоритм. А пока совместимость "сверху вниз" серьёзно ограничена.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 13.09.2006 14:36:26

13 сентября:

:D Большой и толсты пряник! Разрешён конфликт с Лазарусом, блокировавший работу автозавершения кода и навигации по Ctrl-щелчку. Нужен Лазарус не ниже 0.9.16 (более старые давятся calling conventions при процедурных типах).

скачивать с этой страницы, старая ссылка на файл более недействительна.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 15.09.2006 21:47:06

Идёт адаптация системы к Turbo Delphi. Улита едет, пока-то все AV попой сосчитает... :x

Заранее могу сказать, что в Дельфи-версии не будет поддержки MD5 (запись всегда без ея, чтение с игнорированием ея). :?

Ещё возможна некотороя потеря скорости из-за преобразования булевых полей на лету (в файле всегда храня в формате ФриПаскаля (0,1), а у Дельфи - (0, $ffffffff)).
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 18.09.2006 19:37:49

:evil: Чистый, концентрированный геморрой. Дельфи не только RTTI для записей и статических массивов генерировать отказывается (пришлось знатно переиначивать процедуры регистрации), не только арифметику с указателями выполнять не умеет (надо вручную к cardinal приводить и обратно), но ещё и VMT прячет в защищённой от записи памяти!..

Пришлось отряхивать пыль со старых умений, и лезть ковыряться через VirtualProtect и иже с ним. В результате логи Дельфёвской версии блещут такими вот перлами:
Class registration start: TTrulyPersistentTester
Class VMT is write-protected. Removing the protection at 02611748h...
Success. Gained write access for 81920 bytes at 02600000h.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 19.09.2006 12:20:21

И вот, наконец, она откомпилировалась! :) И запустилась! :D И...

Crashed writing to basket the object #1.
Access violation at address 0000000A. Read of address 0000000A


АААРГХ!!! Изображение

Не угадал-таки позицию своих методов в VMT, и затёр что не надо :x
Копаем дальше :(
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 20.09.2006 21:10:49

Портирование завершено. :D
Выложил. 8)
Добро пожаловать.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 23.11.2006 20:49:49

Апдейт. Обновил на SourceForge.net.

Новые фичи:
-- возможность "матрёшечной" регистрации классов прямо из метода RegisterFields(). Кроме того, больше не падает :oops: при попытке зарегистрировать уже зарегистрированный класс.
-- поддержка array [<перечислимый тип>] of <базовый тип>. Позволяет наконец на деле припахать механизм "прозрачной" конверсии перечислимых типов. 8)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 25.11.2006 22:55:08

Обновил до 0.6.1.

Процедура
Код: Выделить всё
  {deprecated} procedure RegType(StringID: ansistring; //must match Info^.Name
                    Info, BaseType, IndEnum: PTypeInfo); overload;   

заменена на
Код: Выделить всё
  procedure RegType(Info, BaseType, IndEnum: PTypeInfo);  overload;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 23.02.2007 14:12:29

Чтобы кто не думал, что оно умерло, готовлю большое и толстое обновление.

Уже готово:
-- юзверь-мануал на буржуинском (готов на 80%). Можно поглядеть здесь.
-- совместимость "вперёд": старые версии программ могут читать файлы, созданные более новыми версиями. При этом неизвестные классы загружаются как их известные предки.
-- поддержка записей (в том числе упакованных)
-- исправлены массивы, индексируемые перечислимыми типами (в текущей версии могут состоять только из 4 и 8-байтовых элементов).

Осталось доделать:
-- динамические массивы
-- множества
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение ev » 23.02.2007 19:11:08

- юзверь-мануал на буржуинском (готов на 80%).

это пугает - мыж не буржуины :wink:
ev
долгожитель
 
Сообщения: 1685
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Cheb » 23.02.2007 22:31:38

Ну... Я попытаюсь потом, конечно, перевести - но сначала надо привести систему к законченному виду чтобы в две версии документации исправления не вносить. А то голова опухнет.

Совместимость "вперёд" цветёт и пахнет:
Loading...
Parsing OK.
Loading scenarios built.
/~ There were warnings during parsing the basket: ~\
Unknown class "TTESTDATANEXT" converted to its known ancestor "TTESTDATA"
Неизвестный тип "TSB" (перечислимый). Приведён к "DWORD".
Class "TTESTDATANEXT": unknown field "Y:DWORD". Omitted.
Class "TTESTDATANEXT": unknown field "G:LONGINT". Omitted.
Class "TTESTDATA": unknown field "Y:DWORD". Omitted.
Class "TTESTDATANEXT": loading requires coversion.
Class "TTESTDATA": loading requires coversion.
\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
Ok.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

Сообщение Cheb » 26.02.2007 00:34:56

Для тех, кто чувствует себя особо храбрым, release candidate на 0.7 выкладена здесь:

<<Убрал. Уже выпущена сама 0.7>>

Все обещанные плюшки есть (плюс нормальная поддержка статических массивов) но оттестировано пока очень слабо. Плюс, не проверялось под Дельфи: для этого надо выходить из Линукса и грузить Виндовс, а у меня куча недочитанных фиков по Ранме и Slayers который день открыта, лень потом вспоминать на каком месте что читал.
Последний раз редактировалось Cheb 27.02.2007 20:10:20, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 564
Зарегистрирован: 06.06.2005 15:54:34

След.

Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: alexs и гости: 2

Рейтинг@Mail.ru