sequel_pg 1.14.0 → 1.15.0
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/CHANGELOG +10 -0
- data/README.rdoc +0 -14
- data/ext/sequel_pg/sequel_pg.c +63 -5
- data/lib/sequel/extensions/pg_streaming.rb +13 -2
- data/lib/sequel_pg/sequel_pg.rb +3 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41aa757cb6f4ca6f56ca26044517a47a68731dd7d51335451f6da2e5b5b34d6f
|
4
|
+
data.tar.gz: ec43d49fd7b4b8821ecbb813f6244aaf46f69866e84b94df96a3c52ef3a6fd41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a2578bec8fed224dcd3c1263cb86a4729cf11318f80d6cdb03366ae7dae6e68995447db06a1105d1ecda50222d2ff6258079fb7395d3f262094e1e05502fd48
|
7
|
+
data.tar.gz: 26a470d0e7d8290cade76b07cecd972be840c838492607a5649c0fd803de2ca7ea2e34b0c77fddcaff734a2a875b1f26ce8d5b03ec0fe0ab887ae3045ffa10e0
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.15.0 (2022-03-16)
|
2
|
+
|
3
|
+
* Avoid deprecation warning in the pg_streaming extension on pg 1.3+ when streaming a query with bound parameters (jeremyevans)
|
4
|
+
|
5
|
+
* Use pgresult_stream_any when using pg 1.3.4+ for faster streaming (jeremyevans)
|
6
|
+
|
7
|
+
* Do not use streaming by default for Dataset#paged_each in the pg_streaming extension (jeremyevans)
|
8
|
+
|
9
|
+
* Avoid verbose warning if loading sequel_pg after Sequel pg_array extension (jeremyevans)
|
10
|
+
|
1
11
|
=== 1.14.0 (2020-09-22)
|
2
12
|
|
3
13
|
* Reduce stack memory usage for result sets with 64 or fewer columns (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -112,20 +112,6 @@ requirements:
|
|
112
112
|
|
113
113
|
rake build
|
114
114
|
|
115
|
-
== Platforms Supported
|
116
|
-
|
117
|
-
sequel_pg has been tested on the following:
|
118
|
-
|
119
|
-
* ruby 1.9.3
|
120
|
-
* ruby 2.0
|
121
|
-
* ruby 2.1
|
122
|
-
* ruby 2.2
|
123
|
-
* ruby 2.3
|
124
|
-
* ruby 2.4
|
125
|
-
* ruby 2.5
|
126
|
-
* ruby 2.6
|
127
|
-
* ruby 2.7
|
128
|
-
|
129
115
|
== Known Issues
|
130
116
|
|
131
117
|
* You must be using the ISO PostgreSQL date format (which is the
|
data/ext/sequel_pg/sequel_pg.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#define SEQUEL_PG_VERSION_INTEGER
|
1
|
+
#define SEQUEL_PG_VERSION_INTEGER 11500
|
2
2
|
|
3
3
|
#include <string.h>
|
4
4
|
#include <stdio.h>
|
@@ -70,9 +70,11 @@
|
|
70
70
|
PGconn* pg_get_pgconn(VALUE);
|
71
71
|
PGresult* pgresult_get(VALUE);
|
72
72
|
int pg_get_result_enc_idx(VALUE);
|
73
|
+
VALUE pgresult_stream_any(VALUE self, void (*yielder)(VALUE, int, int, void*), void* data);
|
73
74
|
|
74
75
|
static int spg_use_ipaddr_alloc;
|
75
76
|
static int spg_use_pg_get_result_enc_idx;
|
77
|
+
static int spg_use_pg_stream_any;
|
76
78
|
|
77
79
|
static VALUE spg_Sequel;
|
78
80
|
static VALUE spg_PGArray;
|
@@ -532,7 +534,7 @@ static VALUE spg_timestamp(const char *s, VALUE self, size_t length, int tz) {
|
|
532
534
|
}
|
533
535
|
|
534
536
|
if (remaining < 19) {
|
535
|
-
return spg_timestamp_error(s, self, "unexpected
|
537
|
+
return spg_timestamp_error(s, self, "unexpected timestamp format, too short");
|
536
538
|
}
|
537
539
|
|
538
540
|
year = parse_year(&p, &remaining);
|
@@ -1659,6 +1661,38 @@ static VALUE spg_set_single_row_mode(VALUE self) {
|
|
1659
1661
|
return Qnil;
|
1660
1662
|
}
|
1661
1663
|
|
1664
|
+
struct spg__yield_each_row_stream_data {
|
1665
|
+
VALUE self;
|
1666
|
+
VALUE *colsyms;
|
1667
|
+
VALUE *colconvert;
|
1668
|
+
VALUE pg_value;
|
1669
|
+
int enc_index;
|
1670
|
+
char type;
|
1671
|
+
};
|
1672
|
+
|
1673
|
+
static void spg__yield_each_row_stream(VALUE rres, int ntuples, int nfields, void *rdata) {
|
1674
|
+
struct spg__yield_each_row_stream_data* data = (struct spg__yield_each_row_stream_data *)rdata;
|
1675
|
+
VALUE h = rb_hash_new();
|
1676
|
+
VALUE self = data->self;
|
1677
|
+
VALUE *colsyms = data->colsyms;
|
1678
|
+
VALUE *colconvert= data->colconvert;
|
1679
|
+
PGresult *res = pgresult_get(rres);
|
1680
|
+
int enc_index = data->enc_index;
|
1681
|
+
long j;
|
1682
|
+
|
1683
|
+
for(j=0; j<nfields; j++) {
|
1684
|
+
rb_hash_aset(h, colsyms[j], spg__col_value(self, res, 0, j, colconvert , enc_index));
|
1685
|
+
}
|
1686
|
+
|
1687
|
+
if(data->type == SPG_YIELD_MODEL) {
|
1688
|
+
VALUE model = rb_obj_alloc(data->pg_value);
|
1689
|
+
rb_ivar_set(model, spg_id_values, h);
|
1690
|
+
rb_yield(model);
|
1691
|
+
} else {
|
1692
|
+
rb_yield(h);
|
1693
|
+
}
|
1694
|
+
}
|
1695
|
+
|
1662
1696
|
static VALUE spg__yield_each_row_internal(VALUE self, VALUE rconn, VALUE rres, PGresult *res, int enc_index, VALUE *colsyms, VALUE *colconvert) {
|
1663
1697
|
long nfields;
|
1664
1698
|
long j;
|
@@ -1667,6 +1701,7 @@ static VALUE spg__yield_each_row_internal(VALUE self, VALUE rconn, VALUE rres, P
|
|
1667
1701
|
VALUE pg_type;
|
1668
1702
|
VALUE pg_value = Qnil;
|
1669
1703
|
char type = SPG_YIELD_NORMAL;
|
1704
|
+
struct spg__yield_each_row_stream_data data;
|
1670
1705
|
|
1671
1706
|
nfields = PQnfields(res);
|
1672
1707
|
|
@@ -1684,6 +1719,18 @@ static VALUE spg__yield_each_row_internal(VALUE self, VALUE rconn, VALUE rres, P
|
|
1684
1719
|
|
1685
1720
|
spg_set_column_info(self, res, colsyms, colconvert, enc_index);
|
1686
1721
|
|
1722
|
+
if (spg_use_pg_stream_any) {
|
1723
|
+
data.self = self;
|
1724
|
+
data.colsyms = colsyms;
|
1725
|
+
data.colconvert = colconvert;
|
1726
|
+
data.pg_value = pg_value;
|
1727
|
+
data.enc_index = enc_index;
|
1728
|
+
data.type = type;
|
1729
|
+
|
1730
|
+
pgresult_stream_any(rres, spg__yield_each_row_stream, &data);
|
1731
|
+
return self;
|
1732
|
+
}
|
1733
|
+
|
1687
1734
|
while (PQntuples(res) != 0) {
|
1688
1735
|
h = rb_hash_new();
|
1689
1736
|
for(j=0; j<nfields; j++) {
|
@@ -1809,10 +1856,21 @@ void Init_sequel_pg(void) {
|
|
1809
1856
|
}
|
1810
1857
|
}
|
1811
1858
|
|
1812
|
-
|
1813
|
-
|
1859
|
+
c = rb_eval_string("defined?(PG::VERSION) && PG::VERSION.split('.').map(&:to_i)");
|
1860
|
+
if (RB_TYPE_P(c, T_ARRAY) && RARRAY_LEN(c) >= 3) {
|
1861
|
+
if (FIX2INT(RARRAY_AREF(c, 0)) > 1) {
|
1862
|
+
spg_use_pg_get_result_enc_idx = 1;
|
1863
|
+
spg_use_pg_stream_any = 1;
|
1864
|
+
} else if (FIX2INT(RARRAY_AREF(c, 0)) == 1) {
|
1865
|
+
if (FIX2INT(RARRAY_AREF(c, 1)) >= 2) {
|
1866
|
+
spg_use_pg_get_result_enc_idx = 1;
|
1867
|
+
}
|
1868
|
+
if (FIX2INT(RARRAY_AREF(c, 1)) > 3 || (FIX2INT(RARRAY_AREF(c, 1)) == 3 && FIX2INT(RARRAY_AREF(c, 2)) >= 4)) {
|
1869
|
+
spg_use_pg_stream_any = 1;
|
1870
|
+
}
|
1871
|
+
}
|
1814
1872
|
}
|
1815
|
-
|
1873
|
+
|
1816
1874
|
rb_const_set(spg_Postgres, rb_intern("SEQUEL_PG_VERSION_INTEGER"), INT2FIX(SEQUEL_PG_VERSION_INTEGER));
|
1817
1875
|
|
1818
1876
|
spg_id_BigDecimal = rb_intern("BigDecimal");
|
@@ -73,12 +73,18 @@ module Sequel::Postgres::Streaming
|
|
73
73
|
|
74
74
|
private
|
75
75
|
|
76
|
+
unless Sequel::Postgres::Adapter.method_defined?(:send_query_params)
|
77
|
+
def send_query_params(*args)
|
78
|
+
send_query(*args)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
76
82
|
if Sequel::Database.instance_methods.map(&:to_s).include?('log_connection_yield')
|
77
83
|
# If using single row mode, send the query instead of executing it.
|
78
84
|
def execute_query(sql, args)
|
79
85
|
if @single_row_mode
|
80
86
|
@single_row_mode = false
|
81
|
-
@db.log_connection_yield(sql, self, args){args ?
|
87
|
+
@db.log_connection_yield(sql, self, args){args ? send_query_params(sql, args) : send_query(sql)}
|
82
88
|
set_single_row_mode
|
83
89
|
block
|
84
90
|
self
|
@@ -122,7 +128,12 @@ module Sequel::Postgres::Streaming
|
|
122
128
|
unless block_given?
|
123
129
|
return enum_for(:paged_each, opts)
|
124
130
|
end
|
125
|
-
|
131
|
+
|
132
|
+
if stream_results?
|
133
|
+
each(&block)
|
134
|
+
else
|
135
|
+
super
|
136
|
+
end
|
126
137
|
end
|
127
138
|
|
128
139
|
# Return a clone of the dataset that will use streaming to load
|
data/lib/sequel_pg/sequel_pg.rb
CHANGED
@@ -120,6 +120,9 @@ if defined?(Sequel::Postgres::PGArray)
|
|
120
120
|
# pg_array extension previously loaded
|
121
121
|
|
122
122
|
class Sequel::Postgres::PGArray::Creator
|
123
|
+
# Avoid method redefined verbose warning
|
124
|
+
alias call call if method_defined?(:call)
|
125
|
+
|
123
126
|
# Override Creator to use sequel_pg's C-based parser instead of the pure ruby parser.
|
124
127
|
def call(string)
|
125
128
|
Sequel::Postgres::PGArray.new(Sequel::Postgres.parse_pg_array(string, @converter), @type)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_pg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
rubygems_version: 3.
|
104
|
+
rubygems_version: 3.3.7
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Faster SELECTs when using Sequel with pg
|