Skip to content

Commit 8b78b41

Browse files
committed
Added support for 'map' type
1 parent 4c1db9c commit 8b78b41

File tree

4 files changed

+58
-21
lines changed

4 files changed

+58
-21
lines changed

temp/demo.pl

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@
5757
$c->connect;
5858
EV::loop;
5959

60-
say "DISCONNECT";
61-
$c->disconnect;
62-
EV::loop;
60+
# say "DISCONNECT";
61+
# $c->disconnect;
62+
# EV::loop;
6363

64-
say "CONNECT 2";
65-
$c->connect;
66-
EV::loop;
64+
# say "CONNECT 2";
65+
# $c->connect;
66+
# EV::loop;
6767

6868
# $c->update('tester', ['a1', 'a2', 12], [ [2 => '=', 18] ], sub {
6969
# say Dumper \@_;
@@ -83,12 +83,31 @@
8383
# });
8484
# EV::loop;
8585

86-
$c->select('_space', ['_space'], {index => 'name'}, sub {
86+
my $data = {
87+
id => 2,
88+
d => {
89+
a => 2
90+
},
91+
};
92+
93+
$c->insert('test', $data, sub {
94+
say Dumper \@_;
95+
EV::unloop;
96+
});
97+
EV::loop;
98+
99+
$c->select('test', [], sub {
87100
say Dumper \@_;
88101
EV::unloop;
89102
});
90103
EV::loop;
91104

105+
# $c->select('_vspace', ['_vspace'], {index => 'name'}, sub {
106+
# say Dumper \@_;
107+
# EV::unloop;
108+
# });
109+
# EV::loop;
110+
92111
# $c->insert('memier', [7, {a => 1, b => 2}], { in => 's*' }, sub {
93112
# say Dumper \@_;
94113
# EV::unloop;

xstnt/encdec.h

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ static SV *types_true, *types_false;
140140
} STMT_END
141141

142142

143+
#define encode_HV(src, rv, dest, sz) STMT_START { \
144+
HV *hv = (HV *) src; \
145+
HE *he; \
146+
\
147+
uint32_t keys_size = hv_iterinit(hv); \
148+
\
149+
encode_map(dest, sz, rv, keys_size); \
150+
STRLEN nlen; \
151+
while ((he = hv_iternext(hv))) { \
152+
char *name = HePV(he, nlen); \
153+
encode_str(dest, sz, rv, name, nlen); \
154+
dest = encode_obj(HeVAL(he), dest, rv, sz, FMT_UNKNOWN); \
155+
} \
156+
} STMT_END
157+
158+
143159

144160
static char *encode_obj(SV *initial_src, char *dest, SV *rv, size_t *sz, char fmt) {
145161
// cwarn("fmt = %d", fmt);
@@ -217,6 +233,15 @@ static char *encode_obj(SV *initial_src, char *dest, SV *rv, size_t *sz, char fm
217233
croak("Incompatible types. Format expects: %c", fmt);
218234
}
219235

236+
} else if (fmt == FMT_MAP) {
237+
238+
if (SvTYPE(src) == SVt_PVHV) {
239+
encode_HV(src, rv, dest, sz);
240+
return dest;
241+
} else {
242+
croak("Incompatible types. Format expects: %c", fmt);
243+
}
244+
220245
} else if (fmt == FMT_UNKNOWN || fmt == FMT_SCALAR) {
221246

222247
HV *boolean_stash = types_boolean_stash ? types_boolean_stash : gv_stashpv ("Types::Serialiser::Boolean", 1);
@@ -236,19 +261,7 @@ static char *encode_obj(SV *initial_src, char *dest, SV *rv, size_t *sz, char fm
236261
return dest;
237262

238263
} else if (fmt != FMT_SCALAR && SvTYPE(src) == SVt_PVHV) { // hash
239-
240-
HV *hv = (HV *) src;
241-
HE *he;
242-
243-
uint32_t keys_size = hv_iterinit(hv);
244-
245-
encode_map(dest, sz, rv, keys_size);
246-
STRLEN nlen;
247-
while ((he = hv_iternext(hv))) {
248-
char *name = HePV(he, nlen);
249-
encode_str(dest, sz, rv, name, nlen);
250-
dest = encode_obj(HeVAL(he), dest, rv, sz, FMT_UNKNOWN);
251-
}
264+
encode_HV(src, rv, dest, sz);
252265
return dest;
253266

254267
} else if (SvNOK(src)) { // double

xstnt/types.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ typedef enum {
127127
FMT_NUMBER = 'n',
128128
FMT_INTEGER = 'i',
129129
FMT_ARRAY = 'a',
130-
FMT_SCALAR = 'r'
130+
FMT_SCALAR = 'r',
131+
FMT_MAP = 'm'
131132
} tnt_format_t;
132133

133134
typedef enum {

xstnt/xstnt16.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,10 @@ static inline tnt_format_t parse_format_string(const char *str, uint32_t str_len
12811281
return FMT_ARRAY;
12821282
}
12831283
else
1284+
if (str_len == 3 && strncasecmp(str, "map", 3) == 0) {
1285+
return FMT_MAP;
1286+
}
1287+
else
12841288
if (str_len == 6 && strncasecmp(str, "scalar", 6) == 0) {
12851289
return FMT_SCALAR;
12861290
}

0 commit comments

Comments
 (0)