Бинарный формат пакетов 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 }
BLANK_NOTCHANGED = 2; { Not changed , compared to original value }

S+1 X FieldData[] - пишутся только not null & changed значения.

Для полей фиксированного размера: FixedFieldData = Byte[FieldSize]
Для полей переменного размера: VarFieldData = (DataLen: UInt(of FieldSize)) Byte[DataLen] - те обычно данные предваряются 1-2 байтами размера.

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. }

Source: https://alexeevd.narod.ru/papers/cds_format.htm