1
- using ProGaudi . MsgPack . Light ;
1
+ using System . Runtime . Serialization ;
2
+ using ProGaudi . MsgPack . Light ;
2
3
3
4
using ProGaudi . Tarantool . Client . Model ;
4
5
using ProGaudi . Tarantool . Client . Model . Enums ;
@@ -10,31 +11,118 @@ internal class IndexPartConverter : IMsgPackConverter<IndexPart>
10
11
{
11
12
private IMsgPackConverter < uint > _uintConverter ;
12
13
private IMsgPackConverter < IndexPartType > _indexPartTypeConverter ;
14
+ private IMsgPackConverter < string > _stringConverter ;
13
15
14
16
public void Initialize ( MsgPackContext context )
15
17
{
16
18
_uintConverter = context . GetConverter < uint > ( ) ;
17
19
_indexPartTypeConverter = context . GetConverter < IndexPartType > ( ) ;
20
+ _stringConverter = context . GetConverter < string > ( ) ;
18
21
}
19
22
20
- public void Write ( IndexPart value , IMsgPackWriter writer )
23
+ public void Write ( IndexPart value , IMsgPackWriter writer ) => throw new System . NotImplementedException ( ) ;
24
+
25
+ public IndexPart Read ( IMsgPackReader reader )
21
26
{
22
- throw new System . NotImplementedException ( ) ;
27
+ var type = reader . ReadDataType ( ) ;
28
+ switch ( type )
29
+ {
30
+ case DataTypes . Map16 :
31
+ return ReadFromMap ( reader , ReadUInt16 ( reader ) ) ;
32
+
33
+ case DataTypes . Map32 :
34
+ return ReadFromMap ( reader , ReadUInt32 ( reader ) ) ;
35
+
36
+ case DataTypes . Array16 :
37
+ return ReadFromArray ( reader , ReadUInt16 ( reader ) ) ;
38
+
39
+ case DataTypes . Array32 :
40
+ return ReadFromArray ( reader , ReadUInt32 ( reader ) ) ;
41
+ }
42
+
43
+ var length = TryGetLengthFromFixMap ( type ) ;
44
+ if ( length . HasValue )
45
+ {
46
+ return ReadFromMap ( reader , length . Value ) ;
47
+ }
48
+
49
+ length = TryGetLengthFromFixArray ( type ) ;
50
+ if ( length != null )
51
+ {
52
+ return ReadFromArray ( reader , length . Value ) ;
53
+ }
54
+
55
+ throw ExceptionUtils . BadTypeException ( type , DataTypes . Map16 , DataTypes . Map32 , DataTypes . FixMap , DataTypes . Array16 , DataTypes . Array32 , DataTypes . FixArray ) ;
23
56
}
24
57
25
- public IndexPart Read ( IMsgPackReader reader )
58
+ private IndexPart ReadFromArray ( IMsgPackReader reader , uint length )
26
59
{
27
- var length = reader . ReadArrayLength ( ) ;
28
60
if ( length != 2u )
29
61
{
30
62
throw ExceptionHelper . InvalidArrayLength ( 2u , length ) ;
31
63
}
32
64
33
-
34
65
var fieldNo = _uintConverter . Read ( reader ) ;
35
66
var indexPartType = _indexPartTypeConverter . Read ( reader ) ;
36
67
37
68
return new IndexPart ( fieldNo , indexPartType ) ;
38
69
}
70
+
71
+ // throw new System.NotImplementedException();
72
+ private IndexPart ReadFromMap ( IMsgPackReader reader , uint length )
73
+ {
74
+ uint ? fieldNo = null ;
75
+ IndexPartType ? indexPartType = null ;
76
+
77
+ for ( var i = 0 ; i < length ; i ++ )
78
+ {
79
+ switch ( _stringConverter . Read ( reader ) )
80
+ {
81
+ case "field" :
82
+ fieldNo = _uintConverter . Read ( reader ) ;
83
+ break ;
84
+ case "type" :
85
+ indexPartType = _indexPartTypeConverter . Read ( reader ) ;
86
+ break ;
87
+ default :
88
+ reader . SkipToken ( ) ;
89
+ break ;
90
+ }
91
+ }
92
+
93
+ if ( fieldNo . HasValue && indexPartType . HasValue )
94
+ {
95
+ return new IndexPart ( fieldNo . Value , indexPartType . Value ) ;
96
+ }
97
+
98
+ throw new SerializationException ( "Can't read fieldNo or indexPart from map of index metadata" ) ;
99
+ }
100
+
101
+ private static uint ? TryGetLengthFromFixArray ( DataTypes type )
102
+ {
103
+ var length = type - DataTypes . FixArray ;
104
+ return type . GetHighBits ( 4 ) == DataTypes . FixArray . GetHighBits ( 4 ) ? length : ( uint ? ) null ;
105
+ }
106
+
107
+ private static uint ? TryGetLengthFromFixMap ( DataTypes type )
108
+ {
109
+ var length = type - DataTypes . FixMap ;
110
+ return type . GetHighBits ( 4 ) == DataTypes . FixMap . GetHighBits ( 4 ) ? length : ( uint ? ) null ;
111
+ }
112
+
113
+ internal static ushort ReadUInt16 ( IMsgPackReader reader )
114
+ {
115
+ return ( ushort ) ( ( reader . ReadByte ( ) << 8 ) + reader . ReadByte ( ) ) ;
116
+ }
117
+
118
+ internal static uint ReadUInt32 ( IMsgPackReader reader )
119
+ {
120
+ var temp = ( uint ) ( reader . ReadByte ( ) << 24 ) ;
121
+ temp += ( uint ) reader . ReadByte ( ) << 16 ;
122
+ temp += ( uint ) reader . ReadByte ( ) << 8 ;
123
+ temp += reader . ReadByte ( ) ;
124
+
125
+ return temp ;
126
+ }
39
127
}
40
128
}
0 commit comments