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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
(См. также)
 
(не показаны 5 промежуточных версий 1 участника)
Строка 1: Строка 1:
 +
Вспомогательный класс для механизма сохранения в поток. Предназначен для замены TClientDataSet. Использует отображаемые в память файлы для хранения объемов данных, превышающих размер доступной оперативной памяти. Может работать в двух режимах: записи и считывания.
  
 +
=== Режим записи ===
 +
 +
# Создание объекта
 +
# AddFieldDef для каждого поля
 +
# Цикл для каждой записи:
 +
## SetFromDataSetField для каждого поля
 +
## Post
 +
# SaveToStream
 +
# Уничтожение объекта
 +
 +
=== Режим чтения ===
 +
 +
# Создание объекта
 +
# LoadFromStream
 +
# Цикл для каждой записи:
 +
## SetDataSetField для каждого поля
 +
## Next
 +
# Уничтожение объекта
 +
 +
=== Свойства ===
 +
 +
;RecordCount : количество записей. Только для чтения.
 +
;CurrentRecord : номер текущей записи. Только для чтения.
 +
;EOF : Только для чтения.
 +
 +
=== Формат потока ===
 +
 +
Поток состоит из заголовка и данных. Заголовок содержит:
 +
# информацию о версии структуры потока,
 +
# список полей,
 +
# количество записей.
 +
Данные -- непрерывный поток с данными всех записей следующей структуры:
 +
# Разделителей между записями нет.
 +
# Окончание записи находится там, где оканчиваются данные последнего поля в списке.
 +
 +
Защита от поврежденного потока осуществляется следующим образом:
 +
# При считывании из потока, если прочитано записей меньше, чем находится в заголовке, то выдается исключение.
 +
# Если в процессе считывания записи, данные не соответствуют типу поля, то выдается исключение. Например, считалась отрицательная длина строки.
 +
 +
=== Структура для хранения данных поля ===
 +
 +
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.
 +
 +
Обратите внимание на хранение данных типа Мемо. Перед удалением или перед очередным присвоением, они должны уничтожаться!
  
 
=== См. также ===
 
=== См. также ===
Строка 5: Строка 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

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

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