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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(См. также)
 
(не показаны 4 промежуточные версии 1 участника)
Строка 1: Строка 1:
 
 
Вспомогательный класс для механизма сохранения в поток. Предназначен для замены TClientDataSet. Использует отображаемые в память файлы для хранения объемов данных, превышающих размер доступной оперативной памяти. Может работать в двух режимах: записи и считывания.
 
Вспомогательный класс для механизма сохранения в поток. Предназначен для замены TClientDataSet. Использует отображаемые в память файлы для хранения объемов данных, превышающих размер доступной оперативной памяти. Может работать в двух режимах: записи и считывания.
  
Строка 23: Строка 22:
 
=== Свойства ===
 
=== Свойства ===
  
RecordCount -- количество записей. Только для чтения.
+
;RecordCount : количество записей. Только для чтения.
CurrentRecord -- номер текущей записи. Только для чтения.
+
;CurrentRecord : номер текущей записи. Только для чтения.
EOF -- Только для чтения.
+
;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.
 +
 
 +
Обратите внимание на хранение данных типа Мемо. Перед удалением или перед очередным присвоением, они должны уничтожаться!
  
 
=== См. также ===
 
=== См. также ===
Строка 35: Строка 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

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

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