В этом разделе собирается информация, посвященная СУБД "Кронос" и ее модификациям.

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

Узнать, что такое "Кронос" и "Кронос Плюс" можно на www.cronos.ru. От себя лишь добавлю, что система завоевала наибольшую популярность в информационных подразделениях различных служб безопасности. Это связано в основном с тем, что "Кронос" позволяет легко структурировать и накапливать данные, тяжело поддающиеся формализации и делать это без привлечения (посторонних) компьютерных специалистов, что очень важно для сохранения конфиденциальности накапливаемой информации. 

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

Система "Кронос" была создана в начале 90-х годов с помощью очень редко встречающегося средства разработки Advanced Revelation. Я не встречал ни одного человека, который бы хоть раз видел это средство, и всего один раз читал его обзор в одном из компьютерных журналов. Что повлияло на выбор разработчиков сказать не могу. Однако, то, что получилось, содержало очень много как положительных, так и отрицательных отличий от стандартно распространенных в то время систем, писаных на FoxPro, Clipper и т.п. Самое интересное преимущество - это переменная длина всех записей, которая при хранении данных, не обладавших четкой структурой и фиксированной длиной, давала очень хороший выигрыш в занимаемом дисковом пространстве. Кроме того, в системе присутствовали и такие особенности, как шифрование всех данных, встроенная система номенклаторов (словарей), встроенная система связей с другими базами одного банка (разработчики, ссылаясь на эту возможность, называли СУБД сетевой), индексы, построенные на базе инвертированных списков, а не на Би-деревьях, как было принято в системах такого уровня. Однако шифрование и переменная длина записи накладывали и ограничения на скорость работы с данными. Фактически, получалось, что использовать характеристики, по которым не построены заранее индексы в качестве поисковых было практически невозможно. А построение индексов по всем возможным характеристикам приводило к тому, что процедура обновления данных занимала очень длительное время. Но закрытость системы, невозможность обрабатывать данные внешними программами, написанными сторонними разработчиками еще и сужала круг решаемых задач, ограничивая их только теми возможностями, которые предоставляла сама оболочка. Эта ситуация меня не устраивала и я занялся поиском возможностей изменения и улучшения системы.

Первой задачей было понять, как и что Кронос хранит в файлах данных. Это оказалось узнать достаточно просто. Все данные хранятся в паре файлов с расширениями .dat и .tad. В файле .tad первые 8 байт занимает информация об удаленных записях. Если вы не собираетесь восстанавливать удаленные записи или записывать что-то на их место, то эти 8 байт вам не нужны. Дальше хранятся группы по 12 байт. i-я группа (нумерация с 1) соответствует записи с i-м системным номером. Причем первые 4 байта указывают на смещение от начала файла .dat первой части записи. Следующие 2 байта - это длина первой части записи. Остается 6 байт. Четыре из них - смещение от начала файла .dat следующей части записи, а 2 байта - ее длина. Причем все части записи, начиная со второй, в начальных 4-х байтах содержат адрес начала следующей части записи и могут быть не длинее 256 байт. На языке С процедура чтения выглядит следующим образом (find - файл .tad, fin - файл .dat): 

long offset1, offset2;
unsigned int len1, len2, lenc;
unsigned char *buf;
lseek(find,(sistN*12)-4,SEEK_SET);
read(find,&offset1,4);  read(find,&len1,2);   read(find,&offset2,4);   read(find,&len2,2);
if (len2==0xffff) {printf("Удаленная запись\n"); return(0);}
lseek(fin,offset1,SEEK_SET);
buf=(unsigned char *) malloc(len1+len2);
read(fin,buf,len1);
lenc=0;
while ( lenc<len2 ) {
  lseek(fin,offset2,SEEK_SET);
  read(fin,&offset2,4);
  read(fin,buf+len1+lenc,((lenc+252)>len2)?(len2-lenc):252);
  lenc+=252;
}

После этого остается только расшифровать прочитанную запись. С расшифровкой разобраться даже проще чем с чтением данных. Достаточно легко понять, как шифруются записи, просто подсовывая Кроносу записи состоящие из одинаковых букв. Закономерность отследить очень легко. Не буду загромождать страничку тем, какими способами можно установить закономерности шифрования, приведу лишь алгоритм:

encode(buf,len,f,offset)
unsigned char buf[]; unsigned int len, f, offset;
{ unsigned int i;
if (f==0) 
   for (i=0; i<len; i++) buf[i] = kod[256+buf[i]] - i - offset;
else 
   for (i=0; i<len; i++) buf[i] = kod[ buf[i] + i + offset ];
}


Здесь f - флаг направления шифрования. 0 - расшифрование, 1 - зашифрование. А kod - две таблицы перестановок по 256 байт (причем взаимообратные). Эти таблицы очень просто найти в вашей версии Кроноса. Это блоки, в которых на протяжении 256 байт каждое значение встречается только по одному разу.

Этого достаточно, чтобы можно было читать данные из файлов Кроноса.

Пойдем дальше. В Кроносе есть одна единственная возможность обрабатывать данные самостоятельно. Для этого нужно выполнить запрос и перейти в пункт меню "Спецменю". При этом Кронос создает в рабочем каталоге файл с номерами отобранных объектов и дает возможность вызвать пользовательскую программу, которая может обрабатывать эти объекты. Такие программы можно писать с помощью дополнительной библиотеки, о которой в хелпе к Кроносу рассказана такая история. Это конечно здорово, но где же ее взять? И следующим этапом в моих усовершенствованиях Кроноса стало создание такого чуда. Правда, чудо это оказалось не доделанным до конца по той простой причине, что я не нашел способ спросить у Кроноса, куда же он положил файлы stru и spsn.<Номер базы в запросе>, т.е. непонятно, как узнать у Кроноса, где находится его рабочий директорий. (Я подозреваю, что нужно спрашивать у intserv, просто вызвав прерывание INT80 - INT85, но разобраться в этом я сил не нашел). И есть еще одна недоделка - нет функции decode(), которая должна работать со словарями. Взять то, что у меня получилось из этой библиотеки можно здесь: CRO.H . Только претензий по ней я не принимаю, т.к. писал ее очень давно и почти никогда ею не пользовался. 

При более детальном рассмотрении структуры файлов Кроноса стало понятно, что кроме физического уровня хранения данных у него есть еще и логический. На записях любой базы данных это никак не проявляется. Там строго - каждая запись занимает в файле данных одну физическую запись с соответствующим системным номером. А вот в индексных, служебных и словарных файлах присутствует еще и логическая структура. Это и понятно, т.к. в файлах этих типов часто приходится вставлять новые записи в середину структуры, что сделать в физическом формате очень тяжело - приходилось бы раздвигать файл. Разобраться в логической структуре немного сложнее, но тоже возможно. Понимание этой структуры дает возможность читать словари, индексы и прочую полезную информацию. Логическую структуру я опишу позже, поскольку это довольно длительная процедура, на которую нужно еще и подыскать свободное время. А пока расскажу о результатах. Возможность читать эти данные позволяет напрямую работать с индексами, в обход оболочки, а кроме того, и создавать индексы, не используя очень медленные возможности Кроноса в этой области. Я написал программку, которая умеет самостоятельно строить индексы  по полям баз Кроноса. Но эта программа находится в очень сыром виде из-за нехватки времени на ее доработку. Описание ее можно прочитать здесь, а взять ее на попробовать - здесь. В планах, находятся следующие действия:

В общем-то это все не сложно сделать, вот только нужно найти на это время...

Еще, мне приходилось заниматься исследованием поведения Кроноса в сети. Кое-что на эту тему я писал как-то в news:fido7.su.dbms.cronos, приведу здесь только ссылку на эту статью. Более детальную информацию я уже вряд ли вспомню, но если кому будет это интересно, можно мне написать, я отвечу на все вопросы.

Пока это все, на что хватило у меня сил здесь рассказать. 

Осталось:

Но это в следующий раз, когда смогу добраться до клавиатуры и найти на это время и силы...

 

(с) Сергей Сединкин, 2000 г.

 PS У Вас всегда есть возможность высказаться в форуме.

 

 

a better search result Banner 10000036 85 x 25 v2 Banner 10000005

Banner 10000035 Sandbox General 125x125


Hosted by uCoz