Бинарный формат пакетов TClientDataset
Материал из DRKB
Midas/DataSnap packet format (*.cds)[править | править код]
Offset | Size (bytes) | Content |
---|---|---|
0 | 4 | Signature = [$96, $19, $E0, $BD] - Сигнатура пакета MIDAS/DataSnap |
4 | 4 | Int32, обычно равно 1 |
8 | 4 | Int32, обычно равно 18 |
12 | 2 | FieldCount: UInt16 - количество полей |
14 | 4 | RecordCount: Int32 - количество записей в пакете |
18 | 4 | Int32, обычно равно 3 |
22 | 2 | HeaderSize: UInt16 - вероятно, размер всего заголовка включая описания полей и свойств. |
24 | X | FieldList: FieldList - Структура описания полей. |
X + 24 | 2 | DSPropCount: UInt16 - количество свойств |
X + 26 | Y | DSProps: Prop[DSPropCount] - свойства набора. |
HeaderSize | Varing | RecordList: RecordList - данные записей. |
Описание полей (FieldList)[править | править код]
Последовательный список из одинаковых описателей поля приведенных ниже. Количество в списке задано соответствующим значением заголовка.
array [0..FieldCount - 1] of
Offset | Size (bytes) | Content |
---|---|---|
0 | 1 | Len: UInt8 - Длина имени поля |
1 | Len | FieldName: Char[Len] - Имя поля |
Len + 1 | 2 | FieldSize: Int16, для строк - длина фиксированной части, те размера |
Len + 3 | 2 | FieldType: Int16 |
Len + 5 | 2 | FieldAttrs: Int16 - атрибуты (флаги) поля. |
Len + 7 | 2 | FieldPropCount: UInt16 - количество свойств поля |
Len + 9 | P | FieldProps: Prop[FieldPropCount] - свойства поля. |
Описание свойства (Prop)[править | править код]
Offset | Size (bytes) | Content |
---|---|---|
0 | 1 | Len: UInt8 - Длина имени свойства |
1 | Len | PropName: Char[Len] - Имя свойства |
Len+1 | 2 | PropSize: Int16 |
Len+3 | 2 | PropType: Int16 (FieldType) |
Len + 4 | PropSize | Data: Byte[PropSize] - Данные свойства |
Описание записей (RecordList)[править | править код]
Последовательный список описателей записи, приведенных ниже. Количество в списке задано соответствующим значением заголовка.
array [0..RecordCount - 1] of
Offset | Size (bytes) | Content |
---|---|---|
0 | 1 | RecordStatus: UInt8 |
1 | S | StatusBits: Byte[FieldCount / 4] - на каждое поле в массиве статусных битов отводится 2 бита от младшего к старшему. Данные полей содержащих Null или NotChanged в запись не попадают. BLANK_NULL = 1; { 'real' NULL } |
S+1 | X | FieldData[] - пишутся только not null & changed значения. Для полей фиксированного размера: FixedFieldData = Byte[FieldSize] |
FieldType[править | править код]
dsfldUNKNOWN = 0; { Unknown } dsfldINT = 1; { signed integer } dsfldUINT = 2; { Unsigned integer } dsfldBOOL = 3; { Boolean } dsfldFLOATIEEE = 4; { IEEE float } dsfldBCD = 5; { BCD } dsfldDATE = 6; { Date (32 bit) } dsfldTIME = 7; { Time (32 bit) } dsfldTIMESTAMP = 8; { Time-stamp (64 bit) } dsfldZSTRING = 9; { Multi-byte string } dsfldUNICODE = 10; { unicode string } dsfldBYTES = 11; { bytes } dsfldADT = 12; { ADT (Abstract Data Type) } dsfldARRAY = 13; { Array type (not attribute) } dsfldEMBEDDEDTBL = 14; { Embedded (nested table type) } dsfldREF = 15; { Reference } MaskFieldType = $3F; { mask to retrieve Field Type } MaskVaryingFld = $40; { Varying attribute type. } MaskArrayFld = $80; { Array attribute type. } - Данные массива предваряются длиной Len: Int32, за которой следуют его элементы Data[Len].
Атрибуты поля (FieldAttrs)[править | править код]
fldAttrHIDDEN = $0001; { Field is hidden } fldAttrREADONLY = $0002; { Field is readonly } fldAttrREQUIRED = $0004; { Field value required } fldAttrLINK = $0008; { Linking field }
Свойства поля (FieldProps)[править | править код]
WIDTH: UInt16 - для полей переменного размера, например строк, равно Field.Size. Те это предельный размер данных, хранимых в поле.
Свойства набора (DataSetProps)[править | править код]
CHANGE_LOG: UInt32[] - массив из целых чисел. DATASET_DELTA: UInt32 = 1, если в пакете передается delta-набор (набор изменений).
Статус записи (RecordStatus)[править | править код]
dsRecUnmodified = $0000; { Unmodified record } dsRecOrg = $0001; { Original record (was changed) } dsRecDeleted = $0002; { Record was deleted } dsRecNew = $0004; { Record was inserted } dsRecModified = $0008; { Record was changed } dsUnused = $0020; { Record not used anymore (hole) } dsDetUpd = $0040; { Detail modification Ins/Del/Mod. }{ Can be combined with other status. }