TgsMMFStream (постановка)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) (→См. также) |
||
| (не показаны 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. Использует отображаемые в память файлы для хранения объемов данных, превышающих размер доступной оперативной памяти. Может работать в двух режимах: записи и считывания.
Содержание |
[править] Режим записи
- Создание объекта
- 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.
Обратите внимание на хранение данных типа Мемо. Перед удалением или перед очередным присвоением, они должны уничтожаться!