16
16
import tarantool .const as const
17
17
18
18
19
+ def to_unicode (s ):
20
+ if isinstance (s , bytes ):
21
+ return s .decode (encoding = 'utf-8' )
22
+ return s
23
+
24
+
25
+ def to_unicode_recursive (x , max_depth ):
26
+ """Same as to_unicode(), but traverses over dictionaries,
27
+ lists and tuples recursivery.
28
+
29
+ x: value to convert
30
+
31
+ max_depth: 1 accepts a scalar, 2 accepts a list of scalars,
32
+ etc.
33
+ """
34
+ assert max_depth > 0
35
+
36
+ if isinstance (x , dict ):
37
+ res = dict ()
38
+ for key , val in x .items ():
39
+ key = to_unicode_recursive (key , max_depth - 1 )
40
+ val = to_unicode_recursive (val , max_depth - 1 )
41
+ res [key ] = val
42
+ return res
43
+
44
+ if isinstance (x , list ) or isinstance (x , tuple ):
45
+ res = []
46
+ for val in x :
47
+ val = to_unicode_recursive (val , max_depth - 1 )
48
+ res .append (val )
49
+ if isinstance (x , tuple ):
50
+ return tuple (res )
51
+ return res
52
+
53
+ return to_unicode (x )
54
+
55
+
19
56
class SchemaIndex (object ):
20
57
def __init__ (self , index_row , space ):
21
58
self .iid = index_row [1 ]
22
59
self .name = index_row [2 ]
23
- if isinstance (self .name , bytes ):
24
- self .name = self .name .decode ()
60
+ self .name = to_unicode (index_row [2 ])
25
61
self .index = index_row [3 ]
26
62
self .unique = index_row [4 ]
27
63
self .parts = []
28
- if isinstance (index_row [5 ], (list , tuple )):
29
- for val in index_row [5 ]:
64
+ parts_raw = to_unicode_recursive (index_row [5 ], 3 )
65
+ if isinstance (parts_raw , (list , tuple )):
66
+ for val in parts_raw :
30
67
if isinstance (val , dict ):
31
68
self .parts .append ((val ['field' ], val ['type' ]))
32
69
else :
33
70
self .parts .append ((val [0 ], val [1 ]))
34
71
else :
35
- for i in range (index_row [ 5 ] ):
72
+ for i in range (parts_raw ):
36
73
self .parts .append ((
37
- index_row [5 + 1 + i * 2 ],
38
- index_row [5 + 2 + i * 2 ]
74
+ to_unicode ( index_row [5 + 1 + i * 2 ]) ,
75
+ to_unicode ( index_row [5 + 2 + i * 2 ])
39
76
))
40
77
self .space = space
41
78
self .space .indexes [self .iid ] = self
@@ -52,16 +89,15 @@ class SchemaSpace(object):
52
89
def __init__ (self , space_row , schema ):
53
90
self .sid = space_row [0 ]
54
91
self .arity = space_row [1 ]
55
- self .name = space_row [2 ]
56
- if isinstance (self .name , bytes ):
57
- self .name = self .name .decode ()
92
+ self .name = to_unicode (space_row [2 ])
58
93
self .indexes = {}
59
94
self .schema = schema
60
95
self .schema [self .sid ] = self
61
96
if self .name :
62
97
self .schema [self .name ] = self
63
98
self .format = dict ()
64
- for part_id , part in enumerate (space_row [6 ]):
99
+ format_raw = to_unicode_recursive (space_row [6 ], 3 )
100
+ for part_id , part in enumerate (format_raw ):
65
101
part ['id' ] = part_id
66
102
self .format [part ['name' ]] = part
67
103
self .format [part_id ] = part
@@ -78,6 +114,8 @@ def __init__(self, con):
78
114
self .con = con
79
115
80
116
def get_space (self , space ):
117
+ space = to_unicode (space )
118
+
81
119
try :
82
120
return self .schema [space ]
83
121
except KeyError :
@@ -135,6 +173,9 @@ def fetch_space_all(self):
135
173
SchemaSpace (row , self .schema )
136
174
137
175
def get_index (self , space , index ):
176
+ space = to_unicode (space )
177
+ index = to_unicode (index )
178
+
138
179
_space = self .get_space (space )
139
180
try :
140
181
return _space .indexes [index ]
@@ -203,6 +244,9 @@ def fetch_index_from(self, space, index):
203
244
return index_row
204
245
205
246
def get_field (self , space , field ):
247
+ space = to_unicode (space )
248
+ field = to_unicode (field )
249
+
206
250
_space = self .get_space (space )
207
251
try :
208
252
return _space .format [field ]
0 commit comments