pg 1.2.3-x86-mingw32 → 1.3.0.rc1-x86-mingw32
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
- checksums.yaml.gz.sig +0 -0
- data/.appveyor.yml +36 -0
- data/.gems +6 -0
- data/.github/workflows/binary-gems.yml +80 -0
- data/.github/workflows/source-gem.yml +129 -0
- data/.gitignore +13 -0
- data/.hgsigs +34 -0
- data/.hgtags +41 -0
- data/.irbrc +23 -0
- data/.pryrc +23 -0
- data/.tm_properties +21 -0
- data/.travis.yml +49 -0
- data/Gemfile +14 -0
- data/History.rdoc +75 -7
- data/Manifest.txt +0 -1
- data/README.rdoc +7 -6
- data/Rakefile +27 -138
- data/Rakefile.cross +5 -5
- data/certs/ged.pem +24 -0
- data/ext/errorcodes.def +8 -0
- data/ext/errorcodes.txt +3 -1
- data/ext/extconf.rb +90 -19
- data/ext/gvl_wrappers.c +4 -0
- data/ext/gvl_wrappers.h +23 -0
- data/ext/pg.c +35 -1
- data/ext/pg.h +18 -1
- data/ext/pg_coder.c +82 -28
- data/ext/pg_connection.c +538 -279
- data/ext/pg_copy_coder.c +45 -16
- data/ext/pg_record_coder.c +38 -10
- data/ext/pg_result.c +61 -31
- data/ext/pg_text_decoder.c +1 -1
- data/ext/pg_text_encoder.c +6 -6
- data/ext/pg_tuple.c +47 -21
- data/ext/pg_type_map.c +41 -8
- data/ext/pg_type_map_all_strings.c +14 -1
- data/ext/pg_type_map_by_class.c +49 -24
- data/ext/pg_type_map_by_column.c +64 -28
- data/ext/pg_type_map_by_mri_type.c +47 -18
- data/ext/pg_type_map_by_oid.c +52 -23
- data/ext/pg_type_map_in_ruby.c +50 -19
- data/ext/pg_util.c +2 -2
- data/lib/2.5/pg_ext.so +0 -0
- data/lib/2.6/pg_ext.so +0 -0
- data/lib/2.7/pg_ext.so +0 -0
- data/lib/3.0/pg_ext.so +0 -0
- data/lib/pg/basic_type_map_based_on_result.rb +47 -0
- data/lib/pg/basic_type_map_for_queries.rb +193 -0
- data/lib/pg/basic_type_map_for_results.rb +81 -0
- data/lib/pg/basic_type_registry.rb +296 -0
- data/lib/pg/coder.rb +1 -1
- data/lib/pg/connection.rb +369 -56
- data/lib/pg/version.rb +4 -0
- data/lib/pg.rb +38 -25
- data/lib/x86-mingw32/libpq.dll +0 -0
- data/misc/openssl-pg-segfault.rb +31 -0
- data/misc/postgres/History.txt +9 -0
- data/misc/postgres/Manifest.txt +5 -0
- data/misc/postgres/README.txt +21 -0
- data/misc/postgres/Rakefile +21 -0
- data/misc/postgres/lib/postgres.rb +16 -0
- data/misc/ruby-pg/History.txt +9 -0
- data/misc/ruby-pg/Manifest.txt +5 -0
- data/misc/ruby-pg/README.txt +21 -0
- data/misc/ruby-pg/Rakefile +21 -0
- data/misc/ruby-pg/lib/ruby/pg.rb +16 -0
- data/pg.gemspec +32 -0
- data/sample/array_insert.rb +20 -0
- data/sample/async_api.rb +106 -0
- data/sample/async_copyto.rb +39 -0
- data/sample/async_mixed.rb +56 -0
- data/sample/check_conn.rb +21 -0
- data/sample/copydata.rb +71 -0
- data/sample/copyfrom.rb +81 -0
- data/sample/copyto.rb +19 -0
- data/sample/cursor.rb +21 -0
- data/sample/disk_usage_report.rb +177 -0
- data/sample/issue-119.rb +94 -0
- data/sample/losample.rb +69 -0
- data/sample/minimal-testcase.rb +17 -0
- data/sample/notify_wait.rb +72 -0
- data/sample/pg_statistics.rb +285 -0
- data/sample/replication_monitor.rb +222 -0
- data/sample/test_binary_values.rb +33 -0
- data/sample/wal_shipper.rb +434 -0
- data/sample/warehouse_partitions.rb +311 -0
- data.tar.gz.sig +0 -0
- metadata +81 -230
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -0
- data/lib/2.2/pg_ext.so +0 -0
- data/lib/2.3/pg_ext.so +0 -0
- data/lib/2.4/pg_ext.so +0 -0
- data/lib/pg/basic_type_mapping.rb +0 -522
- data/spec/data/expected_trace.out +0 -26
- data/spec/data/random_binary_data +0 -0
- data/spec/helpers.rb +0 -380
- data/spec/pg/basic_type_mapping_spec.rb +0 -630
- data/spec/pg/connection_spec.rb +0 -1949
- data/spec/pg/connection_sync_spec.rb +0 -41
- data/spec/pg/result_spec.rb +0 -681
- data/spec/pg/tuple_spec.rb +0 -333
- data/spec/pg/type_map_by_class_spec.rb +0 -138
- data/spec/pg/type_map_by_column_spec.rb +0 -226
- data/spec/pg/type_map_by_mri_type_spec.rb +0 -136
- data/spec/pg/type_map_by_oid_spec.rb +0 -149
- data/spec/pg/type_map_in_ruby_spec.rb +0 -164
- data/spec/pg/type_map_spec.rb +0 -22
- data/spec/pg/type_spec.rb +0 -1123
- data/spec/pg_spec.rb +0 -50
data/ext/pg.h
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
#include <sys/types.h>
|
12
12
|
#if !defined(_WIN32)
|
13
13
|
# include <sys/time.h>
|
14
|
+
# include <sys/socket.h>
|
14
15
|
#endif
|
15
16
|
#if defined(HAVE_UNISTD_H) && !defined(_WIN32)
|
16
17
|
# include <unistd.h>
|
@@ -78,6 +79,15 @@ typedef long suseconds_t;
|
|
78
79
|
#define RARRAY_AREF(a, i) (RARRAY_PTR(a)[i])
|
79
80
|
#endif
|
80
81
|
|
82
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
83
|
+
#define pg_compact_callback(x) (x)
|
84
|
+
#define pg_gc_location(x) x = rb_gc_location(x)
|
85
|
+
#else
|
86
|
+
#define rb_gc_mark_movable(x) rb_gc_mark(x)
|
87
|
+
#define pg_compact_callback(x) {(x)}
|
88
|
+
#define pg_gc_location(x) UNUSED(x)
|
89
|
+
#endif
|
90
|
+
|
81
91
|
#define PG_ENC_IDX_BITS 28
|
82
92
|
|
83
93
|
/* The data behind each PG::Connection object */
|
@@ -104,6 +114,8 @@ typedef struct {
|
|
104
114
|
int enc_idx : PG_ENC_IDX_BITS;
|
105
115
|
/* flags controlling Symbol/String field names */
|
106
116
|
unsigned int flags : 2;
|
117
|
+
/* enable automatic flushing of send data at the end of send_query calls */
|
118
|
+
unsigned int flush_data : 1;
|
107
119
|
|
108
120
|
#if defined(_WIN32)
|
109
121
|
/* File descriptor to be used for rb_w32_unwrap_io_handle() */
|
@@ -220,6 +232,8 @@ typedef struct {
|
|
220
232
|
} convs[0];
|
221
233
|
} t_tmbc;
|
222
234
|
|
235
|
+
extern const rb_data_type_t pg_typemap_type;
|
236
|
+
extern const rb_data_type_t pg_coder_type;
|
223
237
|
|
224
238
|
#include "gvl_wrappers.h"
|
225
239
|
|
@@ -304,7 +318,7 @@ VALUE pg_obj_to_i _(( VALUE ));
|
|
304
318
|
VALUE pg_tmbc_allocate _(( void ));
|
305
319
|
void pg_coder_init_encoder _(( VALUE ));
|
306
320
|
void pg_coder_init_decoder _(( VALUE ));
|
307
|
-
void
|
321
|
+
void pg_coder_compact _(( void * ));
|
308
322
|
char *pg_rb_str_ensure_capa _(( VALUE, long, char *, char ** ));
|
309
323
|
|
310
324
|
#define PG_RB_STR_ENSURE_CAPA( str, expand_len, curr_ptr, end_ptr ) \
|
@@ -324,6 +338,9 @@ int pg_typemap_fit_to_copy_get _(( VALUE ));
|
|
324
338
|
VALUE pg_typemap_result_value _(( t_typemap *, VALUE, int, int ));
|
325
339
|
t_pg_coder *pg_typemap_typecast_query_param _(( t_typemap *, VALUE, int ));
|
326
340
|
VALUE pg_typemap_typecast_copy_get _(( t_typemap *, VALUE, int, int, int ));
|
341
|
+
void pg_typemap_mark _(( void * ));
|
342
|
+
size_t pg_typemap_memsize _(( const void * ));
|
343
|
+
void pg_typemap_compact _(( void * ));
|
327
344
|
|
328
345
|
PGconn *pg_get_pgconn _(( VALUE ));
|
329
346
|
t_pg_connection *pg_get_connection _(( VALUE ));
|
data/ext/pg_coder.c
CHANGED
@@ -26,11 +26,11 @@ pg_coder_allocate( VALUE klass )
|
|
26
26
|
void
|
27
27
|
pg_coder_init_encoder( VALUE self )
|
28
28
|
{
|
29
|
-
t_pg_coder *this =
|
29
|
+
t_pg_coder *this = RTYPEDDATA_DATA( self );
|
30
30
|
VALUE klass = rb_class_of(self);
|
31
31
|
if( rb_const_defined( klass, s_id_CFUNC ) ){
|
32
32
|
VALUE cfunc = rb_const_get( klass, s_id_CFUNC );
|
33
|
-
this->enc_func =
|
33
|
+
this->enc_func = RTYPEDDATA_DATA(cfunc);
|
34
34
|
} else {
|
35
35
|
this->enc_func = NULL;
|
36
36
|
}
|
@@ -45,12 +45,12 @@ pg_coder_init_encoder( VALUE self )
|
|
45
45
|
void
|
46
46
|
pg_coder_init_decoder( VALUE self )
|
47
47
|
{
|
48
|
-
t_pg_coder *this =
|
48
|
+
t_pg_coder *this = RTYPEDDATA_DATA( self );
|
49
49
|
VALUE klass = rb_class_of(self);
|
50
50
|
this->enc_func = NULL;
|
51
51
|
if( rb_const_defined( klass, s_id_CFUNC ) ){
|
52
52
|
VALUE cfunc = rb_const_get( klass, s_id_CFUNC );
|
53
|
-
this->dec_func =
|
53
|
+
this->dec_func = RTYPEDDATA_DATA(cfunc);
|
54
54
|
} else {
|
55
55
|
this->dec_func = NULL;
|
56
56
|
}
|
@@ -61,32 +61,74 @@ pg_coder_init_decoder( VALUE self )
|
|
61
61
|
rb_iv_set( self, "@name", Qnil );
|
62
62
|
}
|
63
63
|
|
64
|
+
static size_t
|
65
|
+
pg_coder_memsize(const void *_this)
|
66
|
+
{
|
67
|
+
const t_pg_coder *this = (const t_pg_coder *)_this;
|
68
|
+
return sizeof(*this);
|
69
|
+
}
|
70
|
+
|
71
|
+
static size_t
|
72
|
+
pg_composite_coder_memsize(const void *_this)
|
73
|
+
{
|
74
|
+
const t_pg_composite_coder *this = (const t_pg_composite_coder *)_this;
|
75
|
+
return sizeof(*this);
|
76
|
+
}
|
77
|
+
|
64
78
|
void
|
65
|
-
|
79
|
+
pg_coder_compact(void *_this)
|
66
80
|
{
|
67
|
-
|
81
|
+
t_pg_coder *this = (t_pg_coder *)_this;
|
82
|
+
pg_gc_location(this->coder_obj);
|
68
83
|
}
|
69
84
|
|
70
85
|
static void
|
71
|
-
|
86
|
+
pg_composite_coder_compact(void *_this)
|
72
87
|
{
|
73
|
-
|
88
|
+
t_pg_composite_coder *this = (t_pg_composite_coder *)_this;
|
89
|
+
pg_coder_compact(&this->comp);
|
74
90
|
}
|
75
91
|
|
92
|
+
const rb_data_type_t pg_coder_type = {
|
93
|
+
"PG::Coder",
|
94
|
+
{
|
95
|
+
(RUBY_DATA_FUNC) NULL,
|
96
|
+
RUBY_TYPED_DEFAULT_FREE,
|
97
|
+
pg_coder_memsize,
|
98
|
+
pg_compact_callback(pg_coder_compact),
|
99
|
+
},
|
100
|
+
0,
|
101
|
+
0,
|
102
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
103
|
+
};
|
104
|
+
|
76
105
|
static VALUE
|
77
106
|
pg_simple_encoder_allocate( VALUE klass )
|
78
107
|
{
|
79
108
|
t_pg_coder *this;
|
80
|
-
VALUE self =
|
109
|
+
VALUE self = TypedData_Make_Struct( klass, t_pg_coder, &pg_coder_type, this );
|
81
110
|
pg_coder_init_encoder( self );
|
82
111
|
return self;
|
83
112
|
}
|
84
113
|
|
114
|
+
static const rb_data_type_t pg_composite_coder_type = {
|
115
|
+
"PG::CompositeCoder",
|
116
|
+
{
|
117
|
+
(RUBY_DATA_FUNC) NULL,
|
118
|
+
RUBY_TYPED_DEFAULT_FREE,
|
119
|
+
pg_composite_coder_memsize,
|
120
|
+
pg_compact_callback(pg_composite_coder_compact),
|
121
|
+
},
|
122
|
+
&pg_coder_type,
|
123
|
+
0,
|
124
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
125
|
+
};
|
126
|
+
|
85
127
|
static VALUE
|
86
128
|
pg_composite_encoder_allocate( VALUE klass )
|
87
129
|
{
|
88
130
|
t_pg_composite_coder *this;
|
89
|
-
VALUE self =
|
131
|
+
VALUE self = TypedData_Make_Struct( klass, t_pg_composite_coder, &pg_composite_coder_type, this );
|
90
132
|
pg_coder_init_encoder( self );
|
91
133
|
this->elem = NULL;
|
92
134
|
this->needs_quotation = 1;
|
@@ -99,7 +141,7 @@ static VALUE
|
|
99
141
|
pg_simple_decoder_allocate( VALUE klass )
|
100
142
|
{
|
101
143
|
t_pg_coder *this;
|
102
|
-
VALUE self =
|
144
|
+
VALUE self = TypedData_Make_Struct( klass, t_pg_coder, &pg_coder_type, this );
|
103
145
|
pg_coder_init_decoder( self );
|
104
146
|
return self;
|
105
147
|
}
|
@@ -108,7 +150,7 @@ static VALUE
|
|
108
150
|
pg_composite_decoder_allocate( VALUE klass )
|
109
151
|
{
|
110
152
|
t_pg_composite_coder *this;
|
111
|
-
VALUE self =
|
153
|
+
VALUE self = TypedData_Make_Struct( klass, t_pg_composite_coder, &pg_composite_coder_type, this );
|
112
154
|
pg_coder_init_decoder( self );
|
113
155
|
this->elem = NULL;
|
114
156
|
this->needs_quotation = 1;
|
@@ -135,7 +177,7 @@ pg_coder_encode(int argc, VALUE *argv, VALUE self)
|
|
135
177
|
VALUE value;
|
136
178
|
int len, len2;
|
137
179
|
int enc_idx;
|
138
|
-
t_pg_coder *this =
|
180
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
139
181
|
|
140
182
|
if(argc < 1 || argc > 2){
|
141
183
|
rb_raise(rb_eArgError, "wrong number of arguments (%i for 1..2)", argc);
|
@@ -192,7 +234,7 @@ pg_coder_decode(int argc, VALUE *argv, VALUE self)
|
|
192
234
|
int tuple = -1;
|
193
235
|
int field = -1;
|
194
236
|
VALUE res;
|
195
|
-
t_pg_coder *this =
|
237
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
196
238
|
|
197
239
|
if(argc < 1 || argc > 3){
|
198
240
|
rb_raise(rb_eArgError, "wrong number of arguments (%i for 1..3)", argc);
|
@@ -213,7 +255,7 @@ pg_coder_decode(int argc, VALUE *argv, VALUE self)
|
|
213
255
|
rb_raise(rb_eRuntimeError, "no decoder function defined");
|
214
256
|
}
|
215
257
|
|
216
|
-
res = this->dec_func(this, val,
|
258
|
+
res = this->dec_func(this, val, RSTRING_LENINT(argv[0]), tuple, field, ENCODING_GET(argv[0]));
|
217
259
|
|
218
260
|
return res;
|
219
261
|
}
|
@@ -230,7 +272,7 @@ pg_coder_decode(int argc, VALUE *argv, VALUE self)
|
|
230
272
|
static VALUE
|
231
273
|
pg_coder_oid_set(VALUE self, VALUE oid)
|
232
274
|
{
|
233
|
-
t_pg_coder *this =
|
275
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
234
276
|
this->oid = NUM2UINT(oid);
|
235
277
|
return oid;
|
236
278
|
}
|
@@ -245,7 +287,7 @@ pg_coder_oid_set(VALUE self, VALUE oid)
|
|
245
287
|
static VALUE
|
246
288
|
pg_coder_oid_get(VALUE self)
|
247
289
|
{
|
248
|
-
t_pg_coder *this =
|
290
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
249
291
|
return UINT2NUM(this->oid);
|
250
292
|
}
|
251
293
|
|
@@ -261,7 +303,7 @@ pg_coder_oid_get(VALUE self)
|
|
261
303
|
static VALUE
|
262
304
|
pg_coder_format_set(VALUE self, VALUE format)
|
263
305
|
{
|
264
|
-
t_pg_coder *this =
|
306
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
265
307
|
this->format = NUM2INT(format);
|
266
308
|
return format;
|
267
309
|
}
|
@@ -276,7 +318,7 @@ pg_coder_format_set(VALUE self, VALUE format)
|
|
276
318
|
static VALUE
|
277
319
|
pg_coder_format_get(VALUE self)
|
278
320
|
{
|
279
|
-
t_pg_coder *this =
|
321
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
280
322
|
return INT2NUM(this->format);
|
281
323
|
}
|
282
324
|
|
@@ -292,7 +334,7 @@ pg_coder_format_get(VALUE self)
|
|
292
334
|
static VALUE
|
293
335
|
pg_coder_flags_set(VALUE self, VALUE flags)
|
294
336
|
{
|
295
|
-
t_pg_coder *this =
|
337
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
296
338
|
this->flags = NUM2INT(flags);
|
297
339
|
return flags;
|
298
340
|
}
|
@@ -306,7 +348,7 @@ pg_coder_flags_set(VALUE self, VALUE flags)
|
|
306
348
|
static VALUE
|
307
349
|
pg_coder_flags_get(VALUE self)
|
308
350
|
{
|
309
|
-
t_pg_coder *this =
|
351
|
+
t_pg_coder *this = RTYPEDDATA_DATA(self);
|
310
352
|
return INT2NUM(this->flags);
|
311
353
|
}
|
312
354
|
|
@@ -323,7 +365,7 @@ pg_coder_flags_get(VALUE self)
|
|
323
365
|
static VALUE
|
324
366
|
pg_coder_needs_quotation_set(VALUE self, VALUE needs_quotation)
|
325
367
|
{
|
326
|
-
t_pg_composite_coder *this =
|
368
|
+
t_pg_composite_coder *this = RTYPEDDATA_DATA(self);
|
327
369
|
this->needs_quotation = RTEST(needs_quotation);
|
328
370
|
return needs_quotation;
|
329
371
|
}
|
@@ -338,7 +380,7 @@ pg_coder_needs_quotation_set(VALUE self, VALUE needs_quotation)
|
|
338
380
|
static VALUE
|
339
381
|
pg_coder_needs_quotation_get(VALUE self)
|
340
382
|
{
|
341
|
-
t_pg_composite_coder *this =
|
383
|
+
t_pg_composite_coder *this = RTYPEDDATA_DATA(self);
|
342
384
|
return this->needs_quotation ? Qtrue : Qfalse;
|
343
385
|
}
|
344
386
|
|
@@ -353,7 +395,7 @@ pg_coder_needs_quotation_get(VALUE self)
|
|
353
395
|
static VALUE
|
354
396
|
pg_coder_delimiter_set(VALUE self, VALUE delimiter)
|
355
397
|
{
|
356
|
-
t_pg_composite_coder *this =
|
398
|
+
t_pg_composite_coder *this = RTYPEDDATA_DATA(self);
|
357
399
|
StringValue(delimiter);
|
358
400
|
if(RSTRING_LEN(delimiter) != 1)
|
359
401
|
rb_raise( rb_eArgError, "delimiter size must be one byte");
|
@@ -370,7 +412,7 @@ pg_coder_delimiter_set(VALUE self, VALUE delimiter)
|
|
370
412
|
static VALUE
|
371
413
|
pg_coder_delimiter_get(VALUE self)
|
372
414
|
{
|
373
|
-
t_pg_composite_coder *this =
|
415
|
+
t_pg_composite_coder *this = RTYPEDDATA_DATA(self);
|
374
416
|
return rb_str_new(&this->delimiter, 1);
|
375
417
|
}
|
376
418
|
|
@@ -386,12 +428,12 @@ pg_coder_delimiter_get(VALUE self)
|
|
386
428
|
static VALUE
|
387
429
|
pg_coder_elements_type_set(VALUE self, VALUE elem_type)
|
388
430
|
{
|
389
|
-
t_pg_composite_coder *this =
|
431
|
+
t_pg_composite_coder *this = RTYPEDDATA_DATA( self );
|
390
432
|
|
391
433
|
if ( NIL_P(elem_type) ){
|
392
434
|
this->elem = NULL;
|
393
435
|
} else if ( rb_obj_is_kind_of(elem_type, rb_cPG_Coder) ){
|
394
|
-
this->elem =
|
436
|
+
this->elem = RTYPEDDATA_DATA( elem_type );
|
395
437
|
} else {
|
396
438
|
rb_raise( rb_eTypeError, "wrong elements type %s (expected some kind of PG::Coder)",
|
397
439
|
rb_obj_classname( elem_type ) );
|
@@ -401,10 +443,22 @@ pg_coder_elements_type_set(VALUE self, VALUE elem_type)
|
|
401
443
|
return elem_type;
|
402
444
|
}
|
403
445
|
|
446
|
+
static const rb_data_type_t pg_coder_cfunc_type = {
|
447
|
+
"PG::Coder::CFUNC",
|
448
|
+
{
|
449
|
+
(RUBY_DATA_FUNC)NULL,
|
450
|
+
(RUBY_DATA_FUNC)NULL,
|
451
|
+
(size_t (*)(const void *))NULL,
|
452
|
+
},
|
453
|
+
0,
|
454
|
+
0,
|
455
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
456
|
+
};
|
457
|
+
|
404
458
|
void
|
405
459
|
pg_define_coder( const char *name, void *func, VALUE base_klass, VALUE nsp )
|
406
460
|
{
|
407
|
-
VALUE cfunc_obj =
|
461
|
+
VALUE cfunc_obj = TypedData_Wrap_Struct( rb_cObject, &pg_coder_cfunc_type, func );
|
408
462
|
VALUE coder_klass = rb_define_class_under( nsp, name, base_klass );
|
409
463
|
if( nsp==rb_mPG_BinaryEncoder || nsp==rb_mPG_BinaryDecoder )
|
410
464
|
rb_include_module( coder_klass, rb_mPG_BinaryFormatting );
|