sereal 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/rsrl +1 -1
- data/ext/sereal/buffer.h +11 -4
- data/ext/sereal/decode.c +2 -4
- data/ext/sereal/encode.c +36 -2
- data/ext/sereal/sereal.c +15 -1
- data/ext/sereal/sereal.h +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8247824a3c96a8a8a0ef7a190fed6d8517ba85dc
|
4
|
+
data.tar.gz: 6e8edec6c3143ecd94fb22d6c96bb33664fd706b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a09768f1a182fa25eaae541c8af2e8396910eaccd1e9e08d313d7b5b98fe6aa098cd95de0c4dd88061683135b91a9c273f32489f8ab941cac2b74f4e0e1763cf
|
7
|
+
data.tar.gz: 611c0cb5a659adf051a0478bd9c621d2cc325d404db686e989217f6a9a755e2495e3697ff6b4f0999e6b38f9b8a5642f83842b6d456609647422ef48a53b15bc
|
data/bin/rsrl
CHANGED
data/ext/sereal/buffer.h
CHANGED
@@ -10,16 +10,22 @@ static inline void s_free_data_if_not_mine(sereal_t *s) {
|
|
10
10
|
}
|
11
11
|
}
|
12
12
|
|
13
|
+
static inline void s_init_tracker(sereal_t *s) {
|
14
|
+
if (s->tracked == Qnil) {
|
15
|
+
s->tracked = rb_hash_new();
|
16
|
+
rb_gc_mark(s->tracked);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
13
20
|
static inline void s_reset_tracker(sereal_t *s) {
|
14
|
-
if (s->tracked != Qnil)
|
15
|
-
|
16
|
-
|
21
|
+
if (s->tracked != Qnil) {
|
22
|
+
rb_hash_clear(s->tracked);
|
23
|
+
}
|
17
24
|
}
|
18
25
|
|
19
26
|
static inline void s_destroy(sereal_t *s) {
|
20
27
|
if (!s)
|
21
28
|
return;
|
22
|
-
|
23
29
|
s_reset_tracker(s);
|
24
30
|
s_free_data_if_not_mine(s);
|
25
31
|
free(s);
|
@@ -31,6 +37,7 @@ static inline void *s_realloc_or_raise(sereal_t *s, void *p, u32 n) {
|
|
31
37
|
s_raise(s,rb_eNoMemError,"memory allocation failure for %d bytes",n);
|
32
38
|
return buf;
|
33
39
|
}
|
40
|
+
|
34
41
|
static inline void *s_alloc_or_raise(sereal_t *s,u32 n) {
|
35
42
|
return s_realloc_or_raise(s,NULL,n);
|
36
43
|
}
|
data/ext/sereal/decode.c
CHANGED
@@ -205,10 +205,7 @@ VALUE sereal_to_rb_object(sereal_t *s) {
|
|
205
205
|
|
206
206
|
VALUE decoded = (*READERS[t])(s,t);
|
207
207
|
if (tracked) {
|
208
|
-
|
209
|
-
s->tracked = rb_hash_new();
|
210
|
-
rb_gc_register_address(&s->tracked);
|
211
|
-
}
|
208
|
+
s_init_tracker(s);
|
212
209
|
rb_hash_aset(s->tracked,INT2FIX(pos),decoded);
|
213
210
|
}
|
214
211
|
return decoded;
|
@@ -225,6 +222,7 @@ VALUE method_sereal_decode(VALUE self, VALUE args) {
|
|
225
222
|
u8 have_block = rb_block_given_p();
|
226
223
|
sereal_t *s = s_create();
|
227
224
|
u64 offset = 0;
|
225
|
+
|
228
226
|
if (TYPE(payload) == T_FILE) {
|
229
227
|
if (!have_block)
|
230
228
|
s_raise(s,rb_eTypeError,"block is required when reading from a stream")
|
data/ext/sereal/encode.c
CHANGED
@@ -216,10 +216,38 @@ static void s_append_nil(sereal_t *s, VALUE object) {
|
|
216
216
|
s_append_u8(s,SRL_HDR_UNDEF);
|
217
217
|
}
|
218
218
|
|
219
|
+
static void s_append_refp(sereal_t *s, VALUE object) {
|
220
|
+
u32 pos = FIX2LONG(object);
|
221
|
+
s_append_hdr_with_varint(s,SRL_HDR_REFP,pos - s->hdr_end + 1);
|
222
|
+
u8 *reference = s_get_p_at_pos(s,pos,0);
|
223
|
+
*reference |= SRL_HDR_TRACK_FLAG;
|
224
|
+
}
|
225
|
+
|
219
226
|
/* writer function pointers */
|
220
227
|
static void rb_object_to_sereal(sereal_t *s, VALUE object) {
|
221
228
|
S_RECURSE_INC(s);
|
229
|
+
u32 pos = s->pos;
|
230
|
+
|
231
|
+
if (s->tracked != Qnil &&
|
232
|
+
TYPE(object) == T_ARRAY ||
|
233
|
+
TYPE(object) == T_HASH ||
|
234
|
+
TYPE(object) == T_SYMBOL ||
|
235
|
+
TYPE(object) == T_STRING) {
|
236
|
+
|
237
|
+
if (s->tracked != Qnil) {
|
238
|
+
VALUE id = rb_obj_id(object);
|
239
|
+
VALUE stored_position = rb_hash_aref(s->tracked,id);
|
240
|
+
if (stored_position != Qnil) {
|
241
|
+
s_append_refp(s,stored_position);
|
242
|
+
goto out;
|
243
|
+
} else {
|
244
|
+
rb_hash_aset(s->tracked,id,INT2FIX(pos));
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
|
222
249
|
(*WRITER[TYPE(object)])(s,object);
|
250
|
+
out:
|
223
251
|
S_RECURSE_DEC(s);
|
224
252
|
}
|
225
253
|
|
@@ -249,6 +277,7 @@ VALUE method_sereal_encode(VALUE self, VALUE args) {
|
|
249
277
|
VALUE compress = Qfalse;
|
250
278
|
if (argc == 2)
|
251
279
|
compress = rb_ary_shift(args);
|
280
|
+
|
252
281
|
u8 do_compress;
|
253
282
|
u8 version = SRL_PROTOCOL_VERSION;
|
254
283
|
|
@@ -257,7 +286,10 @@ VALUE method_sereal_encode(VALUE self, VALUE args) {
|
|
257
286
|
} else {
|
258
287
|
do_compress = (compress == Qtrue ? 1 : 0);
|
259
288
|
}
|
260
|
-
|
289
|
+
if (do_compress & __REF) {
|
290
|
+
do_compress &= ~__REF;
|
291
|
+
s_init_tracker(s);
|
292
|
+
}
|
261
293
|
switch(do_compress) {
|
262
294
|
case __SNAPPY:
|
263
295
|
version |= SRL_PROTOCOL_ENCODING_SNAPPY;
|
@@ -269,6 +301,7 @@ VALUE method_sereal_encode(VALUE self, VALUE args) {
|
|
269
301
|
default:
|
270
302
|
version |= SRL_PROTOCOL_ENCODING_RAW;
|
271
303
|
}
|
304
|
+
|
272
305
|
// setup header
|
273
306
|
s_append_u32(s,SRL_MAGIC_STRING_LILIPUTIAN);
|
274
307
|
s_append_u8(s,version);
|
@@ -276,6 +309,7 @@ VALUE method_sereal_encode(VALUE self, VALUE args) {
|
|
276
309
|
u32 s_header_len = s->pos;
|
277
310
|
|
278
311
|
// serialize
|
312
|
+
s->hdr_end = s->pos;
|
279
313
|
rb_object_to_sereal(s,payload);
|
280
314
|
|
281
315
|
// compress
|
@@ -311,7 +345,7 @@ VALUE method_sereal_encode(VALUE self, VALUE args) {
|
|
311
345
|
compressed + s_header_len + un_compressed_len_varint,
|
312
346
|
compressed_len_varint);
|
313
347
|
|
314
|
-
u8 *start = s_get_p_at_pos(s,s_header_len,
|
348
|
+
u8 *start = s_get_p_at_pos(s,s_header_len,0);
|
315
349
|
u8 *working_buf = s_alloc_or_raise(s,CSNAPPY_WORKMEM_BYTES);
|
316
350
|
csnappy_compress(start,
|
317
351
|
s_body_len,
|
data/ext/sereal/sereal.c
CHANGED
@@ -15,6 +15,20 @@ void Init_sereal();
|
|
15
15
|
* SNAPPY_INCR encoded objects can be appended into one output and then the
|
16
16
|
* decoder will know what to do.
|
17
17
|
*
|
18
|
+
* Sereal.encode(object,Sereal::REF)
|
19
|
+
* or Sereal::REF|Sereal::SNAPPY_INC, or Sereal::REF|Sereal::SNAPPY
|
20
|
+
*
|
21
|
+
* when encoding will try to use Sereal's REFP tag to transmit only the
|
22
|
+
* the original object's offset in the packet.
|
23
|
+
* So:
|
24
|
+
* one = [ 1,2,3,4,5 ]
|
25
|
+
* two = [ one, one ]
|
26
|
+
* Sereal.encode(two,Sereal::REF)
|
27
|
+
* will send 'one' only once, and one REFP that points to the first one
|
28
|
+
* it uses one.object_id as a hash key in a local tracker hash
|
29
|
+
* and if it sees this object_id again it just sends the offset.
|
30
|
+
*
|
31
|
+
*
|
18
32
|
* Sereal.decode(blob) - returns the decoded object
|
19
33
|
*
|
20
34
|
* If the blob contains multiple compressed
|
@@ -41,7 +55,6 @@ void Init_sereal();
|
|
41
55
|
* end
|
42
56
|
*
|
43
57
|
*/
|
44
|
-
|
45
58
|
void Init_sereal() {
|
46
59
|
Sereal = rb_define_class("Sereal", rb_cObject);
|
47
60
|
rb_define_singleton_method(Sereal, "encode", method_sereal_encode, -2);
|
@@ -49,6 +62,7 @@ void Init_sereal() {
|
|
49
62
|
rb_define_const(Sereal, "SNAPPY",INT2NUM(__SNAPPY));
|
50
63
|
rb_define_const(Sereal, "SNAPPY_INCR",INT2NUM(__SNAPPY_INCR));
|
51
64
|
rb_define_const(Sereal, "RAW",INT2NUM(__RAW));
|
65
|
+
rb_define_const(Sereal, "REF",INT2NUM(__REF));
|
52
66
|
s_init_writers();
|
53
67
|
}
|
54
68
|
|
data/ext/sereal/sereal.h
CHANGED
@@ -53,6 +53,7 @@ do { \
|
|
53
53
|
|
54
54
|
#define FLAG_NOT_MINE 1
|
55
55
|
#define FLAG_STREAM 2
|
56
|
+
#define FLAG_REF 4
|
56
57
|
struct _sereal {
|
57
58
|
u8 *data;
|
58
59
|
u32 size;
|
@@ -92,5 +93,6 @@ VALUE method_sereal_decode(VALUE self, VALUE payload);
|
|
92
93
|
#define __RAW 0
|
93
94
|
#define __SNAPPY 1
|
94
95
|
#define __SNAPPY_INCR 2
|
96
|
+
#define __REF 4
|
95
97
|
#define __MIN_SIZE 6
|
96
98
|
#endif
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sereal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Borislav Nikolov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|