TgsMMFStream (постановка)

Материал из GedeminWiki
Перейти к: навигация, поиск

Вспомогательный класс для механизма сохранения в поток. Предназначен для замены TClientDataSet. Использует отображаемые в память файлы для хранения объемов данных, превышающих размер доступной оперативной памяти. Может работать в двух режимах: записи и считывания.

Содержание

Режим записи

  1. Создание объекта
  2. AddFieldDef для каждого поля
  3. Цикл для каждой записи:
    1. SetFromDataSetField для каждого поля
    2. Post
  4. SaveToStream
  5. Уничтожение объекта

Режим чтения

  1. Создание объекта
  2. LoadFromStream
  3. Цикл для каждой записи:
    1. SetDataSetField для каждого поля
    2. Next
  4. Уничтожение объекта

Свойства

RecordCount 
количество записей. Только для чтения.
CurrentRecord 
номер текущей записи. Только для чтения.
EOF 
Только для чтения.

Формат потока

Поток состоит из заголовка и данных. Заголовок содержит:

  1. информацию о версии структуры потока,
  2. список полей,
  3. количество записей.

Данные -- непрерывный поток с данными всех записей следующей структуры:

  1. Разделителей между записями нет.
  2. Окончание записи находится там, где оканчиваются данные последнего поля в списке.

Защита от поврежденного потока осуществляется следующим образом:

  1. При считывании из потока, если прочитано записей меньше, чем находится в заголовке, то выдается исключение.
  2. Если в процессе считывания записи, данные не соответствуют типу поля, то выдается исключение. Например, считалась отрицательная длина строки.

Структура для хранения данных поля

TFieldRec служит как для хранения информации об имени и типе поля, так и его значения. Создаются динамически или при загрузке из потока или при вызове метода AddFieldDef.

TFieldRec = record
  FieldName: String;
  FString: String;
  case DataType: TFieldType of
    ftInteger, ftSmallInt, ftWord: (FInteger: Integer); 
    ftCurrency: (FCurrency: Currency);
    ftFloat: (FDouble: Double);
    ftMemo: (FDataSize: Integer; FData: Pointer);
    ...
end;

Удаляются динамически при уничтожении компонента. Внутри компонента список полей хранится в свойстве FFieldList: TList. Свойство FFieldHash: TStringHashMap хранит хэшированный список для быстрого доступа по имени поля.

Так как внутри записи присутствуют поля типа String создание и удаление должно осуществляться функциями New и Dispose.

Обратите внимание на хранение данных типа Мемо. Перед удалением или перед очередным присвоением, они должны уничтожаться!

См. также

Managing Memory-Mapped Files in Win32

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты