1+ using System ;
2+ using System . Buffers ;
3+ using System . Text ;
4+
5+ namespace SuperSocket . MySQL
6+ {
7+ public static class IBufferWriterExtensions
8+ {
9+ public static int WriteUInt8 ( this IBufferWriter < byte > writer , byte value )
10+ {
11+ var span = writer . GetSpan ( 1 ) ;
12+ span [ 0 ] = value ;
13+ writer . Advance ( 1 ) ;
14+ return 1 ;
15+ }
16+
17+ public static int WriteUInt16 ( this IBufferWriter < byte > writer , ushort value )
18+ {
19+ var span = writer . GetSpan ( 2 ) ;
20+ span [ 0 ] = ( byte ) value ;
21+ span [ 1 ] = ( byte ) ( value >> 8 ) ;
22+ writer . Advance ( 2 ) ;
23+ return 2 ;
24+ }
25+
26+ public static int WriteUInt24 ( this IBufferWriter < byte > writer , uint value )
27+ {
28+ var span = writer . GetSpan ( 3 ) ;
29+ span [ 0 ] = ( byte ) value ;
30+ span [ 1 ] = ( byte ) ( value >> 8 ) ;
31+ span [ 2 ] = ( byte ) ( value >> 16 ) ;
32+ writer . Advance ( 3 ) ;
33+ return 3 ;
34+ }
35+
36+ public static int WriteUInt32 ( this IBufferWriter < byte > writer , uint value )
37+ {
38+ var span = writer . GetSpan ( 4 ) ;
39+ span [ 0 ] = ( byte ) value ;
40+ span [ 1 ] = ( byte ) ( value >> 8 ) ;
41+ span [ 2 ] = ( byte ) ( value >> 16 ) ;
42+ span [ 3 ] = ( byte ) ( value >> 24 ) ;
43+ writer . Advance ( 4 ) ;
44+ return 4 ;
45+ }
46+
47+ public static int WriteUInt64 ( this IBufferWriter < byte > writer , ulong value )
48+ {
49+ var span = writer . GetSpan ( 8 ) ;
50+ span [ 0 ] = ( byte ) value ;
51+ span [ 1 ] = ( byte ) ( value >> 8 ) ;
52+ span [ 2 ] = ( byte ) ( value >> 16 ) ;
53+ span [ 3 ] = ( byte ) ( value >> 24 ) ;
54+ span [ 4 ] = ( byte ) ( value >> 32 ) ;
55+ span [ 5 ] = ( byte ) ( value >> 40 ) ;
56+ span [ 6 ] = ( byte ) ( value >> 48 ) ;
57+ span [ 7 ] = ( byte ) ( value >> 56 ) ;
58+ writer . Advance ( 8 ) ;
59+ return 8 ;
60+ }
61+
62+ public static int WriteLengthEncodedInteger ( this IBufferWriter < byte > writer , ulong value )
63+ {
64+ if ( value < 251 )
65+ {
66+ writer . WriteUInt8 ( ( byte ) value ) ;
67+ return 1 ;
68+ }
69+ else if ( value < 65536 )
70+ {
71+ writer . WriteUInt8 ( 0xFC ) ;
72+ writer . WriteUInt16 ( ( ushort ) value ) ;
73+ return 3 ;
74+ }
75+ else if ( value < 16777216 )
76+ {
77+ writer . WriteUInt8 ( 0xFD ) ;
78+ writer . WriteUInt24 ( ( uint ) value ) ;
79+ return 4 ;
80+ }
81+ else
82+ {
83+ writer . WriteUInt8 ( 0xFE ) ;
84+ writer . WriteUInt64 ( value ) ;
85+ return 9 ;
86+ }
87+ }
88+
89+ public static int WriteFixedString ( this IBufferWriter < byte > writer , string value )
90+ {
91+ if ( string . IsNullOrEmpty ( value ) )
92+ return 0 ;
93+
94+ var maxByteCount = Encoding . UTF8 . GetMaxByteCount ( value . Length ) ;
95+ var span = writer . GetSpan ( maxByteCount ) ;
96+ var bytesWritten = Encoding . UTF8 . GetBytes ( value , span ) ;
97+ writer . Advance ( bytesWritten ) ;
98+ return bytesWritten ;
99+ }
100+
101+ public static int WriteNullTerminatedString ( this IBufferWriter < byte > writer , string value )
102+ {
103+ var bytesWritten = 0 ;
104+
105+ if ( ! string . IsNullOrEmpty ( value ) )
106+ {
107+ var bytes = System . Text . Encoding . UTF8 . GetBytes ( value ) ;
108+ var span = writer . GetSpan ( bytes . Length + 1 ) ;
109+ bytes . CopyTo ( span ) ;
110+ span [ bytes . Length ] = 0 ; // null terminator
111+ writer . Advance ( bytes . Length + 1 ) ;
112+ bytesWritten = bytes . Length + 1 ;
113+ }
114+ else
115+ {
116+ var span = writer . GetSpan ( 1 ) ;
117+ span [ 0 ] = 0 ; // null terminator
118+ writer . Advance ( 1 ) ;
119+ bytesWritten = 1 ;
120+ }
121+
122+ return bytesWritten ;
123+ }
124+
125+ public static void WriteLengthEncodedString ( this IBufferWriter < byte > writer , string value )
126+ {
127+ writer . WriteLengthEncodedInteger ( ( ulong ) value . Length ) ;
128+ writer . WriteFixedString ( value ) ;
129+ }
130+ }
131+ }
0 commit comments