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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(См. также)
(См. также)
 
Строка 65: Строка 65:
 
[http://msdn.microsoft.com/en-us/library/ms810613.aspx Managing Memory-Mapped Files in Win32]
 
[http://msdn.microsoft.com/en-us/library/ms810613.aspx Managing Memory-Mapped Files in Win32]
  
[[Category:Постановка]]
+
[[Category:Постановка-Отклонено]]

Текущая версия на 19:30, 4 января 2013

Вспомогательный класс для механизма сохранения в поток. Предназначен для замены 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

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

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