pg 1.2.3 → 1.3.5
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 +86 -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 +153 -7
- data/Manifest.txt +0 -1
- data/README.rdoc +7 -6
- data/Rakefile +27 -138
- data/Rakefile.cross +8 -5
- data/certs/ged.pem +24 -0
- data/certs/larskanis-2022.pem +26 -0
- data/ext/errorcodes.def +8 -0
- data/ext/errorcodes.rb +0 -0
- data/ext/errorcodes.txt +3 -1
- data/ext/extconf.rb +131 -25
- data/ext/gvl_wrappers.c +4 -0
- data/ext/gvl_wrappers.h +23 -0
- data/ext/pg.c +59 -4
- data/ext/pg.h +19 -1
- data/ext/pg_coder.c +82 -28
- data/ext/pg_connection.c +680 -508
- data/ext/pg_copy_coder.c +45 -16
- data/ext/pg_record_coder.c +45 -15
- data/ext/pg_result.c +77 -40
- data/ext/pg_text_decoder.c +1 -1
- data/ext/pg_text_encoder.c +6 -6
- data/ext/pg_tuple.c +49 -29
- data/ext/pg_type_map.c +41 -8
- data/ext/pg_type_map_all_strings.c +15 -1
- data/ext/pg_type_map_by_class.c +49 -24
- data/ext/pg_type_map_by_column.c +66 -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/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 +301 -0
- data/lib/pg/coder.rb +1 -1
- data/lib/pg/connection.rb +589 -58
- data/lib/pg/version.rb +4 -0
- data/lib/pg.rb +47 -32
- 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/rakelib/task_extension.rb +46 -0
- data/sample/array_insert.rb +20 -0
- data/sample/async_api.rb +102 -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 +87 -224
- metadata.gz.sig +0 -0
- data/ChangeLog +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_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 );
|