1
- using System ;
1
+ using System ;
2
2
using System . Text ;
3
3
4
4
namespace MySql . Data . Serialization
5
5
{
6
6
internal class ColumnDefinitionPayload
7
7
{
8
- public string Name { get ; private set ; }
8
+ public string Name
9
+ {
10
+ get
11
+ {
12
+ if ( ! m_readNames )
13
+ ReadNames ( ) ;
14
+ return m_name ;
15
+ }
16
+ }
9
17
10
18
public CharacterSet CharacterSet { get ; private set ; }
11
19
@@ -15,27 +23,67 @@ internal class ColumnDefinitionPayload
15
23
16
24
public ColumnFlags ColumnFlags { get ; private set ; }
17
25
18
- public string SchemaName { get ; private set ; }
26
+ public string SchemaName
27
+ {
28
+ get
29
+ {
30
+ if ( ! m_readNames )
31
+ ReadNames ( ) ;
32
+ return m_schemaName ;
33
+ }
34
+ }
19
35
20
- public string CatelogName { get ; private set ; }
36
+ public string CatalogName
37
+ {
38
+ get
39
+ {
40
+ if ( ! m_readNames )
41
+ ReadNames ( ) ;
42
+ return m_catalogName ;
43
+ }
44
+ }
21
45
22
- public string Table { get ; private set ; }
46
+ public string Table
47
+ {
48
+ get
49
+ {
50
+ if ( ! m_readNames )
51
+ ReadNames ( ) ;
52
+ return m_table ;
53
+ }
54
+ }
23
55
24
- public string PhysicalTable { get ; private set ; }
56
+ public string PhysicalTable
57
+ {
58
+ get
59
+ {
60
+ if ( ! m_readNames )
61
+ ReadNames ( ) ;
62
+ return m_physicalTable ;
63
+ }
64
+ }
25
65
26
- public string PhysicalName { get ; private set ; }
66
+ public string PhysicalName
67
+ {
68
+ get
69
+ {
70
+ if ( ! m_readNames )
71
+ ReadNames ( ) ;
72
+ return m_physicalName ;
73
+ }
74
+ }
27
75
28
76
public byte Decimals { get ; private set ; }
29
77
30
78
public static ColumnDefinitionPayload Create ( PayloadData payload )
31
79
{
32
80
var reader = new ByteArrayReader ( payload . ArraySegment ) ;
33
- var catalog = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
34
- var schema = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
35
- var table = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
36
- var physicalTable = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
37
- var name = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
38
- var physicalName = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
81
+ SkipLengthEncodedByteString ( ref reader ) ; // catalog
82
+ SkipLengthEncodedByteString ( ref reader ) ; // schema
83
+ SkipLengthEncodedByteString ( ref reader ) ; // table
84
+ SkipLengthEncodedByteString ( ref reader ) ; // physical table
85
+ SkipLengthEncodedByteString ( ref reader ) ; // name
86
+ SkipLengthEncodedByteString ( ref reader ) ; // physical name
39
87
reader . ReadByte ( 0x0C ) ; // length of fixed-length fields, always 0x0C
40
88
var characterSet = ( CharacterSet ) reader . ReadUInt16 ( ) ;
41
89
var columnLength = reader . ReadUInt32 ( ) ;
@@ -57,19 +105,41 @@ public static ColumnDefinitionPayload Create(PayloadData payload)
57
105
58
106
return new ColumnDefinitionPayload
59
107
{
60
- Name = name ,
108
+ OriginalPayload = payload ,
61
109
CharacterSet = characterSet ,
62
110
ColumnLength = columnLength ,
63
111
ColumnType = columnType ,
64
112
ColumnFlags = columnFlags ,
65
- SchemaName = schema ,
66
- CatelogName = catalog ,
67
- Table = table ,
68
- PhysicalTable = physicalTable ,
69
- PhysicalName = physicalName ,
70
113
Decimals = decimals
71
114
} ;
115
+ }
72
116
117
+ private static void SkipLengthEncodedByteString ( ref ByteArrayReader reader )
118
+ {
119
+ var length = checked ( ( int ) reader . ReadLengthEncodedInteger ( ) ) ;
120
+ reader . Offset += length ;
73
121
}
122
+
123
+ private void ReadNames ( )
124
+ {
125
+ var reader = new ByteArrayReader ( OriginalPayload . ArraySegment ) ;
126
+ m_catalogName = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
127
+ m_schemaName = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
128
+ m_table = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
129
+ m_physicalTable = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
130
+ m_name = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
131
+ m_physicalName = Encoding . UTF8 . GetString ( reader . ReadLengthEncodedByteString ( ) ) ;
132
+ m_readNames = true ;
133
+ }
134
+
135
+ PayloadData OriginalPayload { get ; set ; }
136
+
137
+ bool m_readNames ;
138
+ string m_name ;
139
+ string m_schemaName ;
140
+ string m_catalogName ;
141
+ string m_table ;
142
+ string m_physicalTable ;
143
+ string m_physicalName ;
74
144
}
75
145
}
0 commit comments